GAE - Java - 数据存储区实体的关键字分类

时间:2014-04-28 18:49:13

标签: java database google-app-engine google-cloud-datastore

在我的场景中,数据存储区中有3种主要实体,类型为用户,对象和关键字。 问题是对对象和关键字之间的关系进行建模。

用户可以创建他们想要的任意对象,并且可以使用提升链接轻松实现用户 - 对象关系 我通过为任何关系定义实体来建模对象间和用户间关系。这就是因为我可以拥有我想要的所有扇入和扇出以及关系搜索与结果集的比例,所以它也是时间效率的。

现在我需要为关键字分类对象。每个对象可以与有限数量的键相关联,而每个键不能有扇出限制 如何最有效地实施它们? (时间效率(复杂性,......)和数据库活动)

第一种方法可以是:为每个对象分配一个键列表:
搜索将使用结果集进行缩放,因此它不依赖于关系和键的数量。

将密钥和密钥 - 对象关系建模为实体,例如对于跨用户和对象间的情况:
搜索将再次使用结果集进行缩放,因此再次不依赖于净大小。

我可以考虑作为比较标准?

1 个答案:

答案 0 :(得分:2)

如果在对象实体中放置关键字(或其ID)列表,则会产生额外的写入成本:添加每个关键字将导致对象实体的更新,需要每个实体写入一个写入索引属性,包括每个关键字的写入。

如果这种情况很少发生,这将是一个额外的小额费用,我会建议列表方法的简单性。另一方面,如果更频繁地添加/删除关键字,费用将很快加起来。

使用Keyword_Object实体可以避免更新Object实体的额外成本,但是您必须维护另一个Entity类型,并且您存储的数据将占用更多空间(每个关键字 - 对象对的额外键)。

我建议使用这些方法中的任何一种,并在更多数据可用时进行优化,除非您确定很快就会有数百万条记录,并且您已经知道了数据访问模式。