1

我在 Google AppEngine 上的应用程序有问题,尤其是数据存储区。故事有点长。我的数据模型如下所示:

  1. 用户可以创建实体。每个实体都具有以下属性:#1)。自动生成的密钥。#2)。创造者。#3)。一个号码。
  2. 在应用程序中,我正在执行以下查询: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 次。这是我不想达到的极限......

我觉得这种数据模型真的很常见。有没有合适的方法来构建数据?任何帮助表示赞赏。谢谢...

4

1 回答 1

1

由于您问题的格式,我不太确定您在问什么,但是...

当您通过 ID 查询时,您还必须包含父键。密钥包括父母数据和子数据,如果您只使用子数据,那么它不会返回您要查找的内容,因为这不是“名称”。完整路径(祖先/子)是它的名称。

因此,将父项包含在您正在构建的密钥中,然后获取它。

key = parent, parent_ID, child, child_ID

作为

key = child, ID

如果它有父级,则无法使用,因为密钥不完整并且无法返回您想要的数据。

于 2012-10-05T13:41:38.297 回答