Java 大桌子亲子

Java 大桌子亲子,java,bigtable,objectify,Java,Bigtable,Objectify,如果我有类似pojo的categoryA->subcategoryA-->图书关系。 子类别是父类别的子类别。书是子范畴的产物 在本例中,所有内容都在同一entitygroup中 如果我需要将“book”移动到另一个子类别-B。我需要删除子类别A和分类,并在没有book的情况下重新创建分类->子类别A-->吗?然后重新创建categoryb->subcategoryb-->图书,其他图书,其他图书3 如果“book是Subcategoria的子目录”,并且您通过将Subcategoria的键添加

如果我有类似pojo的categoryA->subcategoryA-->图书关系。 子类别是父类别的子类别。书是子范畴的产物 在本例中,所有内容都在同一entitygroup中


如果我需要将“book”移动到另一个子类别-B。我需要删除子类别A和分类,并在没有book的情况下重新创建分类->子类别A-->吗?然后重新创建categoryb->subcategoryb-->图书,其他图书,其他图书3

如果“book是Subcategoria的子目录”,并且您通过将Subcategoria的键添加到book的键路径来对此进行建模,则您需要删除/重新创建book,或者需要使用Subcategoria最初拥有的相同键创建Subcatagorib。这将影响所有其他子目录下的书籍

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

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

[编辑]

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

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

你能发布这些类吗?只要每个类的属性,我就可以将所有内容反规范化。这也意味着,一个entitygroup只能有一个实体。如果我有太多单独的entitygroup,会对这一点产生影响吗。。。?