GAE-J中标记系统的设计

时间:2010-03-27 17:15:24

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

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

正如我所看到的那样,被标记的实体应该有一组密钥,这些密钥引用与之关联的标记。

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

当实体的标签列表被更改时,如果标签未知,系统将创建新标签,然后将实体的密钥附加到该标签的密钥集合。如果标签已经存在,那么实体的密钥将简单地附加到标签的密钥集合中。

这对我来说似乎相对直截了当且毫无争议,但我想对此设计有一些反馈,只是为了确定。

2 个答案:

答案 0 :(得分:3)

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

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

@Persistent
private List<String> tags;

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

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

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

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

答案 1 :(得分:0)

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

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