我在 Google AppEngine 上的应用程序有问题,尤其是数据存储区。故事有点长。我的数据模型如下所示:
- 用户可以创建实体。每个实体都具有以下属性:#1)。自动生成的密钥。#2)。创造者。#3)。一个号码。
- 在应用程序中,我正在执行以下查询:a)。按创建者查询实体(#2)。乙)。按数字属性(#3)查询实体。C)。通过 id(#1) 查询实体。
我正在使用低级数据存储 API。现在,这是我尝试过的几种有问题的方法:
[方法 1]:使用 Datastore,如果我使实体成为无父实体(没有祖先),那么一切都很好,尤其是查询“c”可以通过 Datastore.get(k) 轻松实现。
方法 1 的问题:由于数据存储“最终一致”,因此对于查询“a”,结果始终不会更新到最新。如果用户创建了一个实体,然后列出了他创建的所有实体,那么新创建的实体总是会丢失。它仅在几秒钟后通过刷新出现...尝试使用 memcache,但无济于事(或者我没有找到好方法?)。
为了克服上述问题,我改变了数据结构。这里是【方法二】:在创建每个实体时,根据创建者创建一个key,并将新实体作为key的子实体。因此,用户创建的所有实体都是具有祖先的实体。因此查询“a”可以及时工作,查询“b”似乎也可以工作。
Approach2 的新问题:对于查询'c',它总是什么都不返回。这是我的查询'c'。他们都找不到实体,总是:
方法 1:
实体 en = datastore.get(k)
方法2:
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
Query q = new Query(kind)
.setFilter(FilterOperator.EQUAL.of(Entity.KEY_RESERVED_PROPERTY, k));
Entity en = ds.prepare(q).asSingleEntity();
另一种尝试: 方法 3:将所有实体分组在一个祖先之下。这克服了 Approach1 中的问题,并且可以使用祖先过滤器进行查询,因此可以检索结果。
方法 3 的问题:这种结构将所有实体组合为一个实体组。根据 Google 数据存储规范,写入操作每秒最多可发生 5 次。这是我不想达到的极限......
我觉得这种数据模型真的很常见。有没有合适的方法来构建数据?任何帮助表示赞赏。谢谢...