java - 如何将键列表与实体关联

标签 java google-app-engine google-cloud-datastore

基本上我有一个用户实体,并且该用户将有关注者。我能想到的对此进行建模的一种可能方法是拥有 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/

相关文章:

java - 如何在 slider 移动时而不只是在松开鼠标时调用 Action 监听器?

java - MysqlConnectionPoolDataSource - 无法使用 jdbc 插入到 mysql 数据库?

python - 谷歌应用引擎 NDB : How to store document structure?

google-app-engine - 在 GCP 上部署 SSR Web 应用程序的正确方法是什么?

java - GAE : Exception while allocating 16 digit ids

javascript - 如何设置 GAE 数据存储的 key ?

java - Spring Swing 集成

JavaFX FXML Controller - 构造函数与初始化方法

google-app-engine - 通过 NDB 中的计数查询重复的属性

python - 找不到 antlr-python-runtime 的匹配分布