是否可以在Google App Engine中保留规范化模型?

时间:2013-07-09 09:29:49

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

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

我已经知道数据存储区(使用其基础Bigtable技术)与RDBM系统的工作方式不同,但我的问题是:什么阻止仍然以关系方式布局他们的模型(所有从理论和规划的角度来看,它在数据存储区内的优势?

澄清一个例子。我还不能计划以下类型的实体:

  • 人(姓名:str,公司:公司)
  • 公司(姓名:str)
  • 项目(注释:文字)
  • PersonProjects(人:人,项目:项目)

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

我记得前段时间看过来自I / O系列(由同一家Google制作)的视频,其中使用了规范化技术来防止某种类型的实体过大,即具有太多属性(问题)实际上涉及爆炸指数)。计划类型的一个属性是作为一种新类型“脱离”它,后来通过代码扩展到它。

嗯,我还不能为所有类型的财产做到这一点吗?除了客户端(或服务器端)工作的增加(需要将对象“设置”用于检索)之外,我看不到任何重大问题。 那么,切换到“基于实体”的模型真的有必要吗?我们不能通过种类和实体来模拟关系吗?

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

1 个答案:

答案 0 :(得分:1)

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

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

另请注意,SQL RDBM中通常没有DB强制的参照完整性。