【问题标题】:How to model a many-to-many relationship in App Engine?如何在 App Engine 中建模多对多关系?
【发布时间】:2010-12-17 08:39:24
【问题描述】:

我有一个关于如何在 App Engine 中建模多对多关系的问题:

一个博客条目可以有多个标签,一个标签可以应用于多个博客条目。

我看到了几个场景:

  1. 使用一组字符串作为博客条目的属性。

    • 这让我可以使用标签轻松查询条目
    • 这不允许我获取所有标签及其权重(它们适用于多少条目)
  2. 在条目和标签类之间使用无主关系(条目类中标签的键集,反之亦然)

    • 这让我可以获取所有标签及其权重
    • 维护起来要复杂得多
    • 设置属性是延迟加载的,还是我每次都获取整个对象图? (获取一个条目,它会获取多个标签,每个标签又会获取多个条目)
  3. 使用 1. 但单独维护标签及其权重的数据

    • 这在标签数据和条目中的标签之间存在同步问题

任何输入和指针将不胜感激。我认为这是一个很常见的情况,但我还没有看到任何好的解决方案。

【问题讨论】:

    标签: java database-design google-app-engine jdo


    【解决方案1】:

    与许多其他数据库管理系统一样,App Engine 数据存储区本身不支持多对多关系,但可以通过“联结表”解决。但是,由于 App Engine 的查询语言不支持联接,因此在您的应用程序中使用这将非常痛苦。 Google 的 BigTable 架构实际上不鼓励这种做法,因为分布式连接效率不高。

    所以,我建议遵循“保持简单愚蠢”的规则;使用最简单的东西。 “Blogentry”对象中的字符串列表听起来相当健壮。即使它很容易出现竞争条件(人们并行更新,覆盖彼此的更改),但你有多少人编辑同一篇博文?

    【讨论】:

    • 您好,感谢您的回答。你是对的,这就是我现在所做的(选项 1)。不幸的是,这不允许我轻松获得所有标签及其权重的列表(需要此列表,因为我想要一个标签云,并且我希望在将标签添加到新条目时自动完成)。在内存中计算这个列表似乎违反直觉,更不用说不可扩展了,但也许这是需要做的。
    【解决方案2】:

    我决定使用选项 3.,维护一个单独的标签列表及其权重。

    这似乎工作正常,虽然插入/更新代码有点混乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2011-03-17
      • 2016-09-19
      • 1970-01-01
      相关资源
      最近更新 更多