>运行对所有项目所在的所有项目的查询
>运行IsStale()算法
>显示IsStale = true的计数
我的猜测是真的很慢.此外,在项目编写的一切中,我将不得不重新计算上面的内容,看是否更改.
另一个想法是创建一个表,并在几分钟内运行一个工作来计算陈旧的项目,并将最新的计数存储在此度量表中.然后只需查询用户登录时的问题,我仍然需要保持该表格同步,如果每分钟只重新计算一次,如果人员更新项目,则一直不会更改该值.
解决方法
如果我在上午3:00收到一个电话,客户要求我解释为什么这个项目不再准时,你会觉得如何?显然,相当惊讶,因为系统没有以任何方式警告我.为什么会发生这种情况?因为我不得不等待30秒(为什么不只1秒?)下一次运行一个计划的作业来更新项目状态.
这不是一个解决办法.必须立即向用户发送警告,即使运行IsStale()进程需要30秒.向用户显示加载…图像或其他任何内容,但确保用户具有准确的数据.
现在,关于实现,没有什么可以做到逃避上一个问题:当一些影响一些到期日更改的时候,你必须运行该进程.但是,您可以做的不是不必要地运行该过程.例如,您提到您可以在用户登录时运行它.如果两个或更多用户登录并查看同一个项目并且不更改任何内容,该怎么办?没有必要运行这个过程两次.
此外,如果您确保在用户更新项目时运行该过程,则不需要在任何其他时间运行该进程.总而言之,与“轮询”解决方案相比,该模式具有以下优点和缺点:
优点
>没有计划的工作
>没有不需要的进程运行(这是可以争论的,因为你可以在项目中设置一个脏标志,只有当它是true时才运行)
>没有不必要的脏值查询
>用户将永远被通知项目的当前和实际状态(这是迄今为止所提供的任何解决方案中最重要的项目)
缺点
>如果用户更新项目,然后在几秒钟内再次升级,则进程将运行两次(在轮询模式中,该过程甚至可能在该时间段内不会运行一次,具体取决于已安排的频率)
>更新项目的用户将不得不等待该过程完成
更改为如何实现通知系统与StackOverflow类似,这是一个完全不同的问题.我想你与用户和项目有多对多的关系.最简单的解决方案是将一个属性添加到这些实体(中间表)之间的关系中:
这样当您运行该过程时,您应该使用新结果更新每个用户的Has_pending_notifications.例如,如果用户更新项目并且不再及时,那么您应该设置为所有用户Has_pending_notifications为真,以便他们了解情况.同样,当项目准时进行时,将其设置为false(我知道您只是想确保在项目不再及时显示通知时).
以StackOverflow为例,当用户读取通知时,应将该标志设置为false.确保您不使用时间戳来猜测用户是否读取了通知:登录并不意味着阅读通知.
最后,如果通知本身足够复杂,您可以将其从用户和项目之间的关系中移开,并进行如下操作:
基数:用户有很多项目.一个项目有很多用户.用户有很多通知.通知有一个用户.一个项目有很多通知.通知有一个项目.
我希望我说的话有意义,或者给你一些更好的主意:)