作为一个例子,谷歌的应用程序的发动机使用的谷歌数据存储库,没有一个标准的数据库,以储存数据。没有任何人有任何技巧使用的数据存储,而不是数据库?看来我已经训练我的脑海想到100%的目的关系,这直接表结构,现在很难看到什么不同。我可以理解的一些好处谷歌的数据存储(例如性能和能够分发的数据),但是一些良好的数据库功能是被牺牲的(例如加入).

没有任何人曾经与谷歌的数据存储库或大表有任何良好的咨询意见与他们一起工作?

有帮助吗?

解决方案

有两个主要的事情,以获得用于有关应用程序的引擎数据库相比较时对"传统"关系的数据库:

  • 该数据存储库,使之间没有区别插页和更新。当你打电话把()上一个实体,该实体获取存储的数据存储库,与其独特关键的,以及任何有关键得到复盖。基本上,每个实体种类的数据存储库的行为就像一个巨大的地图或排序的清单。
  • 查询,如你所提到的,是更为有限。没有联接,对于一个开始。

关键的事实和背后的原因,这两个差异是,大表基本上就像一个巨大的命令词典。因此,把操作的只是设置价值对于给定的关键-不管任何先前的价值为关键,并且取行动是有限的获取单一的钥匙或连续的范围。更复杂的查询可能的索引,这基本上只是表他们自己的,允许实施更复杂的询问为扫描上的连续的范围。

一旦你已经吸收,你有的基本知识,需要了解的能力和局限的数据存储库。限制可能似乎是任意的也许更有意义。

最重要的一点是,虽然这些限制在你可以做什么,在一个关系数据库,这些同样的限制是什么让它实际规模达到的排序的数量级,大表是设计用来处理。你只是不能执行这样的查询,看起来良好的纸上被残暴地缓慢,SQL数据库。

在如何改变如何你所代表的数据,最重要的事情是次预计算而言.而不是做同在查询时,precalculate数据并将其存储在数据储存在任何可能的情况下。如果你想选择一个随机的记录,生成一个随机的数量和储存与每个记录。 有一整个食谱的这些种类的技巧和技巧 在这里, 编辑:食谱不再存在。

其他提示

我一直关注思维转换的方法是完全忘记数据库。

在关系数据库世界中,您总是要担心数据规范化和表结构。放弃一切。只需布置您的网页即可。全力以赴。现在看看他们。你已经2/3了。

如果你忘记了数据库大小很重要且数据不应该重复的概念那么你就是3/4而你甚至不需要编写任何代码!让您的观点决定您的模型。你不必像对待世界一样把你的物体变成二维。您现在可以存储具有形状的对象。

是的,这是对苦难的简化解释,但它帮助我忘记了数据库,只是做了一个应用程序。到目前为止,我已经使用这种理念制作了4个App Engine应用程序,还有更多应用程序。

当人们出来时我总是轻笑 - 这不是关系型的。我在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()    

我来自关系数据库世界然后我发现这个数据存储库的事情。它花了数天,以获得的。嗯有我的一些调查结果。

你必须已经知道,数据储存是建立规模和是一回事,将其分离,从RDMBS.以规模更大的数据集的应用程序的发动机已经做了一些变化(有些装置很大的变化)。

RDBMS VS数据存储库
结构
在数据库中,我们通常的结构,我们的数据表、行其是在它成为数据存储库 种类和实体.

关系
在RDBMS,大多数人folllows的一对一,许多对一,许多对多关系,在数据存储库,因为它具有"不加入"事情,但我们仍然可以实现我们的正常化,使用"ReferenceProperty"例如 一对一关系的实例 .

索引
通常在RDMBS我们使索引等主键,外的关键的、独特的关键和关键指数,以加速搜索和促进我们的数据库的性能。在数据储存,你必须使至少一个指数的每一种类(它将自动 产生 无论你喜欢与否)因为数据存储库的搜索你的实体的基础上,这些索引和相信我那是最好的部分,在RDBMS你可以搜索使用非指数领域,虽然它将需要一些时间,但它会。在数据储存,你可以搜索不用非索引的财产。


在RDMBS,这是很容易计数(*)但在数据存储库,请不要甚至认为它在正常的方式(是啊有一个计功能),因为它有 1000限制 它将花费多 小,所以不容易被堵 作为该实体是不是很好但我们总是有好的选择,我们可以使用 碎片计数器.

独特的约束
在RDMBS,我们喜欢这个功能的权利?但是,数据储存有其自己的方式。你不能定义的财产作为独一无二的:(.

查询
再Datatore提供了更好的功能多 喜欢(哦,没有!数据存储库不具有类的关键词)SQL这是 GQL.

数据Insert/Update/Delete/选择
这里,我们所有感兴趣,因为在RDMBS我们需要一个查询插入、更新、删除和选择,就像数据库、数据存储放、删除、获取(不要高兴得太早),因为数据存储放或获得在条款 读,写,小型行动(阅读 费用数据存储电话)这里的数据模型来采取行动。你必须最大限度地减少这些操作和保持你的应用程序的运行。为减少 读操作 你可以使用 缓存.

查看Objectify文档。页面底部的第一条评论说:

“很好,虽然你写这篇文章描述Objectify,但它也是我读过的关于appengine数据存储本身最简洁的解释之一。谢谢。“

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

如果您习惯于考虑ORM映射实体,那么基本上就像Google的App Engine这样基于实体的数据存储区是如何工作的。对于类似连接的内容,您可以查看参考属性。您实际上并不需要担心它是否将BigTable用于后端或其他内容,因为后端是由GQL和数据存储区API接口抽象的。

我查看数据存储区的方式是,类型标识表本身,实体是表中的单独行。如果谷歌只拿出一个没有结构的大表,你可以在实体中转储你想要的任何东西。换句话说,如果实体没有绑定到一种类型,那么你几乎可以拥有任何实体结构并存储在一个位置(一种没有结构的大文件,每一行都有自己的结构)。

现在回到原始评论,谷歌数据存储和bigtable是两个不同的东西,所以不要混淆谷歌数据存储与数据存储数据存储感。 Bigtable比bigquery更昂贵(主要原因我们没有使用它)。 Bigquery确实有正确的连接和RDBMS,比如sql语言和它更便宜,为什么不使用bigquery。话虽如此,bigquery确实有一些限制,具体取决于您可能会或可能不会遇到的数据大小。

另外,就数据存储方面的思考而言,我认为适当的陈述将是“根据NoSQL数据库思考”。这些天有太多可用的东西,但是当谈到谷歌产品,除了谷歌云SQL(这是mySQL),其他一切都是NoSQL。

根植于数据库世界,我的数据存储将是一个巨大的表(因此名称为“bigtable”)。 BigTable是一个糟糕的例子,因为它执行了许多典型数据库可能不会执行的其他操作,但它仍然是一个数据库。除非你知道你需要构建类似Google的“bigtable”之类的东西,否则你可能会对标准数据库很好。他们之所以需要这样,是因为他们正在处理大量的数据和系统,而且没有任何商用系统可以真正完成工作,他们可以证明他们需要完成这项工作。

(bigtable reference: http://en.wikipedia.org/wiki/BigTable

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top