0

我有一个包含用户、帐户、订单、订单行等实体的购物车应用程序。

我的许多实体都属于账户实体,例如一个账户有很多订单,一个订单有很多订单行,一个订单行有多对多的发货关系。该帐户还有许多用户可以查看该帐户的子实体。

文档建议保持实体组不超过单个用户的数据价值:https ://developers.google.com/appengine/docs/python/datastore/entities

我担心一个帐户的实体组可能会增长到无法扩展的大小。一个帐户可以增长到 100,000 个订单,其中包含数十万个子实体。

我有两个问题:

1.)如果我不使用祖先,我是否只需要接受如果一个用户编辑一个实体,它可能不会在几秒钟内更新?

2.) 如果我确实使用了祖先,如果一个帐户有很多用户全天都在同一个实体组中创建/编辑/删除,会发生什么?某些交易会被阻止吗?

4

2 回答 2

2

似乎这里的实体组应该是订单加上其项目,而不是帐户。

每个实体组每秒更新一次的限制,因此如果您在帐户级别定义组并且您确实有多个用户不断更新单个用户,一些会失败。如果您将其定义为订单,则发生这种情况的可能性要小得多。

但是,我强烈建议您为订单本身使用实体组。您绝对不希望在单个订单中用户看到的内容可能存在差异 - 或者更糟糕的是,支付的内容可能存在差异。

这样做的唯一问题是,新订单可能不会在创建后立即显示在帐户的订单列表中。为了解决这个问题,您可能会使用 memcache,或者可能有一个单独的实体使用手动指定的键为用户存储订单列表,您可以直接获取而不是查询 - 例如使用客户的帐号作为键名。由于 get 保证是一致的,因此它将始终是最新的。

于 2013-09-02T09:04:58.840 回答
0
  1. 是的,但最终一致性只影响查询。如果您编辑数据然后获取它,则更改将可见。

  2. 不,文档中没有提到实体组的大小限制或事务阻塞。适用的限制是每个实体组的写入吞吐量:文档声明每个实体组每秒写入 1 次(实际上我看到大约 5 次写入/秒)。但是,如果您将实体组设计为每个用户,这应该不是问题。

于 2013-09-02T09:08:40.880 回答