Google App Engine/Objectify Soft Delete

Roy*_*han 3 java google-app-engine objectify

我在GAE上使用Objectify作为我的DAO层,我想让我的实体大部分都是软删除能力,使这些实体用isActive布尔扩展父类是一个好主意,还是我应该使用嵌入式或者我应该只使用它一个接口isSoftDeleteable?

我要问的原因是,Objectify似乎将Entity与同一个实体类中的同一个父类存储起来(至少从我在_ah/admin中看到的那个),并且当一切都在同一个实体类型下时它可能会减慢查询速度,也许?

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

请提前通知并提前致谢!

sti*_*ure 5

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

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

ofy.load().type(Thing.class).filter("size >", 20).filter("active", true)
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是它需要添加额外的索引 - 可能有几个,因为您现在可能需要多属性索引,其中单属性索引已经足够.

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

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