我已经在Java中使用适用于App Engine的低级数据存储API一段时间了,我正在尝试找出处理一对多关系的最佳方法。想象一下一对多的关系,比如“任何一个学生都可以有零个或多个计算机,但每台计算机都只有一个学生”。
这两个选项是:
我有一种感觉选择两种更好,但我很好奇其他人的想法。
选项一的优点是你可以在不使用查询的情况下获得所有'manys'。可以使用get()向所有实体请求数据存储区并传入存储的键列表。这种方法的问题在于您不能让数据存储区对从get()返回的值进行任何排序。你必须自己做分类。另外,您必须管理列表而不是单个密钥。
选项二似乎很好,因为没有要维护的列表。此外,您可以按计算机的属性进行排序,只要它们是该属性的索引即可。想象一下,试图为学生获取所有计算机,其结果按购买日期排序。使用方法二,这是一个简单的查询,我们的代码中没有进行排序(数据存储区的索引会处理它)
排序并不是很难,但是比排序索引(~O(n)用于遍历索引)更耗时(~O(nlogn)用于排序)。权衡是处理时间的索引(数据存储区中的空间)。正如我所说,我的直觉告诉我,选项二是一个更好的通用解决方案,因为它为开发人员提供了更多的灵活性,以便以额外的索引(谷歌定价模型相当便宜)为代价重新获得结果。有没有人同意,不同意或有评论?
答案 0 :(得分:1)
这两种方法在不同情况下都有效,但选项二 - 在“多”方存储单个参考 - 是更常见的方法。您使用的方法取决于您访问数据的方式。
答案 1 :(得分:0)
你考虑过两者兼顾吗?然后,您可以通过密钥快速获取学生拥有的计算机列表,或者使用以某种排序顺序返回结果的查询。我认为维护学生模型上的键列表并不像你想象的那样令人生畏。
不要低估通过密钥直接获取实体的好处。根据{{3}},这可能比查询快4-5倍。