大表亲子

时间:2010-12-06 06:54:07

标签: java bigtable objectify

如果我有像类别A的pojo - > subcategoryA - >书的关系。 subcategoryA是父类别A的子元素。书是子类别A的孩子 在这种情况下,一切都在同一实体组内

如果我需要将'book'移动到另一个子类别-B。我需要删除子类别A和类别A,并重新创建categoryA - > subcategoryA - >没有书?并重新创建categoryb - > subcategoryb - >书,其他书,其他书3?

1 个答案:

答案 0 :(得分:1)

如果'book是subategoryA的子项'并且您已通过将子类别A的键添加到book的键路径来建模,则需要删除/重新创建book,或者需要使用与subatagoryA相同的键创建子目录B. 。这会影响所有其他属于子文章A的孩子的书。

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

对我来说这两个解决方案看起来都很棘手,我建议你重新考虑你的设计。例如,您可以将subcatagoryA的键存储为单独属性中的单独字段。这也有一些缺点,你可以通过对数据进行非规范化并直接存储(部分)subatagoryA的数据来解决这个问题。

[编辑]

回答您的问题:小型实体组的缺点是您无法使用交易。这是否是一个问题取决于...是否真的需要书籍上的交易+((子)类别。当你想要改变你的非规范化数据时,会出现更大的非规范化问题。为此,你可以想出一个这样的计划:

  • 将每个类别存储为具有属性的实体。将类别KEY +(某些)存储在您的图书中。
  • 如果类别发生变化,请更新属于该类别的所有书籍的所有非规范化数据(使用存储的“外国”键来查找这些书籍)
  • 使用cron作业检查后台的一致性(即前一个作业中途失败的情况)。