App Engine - 实体链生成特别长的实体密钥

时间:2010-02-09 03:10:47

标签: google-app-engine key parent

我正在编写一个允许用户在它们之间发送消息的应用程序。我正在使用事务来确保任何两个用户之间只有一条“顶部”消息,并且这个“顶部”消息有一个指向“next”消息的链接,依此类推。形成一种链接列表消息。这些消息通过引用属性相互引用,并通过声明每个新的“top”a将前一个“top”作为其父级来放置在同一个实体组中。

然而,这种方法的问题在于每个新实体都有一个包含前一个实体的整个密钥的密钥(即:new_top_key == old_top_key + new_stuff)。这导致实体密钥以很大的速率增长,并且在单个链中的几百条消息之后可能是非常糟糕的行为(但我实际上没有测试过)。

所以,我的问题是:1)这是App Engine的故意功能。 2)我应该避免这种类型的结构 - 或者它是否在某种程度上由App Engine内部有效处理? 3)您对实体链表实体类型的正确方法有什么建议吗?

谢谢你,亲切的问候 亚历

2 个答案:

答案 0 :(得分:1)

您使用的是python还是java?详细的答案将取决于您正在使用的API。

我很确定让你的密钥无限增长并不是最好的计划。 (虽然它可能是app引擎api的一个很好的测试用例:)

我认为解决方案是将实体组信息与消息链接信息分开。为了在线程/会话/链/事务上进行事务,所有消息都需要在同一个实体组中。但是,它们不需要处于与消息之间的链接结构完全匹配的层次结构中。您应该在平面结构中明确地将所有消息实体的父(实体组)设置为相同。因此,在实体组的意义上,每个实体都是其他实体的兄弟。您还需要实体中的字段链接到下一个(和/或上一个)消息。因此,就“前一条消息”链接而言,您仍然会有一个链表(或树或其他)。

Python和Java都有创建具有特定父/实体组的实体的方法。 (实际上,您甚至可以将不存在的实体指定为实体组层次结构的根目录!)

现在每条消息的密钥都是固定的长度,因此您的“下一个”和“上一个”引用属性将很好并且不会超出密钥长度的某些限制。

答案 1 :(得分:1)

按顺序:

  1. 是。每个实体都由其种类,密钥或ID及其所有父母的唯一标识,这意味着整个链是识别实体所必需的。
  2. 是。相反,有一个“对话”实体(也可能是第一个消息),它是所有帖子的直接父母。如果您仍然需要在对话中维护父/子关系(例如,不是仅按时间戳排序),请声明一个显式的SelfReferenceProperty。
  3. 见上文#2。