【问题标题】:Google App Engine / Objectify Soft DeleteGoogle App Engine / Objectify 软删除
【发布时间】:2012-05-05 00:38:07
【问题描述】:

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

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

在 GAE 中进行软删除是最好的方法还是有更好的方法?

请提前告知并感谢!

【问题讨论】:

  • 只有一个数据存储。您可能是指相同的实体种类。
  • 是的……我的意思是同一种实体。感谢彼得的更正

标签: java google-app-engine objectify


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    一种选择是存储@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 清除足够旧的实体。

    【讨论】:

    • 所以你的意思是最好向所有实体添加一个布尔字段并为其编制索引,而不是拥有一个抽象/父类并让我的所有实体扩展它?
    • 您是否将布尔/日期字段添加到每个可删除类或使每个可删除类扩展可删除(具有布尔/日期)是无关紧要的。但是,除非您有令人信服的理由来模拟“isa”可删除,否则这听起来像是过度工程。您也可能会遇到单继承问题。使用可删除接口可能会更好。
    猜你喜欢
    • 2011-06-19
    • 2014-08-09
    • 1970-01-01
    • 2023-03-22
    • 2016-03-25
    • 1970-01-01
    • 2012-06-14
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多