【问题标题】:Is it possible to keep a normalized model in Google App Engine?是否可以在 Google App Engine 中保留规范化模型?
【发布时间】:2013-07-09 09:29:48
【问题描述】:

直截了当,是否仍然可以在 Google App Engine 数据存储区中保留一个规范化的二维模型,其中每个关系本身就是一种类型,其实体是关系的实例?

我已经知道 Datastore(及其底层 Bigtable 技术)与 RDBM 系统的工作方式不同,但我的问题是:是什么阻止了人们仍然以关系方式(包括所有从理论和规划的角度来看它的优势)在 Datastore 中?

举例说明。难道我还不能计划以下类型的实体:

  • 人员(姓名:str,公司:公司)
  • 公司(名称:str)
  • 项目(备注:文本)
  • PersonProjects (Person:Person, Project:Project)

引用其他实体(例如 Person.Company、PersonProjects.Project)的属性将存储这些实体的 ID。 性能方面的主要缺点(如果有的话)是什么? 请注意,我可以进一步规范化模型,例如为 PersonName、CompanyName 等引入了新类型,但我决定在这里将单值属性保留在它们所指的同一类型中。

我记得前段时间看过 I/O 系列的一个视频(由同一个 Google 制作),其中使用规范化技术来防止某种实体太大,即具有太多属性(问题实际上涉及爆炸索引)。计划类型的一个属性作为一种新类型从它“分离”出来,然后通过代码对其进行扩充。

好吧,我不能对所有类型的属性都这样做吗?除了客户端(或服务器端)工作的增加(需要“设置”对象以进行检索)之外,我看不到任何重大问题。 那么,切换到“基于实体”的模型真的有必要吗?我们不能通过种类和实体来模拟关系吗?

我希望我已经足够清楚了。

【问题讨论】:

  • 可以,但出于性能原因,您通常需要制作组合。当您需要多对多关系时,我使用中间实体。
  • 感谢您的回复。但是你暗示的性能问题到底是什么?这基本上就是我需要知道的。
  • 当事情开始需要很长时间时,您就会知道。请记住,您不能进行连接。因此,您想通过依赖于关系另一端的值的查询检索的任何内容都变得昂贵,如果您需要 2 级以外的值,那么它将花费很大。分析您的应用程序,您将更好地了解需要优化的内容。目前你的问题太开放了,正确的答案取决于你在做什么。
  • 我确实关心应用程序的最终查询功能。在此处假设的准规范化模型中,我将通过对规范化字段(如您所说)进行的多个微查询来检索(或完成)我的人工构造的对象。示例:对于 Person 对象,我将使用 .Person = 对象的 id 查询 PersonProjects.Project 的 Projects。我确信 Datastore 提供了一些基于键的查询工具,而且我认为这不会很昂贵,因为只涉及基本索引。那么,性能瓶颈在哪里呢?查询不是引擎的强项吗?
  • 按键获取速度很快,当您从主查询中迭代超过 100 个或更多实体时会出现问题,这需要获取额外的项目。

标签: google-app-engine google-cloud-datastore relational


【解决方案1】:

没有什么能阻止您在 Datastore 中规范化您的模型。问题在于 Datastore 的查询语言非常有限:仅对一个属性进行不等式过滤,没有多类查询,没有 JOIN 等。这迫使您根据访问模式组织数据:面向访问的建模。这通常会迫使您将数据存储在不合逻辑的地方,只是为了快速获取数据(= 最少的数据库操作集)。

此外,事务非常有限,迫使您以某种方式组织数据(实体组)。或者,如果您使用 XG 交易,那么您将被限制为每笔交易 25 个实体。

另请注意,没有像 SQL RDBM 中通常那样由 DB 强制执行的引用完整性。

【讨论】:

    猜你喜欢
    • 2020-08-07
    • 2011-05-09
    • 2014-09-09
    • 2011-06-22
    • 2013-03-25
    • 2011-03-09
    • 2012-05-08
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多