如何在Google的数据存储服务中建模实体

10
与关系型数据库引擎不同,谷歌应用引擎使用的Datastore不强制执行模式 - 它不存储行和列,而是存储具有各种属性的实体。尽管如此,是否仍应使用传统的数据库设计呢?
例如,假设我有一个跟踪各种租赁车辆的应用程序。在传统的数据库中,我可能有一个“Buses”表,跟踪车队中每辆公交车的长度和座位数,“Trucks”则有一个列,记录每辆卡车的载重能力和马力。每个公交车和卡车也都有颜色和车牌号码。(如果我想规范化数据库,可以将这些属性分解到一个“Vehicle”表中)。
在谷歌的Datastore中,我倾向于只将公交车和卡车存储为“Vehicle”实体,因为它们共享通用属性,并添加特定于车辆类型的任何属性。
传统数据库模型中,每个Datastore实体表示一个数据库表,使用这种模型有什么优缺点?
将大型实体拆分为较小的实体是否更有效率?
另外还有哪种API推荐使用:JDO、JPA或Datastore低级API?
谢谢!
3个回答

4
您不应该考虑表格,而是考虑实体。文档说明如下:数据存储实体无模式
数据存储实体无模式:同一种类的两个实体没有义务具有相同的属性或者使用相同的值类型来表示相同的属性。应用程序需要在必要时确保实体符合架构。
通常最佳性能是通过去规范化数据来实现的。因此,您可能最好使用两种不同的实体类型BusTruck,并忽略它们共享某些属性的事实。

3
这是一个长期困扰我的问题。我认为,您以后想要在实体上搜索的方式对于决定设计模型有重大影响。令我困扰的是,在App Engine中,您无法同时使用不等过滤器查询同一实体的多个属性。
例如:您不能查询“人”实体的年龄>20和身高<170。因为年龄和身高是同一实体的不同属性。
我已经在我的应用程序中使用了JDO,并且到目前为止它运行良好。我决定使用它,因为我所拥有的这本书提供了许多关于在App Engine中使用JDO查询的真实世界示例。
我不得不对这些属性进行去规范化和拆分以进行查询。您可以在Google I/O上观看Bret Saltkin的视频,以更好地了解数据库设计方法。我已经完全覆盖了在Google应用引擎中建模数据存储的经验

1

如果你正在使用Python,请看一下PolyModel类。它提供了一种方便的方式来去规范化你的数据,同时仍然保持不同类型之间的某些逻辑分离。如果你会有很多种类,你可以使用Expando来实现与PolyModel相同的结果。

总的来说,一个实体的大小对性能影响很小。实体数量对性能的影响要大得多。换句话说,favort少数实体。

正如klausbyskov所指出的那样,不要从关系数据库的角度思考。最终,您的应用程序的性能可能会受到影响,因为您将需要进行许多额外的查询和获取操作。要了解一些关键差异,请查看“掌握数据存储库”文章。


只需要澄清一下:性能是指获取或存储实体所需的时间。 - Robert Kluin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接