3

我在 GAE 上将 Objectify 用于我的 DAO 层,我想让我的大部分实体都可以软删除,让这些实体使用 isActive 布尔值扩展父级是一个好主意,还是应该使用嵌入式还是应该只使用它接口isSoftDeleteable?

我要问的原因是,它似乎 Objectify 以相同的实体类型存储具有相同父类的实体(至少从我在 _ah/admin 中看到的)并且当所有内容都在相同的实体类型下时,它可能会减慢查询速度,也许?

哪个是最好的方法,或者是否有更好的方法在 GAE 中进行软删除?

请提前告知和感谢!

4

2 回答 2

5

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

一种选择是存储一个字段@Index(IfTrue.class) boolean active;,并将此过滤器添加到所有查询中:

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

这样做的缺点是它需要添加额外的索引 - 可能是几个,因为您现在可能需要多属性索引,而单属性索引就足够了。

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

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

于 2012-04-24T16:19:18.700 回答
1

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

每当您对实体类型的单个属性进行查询时,查询时间应该是相当可预测的,因为如果您考虑幕后发生的事情,您会在并行批量获取实体之前按顺序浏览项目列表数据。

于 2012-04-24T19:07:57.470 回答