假设我有一个Asset实体,它本身与其他实体有多个关系,例如Category、Labels和Tag。如果满足某些条件,则Asset应该处于状态,让我们将其称为quarantine。
假设Asset在没有Category的情况下处于隔离状态。我该如何检查这种情况呢?
我可以在其实体isInQurantine中添加一个标志,并将其存储在持久化/更新中。这将使查询变得便宜。
我可以通过ArrayCollection的filter方法来修正它,但是这意味着加载所有的结果,然后减少结果集。这可能是一种更简单的方法,但我怀疑从长远来看,如果ArrayCollection变得很大,它会咬我一口。
最后,我偶然发现了学说过滤器,它似乎(还没有检查过,可能是完全错误的),我也可以进行过滤,而不需要一个db标志-约束将在水化之前应用。
我不知道该怎么做。
我想要一个同时兼顾性能(我认为不包括ArrayCollection过滤)和可维护性的解决方案。与今后一样,需求可能会发生变化,不仅仅包括缺乏类别。
至于可维护性,我认为我可以为Doctrine过滤器添加和删除过滤器似乎很好。
我希望有人建议解决方案有哪些优点和缺点,或者如果有什么办法我完全错过了。
发布于 2014-04-15 19:46:27
你基本上有三个选择:
显然,选项1完全没有意义。使用选项3,您可以很容易地进入损坏的应用程序状态(count/state标志与实际状态/count不匹配)。
现在有什么解决办法?您应该缓存选项2的结果。
创建一个postPersist / postUpdate / postRemove原则订阅服务器,在不让客户端等待的情况下触发结果缓存的更新。
或者在订阅服务器内执行kernel.terminate事件的缓存升温(在发送响应之后).或者在周期性执行的cronjob内部(即在用户活动较少的时候)。
这样您就可以确保结果绝对匹配一个真实的数据库状态,有最好的性能(没有数据库查询客户端必须等待).并且没有不必要的代码膨胀你的实体+增加复杂性。
https://stackoverflow.com/questions/23090186
复制相似问题