代码之家  ›  专栏  ›  技术社区  ›  Mark M

在低级数据存储api中处理一对多关系的最佳方法是什么?

  •  1
  • Mark M  · 技术社区  · 14 年前

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

    这两个选项是:

    • 让学生实体存储与学生相关联的计算机的密钥列表
    • 让计算机实体存储拥有计算机的学生的一个密钥

    我觉得第二种选择更好,但我很好奇其他人怎么想。

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

    选项二似乎很好,因为没有列表可维护。此外,您还可以按计算机的属性排序,只要它们是该属性的索引。想象一下,试图为一名学生购买所有计算机,结果按购买日期排序。对于方法二,它是一个简单的查询,在我们的代码中不进行排序(数据存储的索引负责)

    排序并不是很难,但比使用排序索引(~O(n)遍历索引)要花费更多的时间(排序是~O(nlogn))。折衷办法是为处理时间建立一个索引(数据存储中的空间)。正如我所说,我的直觉告诉我,选项二是一个更好的通用解决方案,因为它让开发人员在恢复结果的顺序方面有更多的灵活性,而代价是额外的索引(使用谷歌定价模型,这些索引非常便宜)。有人同意、不同意或有意见吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Nick Johnson    14 年前

    这两种方法在不同的情况下都是有效的,不过选项二——在“多”端存储单个引用——是更常见的方法。使用哪一种取决于访问数据的方式。

        2
  •  0
  •   David Underhill    14 年前

    你考虑过两者都做吗?然后,你可以通过键快速获得学生拥有的计算机列表,或者使用一个按排序顺序返回结果的查询。我不认为在学生模型上维护一个密钥列表像你想象的那样可怕。

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