Google app engine 应用程序引擎-实体链生成超长的实体键

Google app engine 应用程序引擎-实体链生成超长的实体键,google-app-engine,key,parent,Google App Engine,Key,Parent,我正在编写一个应用程序,允许用户在他们之间发送消息。我使用事务来确保任意两个用户之间只有一条“top”消息,并且此“top”消息具有指向“next”消息的链接,依此类推。。形成一种消息链接列表。这些消息通过引用属性相互引用,并通过声明每个新的“top”a并将以前的“top”作为其父级而放置在同一实体组中 但是,这种方法的问题是,每个新实体都有一个键,其中包含前一个实体的整个键(即:new_top_key==old_top_key+new_stuff)。这会导致实体键以很快的速度增长,并且在单个链

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

但是,这种方法的问题是,每个新实体都有一个键,其中包含前一个实体的整个键(即:new_top_key==old_top_key+new_stuff)。这会导致实体键以很快的速度增长,并且在单个链中发送几百条消息后可能会出现非常糟糕的行为(但我还没有实际测试)

所以,我的问题是:1)这是应用程序引擎的故意功能吗。2) 我应该避免这种类型的结构吗?还是由应用程序引擎内部高效地处理?3) 对于实体类型结构的链表,您有什么建议吗

谢谢你和亲切的问候
Alex

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

我敢肯定,让你的钥匙无限期增长不是最好的计划。(这可能是应用程序引擎api的一个很好的测试用例:)

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

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

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

按顺序:

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

  • alexander,我用GoogleAppEngine重新标记了你的问题,这是AppEngine的标准标签。破折号将其转换为一个标记,而不是像“app”和“engine”那样的单独标记。