2012-04-24 49 views
3

我在GAE上使用Objectify为我的DAO层,我想让我的大部分实体软删除能够,这是一个好主意,使这些实体扩展一个父母与isActive布尔或我应该使用嵌入式还是应该让它成为isSoftDeleteable接口?谷歌应用引擎/ Objectify软删除

我想问的原因是,它似乎Objectify存储具有相同实体类中的相同父类的实体(至少从我在_ah/admin中看到的),并且它可能会减慢查询时,一切都在同一实体下善良,也许?

哪种方法最好,或者在GAE中有更好的软删除方法?

请提前告知并提前致谢!

+0

只有一个数据存储区。你可能意味着相同的实体类型。 – 2012-04-24 11:28:33

+0

是的......我的意思是相同的实体类型。感谢彼得的更正 – 2012-04-24 13:37:25

回答

5

这个问题没有单一的正确答案。最佳解决方案主要取决于您的实体在任何特定时间可能处于删除状态的百分比。

一种选择是存储领域像@Index(IfTrue.class) boolean active;和该过滤器添加到所有查询:

ofy.load().type(Thing.class).filter("size >", 20).filter("active", true) 

这样做的缺点是,它需要添加额外的索引 - 也可能是多个,因为你现在可能需要多属性单一财产指数可以满足的指标。

或者,您可以存储“已删除”标志并从查询结果中手动排除已删除的实体。需要维护的索引较少,但当您拉回不需要的记录时,它会为每个查询增加额外的开销。如果你删除的条目稀少,这不会有问题。

最后一招。您可能会发现最好将已删除日期的索引存储起来,因为它可能是最有用的:@Index Date deleted;这可让您filter("deleted", null)获得活动项目,并且还可以让您按datestamp进行过滤,以获取您可能希望清除的旧实体。但是,请注意,这会导致删除的日期索引到任何多属性索引,如果您的删除实体的百分比较高,可能会显着增加索引大小。在这种情况下,您可能希望@Index(IfNull.class) Date deleted;并使用map-reduce清除足够旧的实体。

+0

所以你的意思是最好只添加一个布尔字段到所有的实体和索引它们而不是有一个抽象/父类,并让我所有的实体扩展它? – 2012-04-24 18:46:50

+0

无论您为每个可删除类添加布尔/日期字段还是使每个可删除类扩展Deletable(具有布尔值/日期)都非常不重要。然而,除非你有一个令人信服的理由来模拟'isa'可删除,这听起来像是过度工程。你也可能遇到单继承问题。使用可删除界面可能会更好。 – stickfigure 2012-04-24 22:31:25

1

我同意StickFigure的回答。利用“空”索引和“空”索引之间的差异。权衡是每次写入都会产生更多的数据存储区写入操作 - 当您添加索引时,每次更新该值时至少需要2次额外的写入操作(升序和降序)索引。当你删除索引时,还有2次写入。就我个人而言,我认为这是值得的。

无论何时对实体类型的单个属性执行查询,查询时间都应该是相当可预测的,因为如果您考虑封面下方发生的情况,则在执行并行批次之前按顺序浏览项目列表获取实体数据。