2010-06-30 38 views
1

我已经在Java中使用App Engine的低级数据存储API一段时间了,我试图找出处理一对多关系的最佳方法。想象一下一对多的关系,比如“任何一个学生可以有零个或多个计算机,但每台计算机只有一个学生拥有”。处理低级数据存储区api中一对多关系的最佳方式是什么?

两个选项是:

  • 有学生实体店与学生
  • 有计算机实体店的学生的一个关键谁拥有计算机相关联的计算机密钥列表

我有一种感觉选项二更好,但我很好奇别人的想法。

选项一的优点是您可以在不使用查询的情况下获取所有'manys'。可以使用get()向数据存储区询问所有实体并传入存储的密钥列表。这种方法的问题是,您不能让数据存储对从get()返回的值进行任何排序。你必须自己排序。另外,你必须管理一个列表而不是一个单一的密钥。

选项二看起来不错,因为没有要维护的列表。此外,只要它们是该属性的索引,就可以按计算机的属性进行排序。想象一下,试图让所有的学生在计算结果时按照购买日期排序。使用方法二,它是一个简单的查询,在我们的代码中没有排序(数据存储区的索引照顾它)

排序并不是很难,但会花费更多时间(~O(nlogn) )比具有排序索引(〜O(n)用于通过索引)。权衡是处理时间的索引(数据存储区中的空间)。正如我所说,我的直觉告诉我,选项二是一个更好的通用解决方案,因为它使开发人员以更多的索引(与谷歌定价模型相当便宜)为代价获得结果的灵活性更高。有没有人同意,不同意或有意见?

+0

您可能有第三个选项,即将所有计算机存储在用户的记录中。我不熟悉你提到的数据存储。 – 2010-06-30 00:25:55

+0

将用户记录存储在用户记录中可能对GAE的数据存储不太适用。这样做会有点棘手(它可能需要在计算机模型中每个字段需要一个“ListProperty” - 并且这些全部都无法编入索引,否则就会出现爆炸索引问题)。如果您不需要搜索计算机,这可能没什么问题,并且当您检索学生实体时,您不介意总是检索学生的所有计算机信息的开销。 – 2010-06-30 00:36:13

回答

0

你有没有考虑过两者?然后,您可以通过键快速获取学生拥有的计算机列表,或使用以某种排序顺序返回结果的查询。我不认为在学生模型上保留一个键列表与您的想法一样令人感到恐惧。

不要低估直接按键获取实体的好处。根据this article,这可能比查询快4-5倍。

+0

“不要低估直接通过密钥获取实体的好处,根据这篇文章,这比查询速度快4-5倍。” 该文章引用系统状态页面(http:// code。google.com/status/appengine/),当它提到这个数字。但是,这不是比较有点不公平。我认为获取通常会用于返回单个条目,而查询通常会返回更多数据 - 有时甚至更多。 – hwiechers 2010-06-30 04:36:51

1

这两种方法在不同的情况下都是有效的,尽管选项二 - 在“多”一边存储单个引用 - 是比较常见的方法。您使用哪个取决于您需要如何访问您的数据。