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

GAE-Java-数据存储实体的关键字分类,java,database,google-app-engine,google-cloud-datastore,Java,Database,Google App Engine,Google Cloud Datastore,在我的场景中,数据存储中有3种主要的实体:种类用户、对象和关键字。 问题是建模对象之间的关系,并对它们进行分类 用户可以创建任意数量的对象,并且用户与对象的关系可以通过ascestor链接轻松实现。 我通过为任何关系定义实体来建模对象间和用户间的关系。这是因为这样我可以拥有我想要的所有扇入和扇出,以及关系搜索与结果集的比例,所以它也很省时 现在我需要为关键字对对象进行分类。每个对象可以关联到有限数量的键,而每个键不能有扇出限制。 如何最有效地实施它们?(时间效率(复杂性…)和数据库活动) 第一种

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

用户可以创建任意数量的对象,并且用户与对象的关系可以通过ascestor链接轻松实现。
我通过为任何关系定义实体来建模对象间和用户间的关系。这是因为这样我可以拥有我想要的所有扇入和扇出,以及关系搜索与结果集的比例,所以它也很省时

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

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

将键和键对象关系建模为实体,如用于inter-user的inter-objects案例:
搜索将再次根据结果集进行缩放,因此再次不依赖于净大小


>作为一个比较准则,

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

如果这种情况很少发生,这将是一个小的额外成本,我会推荐列表方法的简单性。另一方面,如果增加/删除关键词的频率更高,成本将迅速增加

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

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