如何想的数据存储,而不是数据库?如何想的数据存储,而不是数据库?(How to think in d

2019-05-13 17:00发布

作为一个例子,谷歌App Engine使用谷歌数据存储,而不是一个标准的数据库,来存储数据。 是否有人使用,而不是谷歌的数据库数据存储的任何提示? 看来我训练我的头脑去思考100%的对象关系直接映射到表结构,现在很难看到不同的东西。 我能理解一些谷歌数据存储(例如性能和分发数据的能力)的好处,但一些好的数据库功能被牺牲(如连接)。

有谁谁曾与谷歌数据存储或BigTable的工作有什么好的建议与他们合作?

Answer 1:

有比较“传统”的关系数据库时习惯有关App Engine数据存储两两件事:

  • 数据存储,使插入和更新之间没有什么区别。 当你调用放在()上的实体,该实体被存储到其独特的密钥数据存储,以及任何有钥匙被覆盖。 基本上,每个实体类型数据存储区中的作用就像一个巨大的地图或排序的列表。
  • 查询,因为你提到,是有限得多。 没有加入,一开始。

认识到事情的关键 - 后面这两个差异的原因 - 是的Bigtable基本上就像一个巨大的有序字典。 因此,放置操作只是设置为给定的键的值 - 而不管该键任何先前值,并且取操作仅限于单个获取密钥或密钥的连续范围。 更复杂的查询成为可能使用索引,这基本上只是自己的表,让您实现更加复杂的查询,对连续范围扫描。

一旦你已经吸收了这一点,你必须了解数据存储的能力和局限所需要的基本知识。 这可能看起来任意的限制可能更有意义。

这里的关键是,虽然这些都是在你可以在关系数据库中做什么限制,这些相同的限制是什么让它实用扩展到了那种Bigtable的设计处理规模的。 你根本无法执行排序的查询,看起来不错在纸面上,而是残暴在SQL数据库慢。

在如何改变你的代表数据而言,最重要的是预计算。 而不是做的加入在查询时,预先计算数据并将其存储在数据存储尽可能。 如果你想选择一个随机的记录,生成一个随机数,并将其与每个记录存储。 有这些种类的技巧和窍门的整个食谱这里编辑:菜谱是不再存在。



Answer 2:

我一直在进行有关心灵开关的方式是关于数据库完全忘记。

在关系数据库世界中,你永远不必担心数据的标准化和你的表结构。 抛弃这一切。 只是布局你的网页。 莱大家都出去了。 现在看看他们。 你已经有2/3。

如果您忘记了概念,即数据库的大小事务,数据不应该被重复的,那么你是3/4那里,你甚至都没有写任何代码! 让你的意见左右你的模型。 你不必把你的对象,使他们2维了,因为在关系世界。 现在,您可以存储与形状的物体。

是的,这是考验一个简单的解释,但它帮助我忘掉数据库,只是提出申请。 我做了迄今使用这一理念4个App Engine应用,有更多的惊喜。



Answer 3:

我总是暗笑当人们推出了 - 这不是关系。 我已经在Django书面cellectr,这里是我下面的模型的一个片段。 正如你所看到的,我有被管理或由用户执教联赛。 我可以从联盟得到所有的管理人员,或从给定用户,我可以回到联赛中,她的教练或经理。

只是因为没有具体的外键的支持,并不意味着你不能有关系数据库模型。

我的两个便士。


class League(BaseModel):
    name = db.StringProperty()    
    managers = db.ListProperty(db.Key) #all the users who can view/edit this league
    coaches = db.ListProperty(db.Key) #all the users who are able to view this league

    def get_managers(self):
        # This returns the models themselves, not just the keys that are stored in teams
        return UserPrefs.get(self.managers)

    def get_coaches(self):
        # This returns the models themselves, not just the keys that are stored in teams
        return UserPrefs.get(self.coaches)      

    def __str__(self):
        return self.name

    # Need to delete all the associated games, teams and players
    def delete(self):
        for player in self.leagues_players:
            player.delete()
        for game in self.leagues_games:
            game.delete()
        for team in self.leagues_teams:
            team.delete()            
        super(League, self).delete()

class UserPrefs(db.Model):
    user = db.UserProperty()
    league_ref = db.ReferenceProperty(reference_class=League,
                            collection_name='users') #league the users are managing

    def __str__(self):
        return self.user.nickname

    # many-to-many relationship, a user can coach many leagues, a league can be
    # coached by many users
    @property
    def managing(self):
        return League.gql('WHERE managers = :1', self.key())

    @property
    def coaching(self):
        return League.gql('WHERE coaches = :1', self.key())

    # remove all references to me when I'm deleted
    def delete(self):
        for manager in self.managing:
            manager.managers.remove(self.key())
            manager.put()
        for coach in self.managing:
            coach.coaches.remove(self.key())
            coaches.put()            
        super(UserPrefs, self).delete()    


Answer 4:

我从关系数据库世界进来,然后我发现这个数据存储的东西。 花了几天的时间来获得开窍了。 也有一些我发现的。

你一定已经知道,数据存储是建立按比例的是,从RDMBS分离它的东西。 与大型数据集的规模更好,应用程序引擎已经做了一些改变(指一些很大的改变)。

RDBMS VS数据存储
结构体
在数据库中,我们通常构建我们的数据表,这是在数据存储变得行种类和实体 。

关系
在RDBMS中,大多数人的folllows一到一,多到一,多对一一对多的关系,在数据存储中,因为它没有“联接”的事情,但我们仍然可以实现使用“ 的ReferenceProperty”我们的正常化例如一对一的关系例 。

索引
通常在RDMBS我们结交主键,外键,唯一键和索引键索引,以加快搜索并提高我们的数据库的性能。 在数据存储,你必须让每样ATLEAST一个索引(它会自动生成不管你喜欢还是不喜欢),因为数据存储搜索到这些指标的基础上,你的实体,并相信我是最好的部分,在RDBMS您可以搜索使用非索引字段虽然这将需要一些时间,但它会。 在数据存储不能搜索使用非索引属性。

计数
在RDMBS,它是非常容易的COUNT(*),但在数据存储,请不要甚至认为这在正常方式(是有计数功能),因为它有1000极限 ,它会花费多达小opertion因为这是实体不够好,但我们总是有很好的选择,我们可以使用碎片计数器 。

唯一约束
在RDMBS,我们喜欢这个功能吧? 但数据存储有其自己的方式。 你不能定义一个属性作为唯一:(。

询问
GAE Datatore提供了更好的功能太多LIKE (哦,不!数据存储没有LIKE关键字),SQL是GQL 。

数据插入/更新/删除/选择
这我们都关心,在RDMBS我们需要一个查询插入,更新,删除和选择,就像RDBMS,数据存储已经把,删除,得到(不要高兴得太早了),因为数据存储放置或获得的方面写,阅读,小型作业 ( 阅读数据存储成本的呼叫 )和多数民众赞成在数据建模进入行动。 你必须尽量减少这些操作,并保持你的应用程序的运行。 为了减少读操作 ,您可以使用内存缓存 。



Answer 5:

看看的客体文档。 在页面底部的第一个评论说:

“很高兴,虽然你写了这个描述客观化,这也是我读过的AppEngine数据存储本身的最简洁的解释之一。谢谢你。”

https://github.com/objectify/objectify/wiki/Concepts



Answer 6:

如果你已经习惯了思考ORM映射实体那么这基本上就像谷歌的App Engine基于实体的数据存储是如何工作的。 对于类似的连接,您可以看看参考性质 。 你并不真正需要的是关心它是否使用BigTable的针对后端或别的东西,因为后端由GQL和数据存储API接口抽象。



Answer 7:

我看数据存储的方式是,一种标识表本身,而实体是表内的个别行。 如果谷歌分别采取了一种比它只是一个大表,没有结构,你可以转储任何你在实体想要的。 换句话说,如果实体不依赖于那种你几乎可以有任何结构,以在一个位置的实体和存储(一种大文件的,没有结构的,每一行都有自己的结构)。

现在回到原来的评论,谷歌的数据存储和BigTable中是两个不同的东西,所以不要混淆谷歌的数据存储到数据存储的数据存储感。 Bigtable的比BigQuery的(主要的原因,我们没有用它去)更昂贵。 BIGQUERY确实有正确的连接和类似SQL语言的RDBMS和它便宜,为什么不使用的BigQuery。 话虽这么说,BigQuery的确实有一定的局限性,这取决于你的数据的大小,你可能会或可能不会遇到他们。

此外,在数据存储方面的思考,我认为正确的说法会被“在NoSQL数据库的角度来思考”。 有太多的人可以在那里,但这些天,当谈到谷歌的产品,除了谷歌云SQL(这是MySQL的)一切是NoSQL的。



Answer 8:

植根于数据库领域,数据存储对我将是一个巨大的表(因此得名“大表格”)。 BigTable的是一个坏榜样,但因为它做了很多其他的事情,一个典型的数据库可能不会做,但它仍然是一个数据库。 机会是,除非你知道你需要建立像谷歌的“大表格”,你可能会用标准的数据库罚款。 他们需要的是因为他们正在处理疯狂的数据和系统整合到一起,并没有商用系统真的可以做的工作,他们可以表现出精确的方式,他们需要做的工作。

(参考Bigtable中: http://en.wikipedia.org/wiki/BigTable )



文章来源: How to think in data stores instead of databases?