2

如果我有像 categoryA -> subcategoryA--> book 关系这样的 pojo。子类别 A 是父类别 A 的子类别。在这种情况下,书是子类别 A 的子类别,所有内容都在同一个实体组内

如果我需要将“书”移动到另一个子类别-B。我需要删除 subcategoryA 和 categoryA,然后重新创建 categoryA -> subcategoryA--> without book 吗?并重新创建 categoryb -> subcategoryb--> book ,other-book, other-book3 ?

4

1 回答 1

1

如果'book is child of subcategoryA'并且您通过将 subcategoryA 的键添加到 book 的键路径来对此进行建模,则您需要删除/重新创建 book,或者您需要使用与 subcategoryA 最初的键相同的键创建一个 subcategoryB。这将影响所有其他属于子类别 A 的子类别的书籍。

这是因为(引用 appengine 文档:“在数据存储区中创建实体时会分配完整的密钥,并且它的任何部分都不能更改。”)。

在我看来,这两种解决方案都相当棘手,我建议您重新考虑您的设计。例如,您可以将 subcategoryA 的键作为单独的字段存储在单独的属性中。这也有不利的一面,您可以通过对数据进行非规范化并将子类别A 的(部分)数据直接存储在书内来部分解决。

[编辑]

回答您的问题:小型实体组的缺点是您不能使用事务。这是否是一个问题取决于......您是否真的需要书籍+((子)类别的事务。当您想要更改某些非规范化数据时,会出现更大的非规范化问题。为此,您可以想出一个像这样的方案:

  • 将每个类别存储为具有属性的实体。将类别 KEY +(一些)其他属性与您的书一起存储。
  • 如果类别发生变化,则更新属于该类别的所有书籍的所有非规范化数据(使用存储的“外来”键来查找这些书籍)
  • 使用 cron 作业在后台检查一致性(即,前一个作业中途失败的情况)。
于 2010-12-06T08:26:28.473 回答