基本上我有一个用户实体,并且该用户将有关注者。我能想到的对此进行建模的一种可能方法是拥有 Key 类型的多值属性,它将关注者的 Key 存储在列表中。
像这样..
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity userEntity;
Key k = entity.getKey();
Entity user = new Entity("User");
List<Key> followers = new ArrayList<Key>();
followers.add(k);
user.setProperty("FollowersList", followers);
datastore.put(user);
我在某处读到,App Engine 将多值属性中的条目限制为 5,000 个,这是我绝对不想要的。
总的来说,我对 NoSQL 数据库还很陌生。我该怎么做?
最佳答案
如果列表已建立索引或经常更改,则存储值列表并不是一个好主意。
每次更改都会触发重新保存实体,这将导致不必要的写入成本。现在 Google 改变了他们的定价模式,因此价格不像以前那么贵,但仍然需要记住。
此外,用户实体本身会变得很大 - 每次需要该实体时,您都将移动所有这些数据,即使在大多数用例中您不需要 5,000 个关注者的列表。
一种可能的解决方案是创建一个名为“Follower”的实体类型。此类实体将没有属性(除非您需要存储有关每个关系的一些附加数据)。这些实体将是用户实体的子实体,它们的 ID 将与关注者的 ID 匹配。
Key userKey = KeyFactory.createKey("User", userID);
Entity followerEntity = new Entity("Follower", followerUserID, userKey);
datastore.put(followerEntity);
现在,您可以通过运行仅键(最便宜且最快的选项)祖先查询来快速检索所有关注者的列表:
Query q = new Query("Follower").setAncestor(userKey).setKeysOnly();
如果您删除作为其父级的“用户”实体,请不要忘记删除“关注者”实体 - 这不会自动发生,它们只会保持孤立状态。
关于java - 如何将键列表与实体关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36507017/