【问题标题】:Design for tagging system in GAE-JGAE-J中的标注系统设计
【发布时间】:2011-02-01 13:51:10
【问题描述】:

我需要一个简单的 GAE-J 标记系统。

在我看来,被标记的实体应该有一组键,这些键指的是与之关联的标签。

标签实体应该只包含标签字符串本身,以及指向与标签关联的实体的键集合。

当实体的标签列表发生变化时,如果标签未知,系统将创建一个新标签,然后将实体的键附加到该标签的键集合中。如果标签已经存在,那么实体的键会简单地附加到标签的键集合中。

这对我来说似乎相对直截了当且没有争议,但我想对此设计提供一些反馈,以确保确定。

【问题讨论】:

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


    【解决方案1】:

    为什么要存储Tags 表呢?这似乎非常注重关系数据库,并且在数据存储之上无法扩展或特别有用。

    相反,只需为每个可标记实体存储一个字符串列表。

    @Persistent
    private List<String> tags;
    

    获取实体的标签将是一个简单的查找(而不是调用数据存储),查找具有该标签的其他项目将是对数据存储的一次调用:

    Query query = pm.newQuery("select from Entities " +
                              "where tagNameParam in tags" +
                              "parameters String tagNameParam");
    

    它还会使写入更快,因为您不必检查标签是否已经存在,可能会在Tags 中创建一个新行,等等。

    然而,没有那么简单的是找到所有实体的所有唯一标签。

    【讨论】:

    • 这通常是最好的方法。要跟踪一组唯一标签(和频率等),您还可以拥有一个同步更新的标签模型,但单独更新。
    • 我想我想到这种方法的主要原因是我可以有大量的实体,6 或 7 位,它们不会在同一个实体组中。因此,我认为上述查询可能非常昂贵。使用标签实体,无论我最终有多少搜索结果,我只会检索几个标签实体。然后我可以通过它们的键检索实际标记的实体,而不必查询它们。我认为通过密钥检索会快得多,但我必须承认我对数据存储的理解还有一些不足之处......
    【解决方案2】:

    我正在研究数据存储(我一直在使用 JPA 而不是低级接口)。我的直接反应是实体不能拥有标签,而标签不能拥有实体。这是一个经典的多对多关系。根据我的经验,应尽可能使用自有关系。在这种情况下,您无法使用它们,因此在管理多对多时必须非常小心。

    特别是没有办法使用事务来保证一致性。您应该尝试为不一致的数据存储准备代码。换句话说,两个实体中的键可能不会相互引用,如果是这种情况,您的代码不应崩溃/崩溃/爆炸。

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 2015-01-14
      • 2011-09-06
      • 1970-01-01
      • 2012-07-23
      • 2011-02-02
      • 1970-01-01
      • 2014-11-12
      • 2022-07-22
      相关资源
      最近更新 更多