GAE/J中的数据库设计:关系建模与实体属性值

Gui*_*ido 5 google-app-engine data-modeling google-cloud-datastore

想象一下,您计划创建一个在GAE/Java运行的社交网络,其中每个用户都有一组属性(即年龄,当前城镇,兴趣).

备选方案1:经典方法 - user_id和每个属性作为"行"

entity  property_1 property_2 property_3
------  ---------- ---------- -----------------
bob     missing    NY         [football, books]
tom     34         missing    [books, horses]
Run Code Online (Sandbox Code Playgroud)

备选方案2:实体 - 分配值(EAV)

entity   attribute   value
------   ---------   -----
bob      town        NY
bob      interests   [football, books]
tom      age         34
tom      interests   [books, horses]
Run Code Online (Sandbox Code Playgroud)

您认为每个选项有哪些优缺点?我主要担心的是:

  1. 对多标准搜索有什么影响(即"给我年龄在45岁以下的用户住在纽约并喜欢书籍")
  2. 它可能具有哪些GAE/J含义?(即索引,数据存储区大小......)
  3. 如果要检索"喜欢书籍的用户 ",如何使用多个值(例如"兴趣")对属性建模?

我认为第二种选择更灵活,也许更容易实现,但我想知道其他有经验的开发人员的想法.

谢谢.

小智 2

您是否看过Google I/O 2009 上的在 App Engine 上构建可扩展的复杂应用程序?该视频的音质很差,但涵盖了您的主题。他谈论了列表属性和合并连接及其局限性。