【问题标题】:How do you design data models for Bigtable/Datastore (GAE)?您如何为 Bigtable/Datastore (GAE) 设计数据模型?
【发布时间】:2010-09-09 22:34:03
【问题描述】:

由于 Google App Engine 数据存储区基于 Bigtable,而且我们知道这不是关系数据库,您如何设计数据库架构/数据模型 适用于使用此类数据库系统的应用程序?

【问题讨论】:

标签: python database google-app-engine bigtable


【解决方案1】:

设计一个大表模式是一个开放的过程,基本上需要你思考:

  • 您将使用的访问模式以及每种模式的使用频率
  • 类型之间的关系
  • 您需要哪些索引
  • 您将使用的写入模式(为了有效地分散负载)

GAE 的数据存储会自动对您的数据进行非规范化处理。也就是说,每个索引都包含(大部分)完整的数据副本,因此每个索引都会显着增加执行写入所需的时间和使用的存储空间。

如果不是这种情况,设计 Datastore 架构的工作量会大很多:您必须仔细考虑每种类型的主键,并考虑您的决定对数据位置的影响。例如,在呈现博客文章时,您可能需要显示 cmets 以配合它,因此每个评论的键可能以相关文章的键开头。

使用 Datastore,这没什么大不了的:您使用的查询将类似于“Select * FROM Comment WHERE post_id = N”。 (如果您想对 cme​​ts 进行分页,您还需要一个限制子句,以及可能的“AND comment_id > last_comment_id”后缀。)添加此类查询后,Datastore 将为您构建索引,您的读取将是神奇的快。

需要记住的是,每个额外的索引都会产生一些额外的成本:最好使用尽可能少的访问模式,因为它会减少 GAE 将构建的索引数量,从而减少所需的总存储空间根据您的数据。

阅读这个答案,我觉得它有点含糊。也许一个动手设计问题将有助于缩小范围? :-)

【讨论】:

  • GAE 数据存储不会“自动非规范化您的数据”。它会自动索引大多数列,但这完全不同。
  • 数据存储也不会自动为您创建索引 - 开发应用服务器会。如果您未能在 dev 应用程序服务器中执行特定查询,则它不会向 index.yaml 添加适当的条目,并且在部署时查询将失败。
  • 我在某处读到每个索引都包含要返回的 all 字段的副本;但是文档现在声明只有那些影响索引的列存储在其中。 AFAICT 没有说明索引读取是简单扫描还是扫描+查找。你看到过什么吗?
【解决方案2】:

您可以使用 www.web2py.com。您构建模型和应用程序一次,它可以在 GAE 上运行,也可以在 SQLite、MySQL、Posgres、Oracle、MSSQL、FireBird 上运行

【讨论】:

  • 这只是技术上正确的。一旦消除了 OR 和 JOIN,常规的基于模式的关系数据库就可以在 GAE 上运行。但它与设计成适合 GAE 相去甚远,其他方面也是如此......
【解决方案3】:

由于 GAE 建立在 Django 中如何管理数据的基础上,因此 Django 文档中有很多关于如何解决类似问题的信息(例如,请参阅 here,向下滚动到“您的第一个模型”)。

简而言之,您将 db 模型设计为常规对象模型,并让 GAE 整理所有对象-关系映射。

【讨论】:

  • 非常糟糕的建议... Django 仅适用于关系数据库。如果您想查看一些实践,可以使用 djano-nonrel 来提供灵感……
猜你喜欢
  • 1970-01-01
  • 2017-05-09
  • 2022-11-04
  • 2019-05-05
  • 2010-12-02
  • 2021-05-08
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多