我需要GAE-J中的简单标记系统。
正如我所看到的那样,被标记的实体应该有一组密钥,这些密钥引用与之关联的标记。
标记实体应该只包含标记字符串本身,以及指向与标记关联的实体的键集合。
当实体的标签列表被更改时,如果标签未知,系统将创建新标签,然后将实体的密钥附加到该标签的密钥集合。如果标签已经存在,那么实体的密钥将简单地附加到标签的密钥集合中。
这对我来说似乎相对直截了当且毫无争议,但我想对此设计有一些反馈,只是为了确定。
答案 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而不是低级接口)。我的直接反应是实体不能拥有标签,标签不能拥有实体。这是许多人的经典关系。根据我的经验,应尽可能使用所有关系。在这种情况下,您无法使用它们,因此在管理多对多时必须非常小心。
特别是没有办法使用交易来保证一致性。您应该尝试为不一致的数据存储准备代码。换句话说,两个实体中的密钥可能不会相互引用,如果是这种情况,您的代码不应该崩溃/崩溃/爆炸。