2010-12-06 116 views
2

如果我有pojo喜欢categoryA - > subcategoryA - >书的关系。 子类别A是父类别A的子类。本书是子类别A 的孩子,在这种情况下,所有内容都在同一实体组中大表父母子女

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

+0

你可以发布课程吗?如果我将所有东西都归一化,那么每个属性都是 – 2010-12-06 08:53:11

回答

1

如果'书是子类别A的子类',并且您已通过将子类别A的键添加到书籍的键路径来对此进行建模,则您需要删除/重新创建书籍,或者您需要创建一个与子类型A具有相同键的子分类B了。这会影响所有其他的子书籍A的孩子。

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

对我来说这两种解决方案看起来都非常棘手,我建议你重新考虑一下你的设计。例如,您可以将subcatagoryA的密钥作为单独属性中的独立字段存储。这也有缺陷,你可以通过反规范化你的数据并直接存储(部分)子库A的数据来部分解决这个问题。

[编辑]

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

  • 店每个类别与性质的实体商店中的类别KEY +(某些)其它性能与你的书(S)
  • 如果一个类别的变化,更新所有非规范化的数据属于该类别的所有图书(使用存储的“外部”密钥来查找这些图书)
  • 使用cron作业检查背景中的一致性(即,前一作业在中途失败的情况下)
+0

。这也意味着,一个实体组只有一个实体。任何影响,如果我有太多独立的实体组... ...? – cometta 2010-12-06 13:22:29