sql-server – 建立类似于Stackoverflow的“收件箱”功能的建议方法是什么?

前端之家收集整理的这篇文章主要介绍了sql-server – 建立类似于Stackoverflow的“收件箱”功能的建议方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个asp.net-mvc网站,人们管理一个项目列表.根据一些算法,我可以判断一个项目是否过期.当用户登录时,我希望它显示过时的项目数量(类似于当我在收件箱中看到一些更新时).

计算陈旧项目的算法很慢,所以如果每次用户登录,我必须:

>运行对所有项目所在的所有项目的查询
>运行IsStale()算法
>显示IsStale = true的计数

我的猜测是真的很慢.此外,在项目编写的一切中,我将不得不重新计算上面的内容,看是否更改.

另一个想法是创建一个表,并在几分钟内运行一个工作来计算陈旧的项目,并将最新的计数存储在此度量表中.然后只需查询用户登录时的问题,我仍然需要保持该表格同步,如果每分钟只重新计算一次,如果人员更新项目,则一直不会更改该值.

任何想法,一个快速,可扩展的方式来支持这个收件箱的概念,提醒用户多个项目的审查?

解决方法

第一步总是适当的需求分析.假设我是项目经理.我登录到系统,并按时显示我唯一的项目.开发人员来到我的办公室,告诉我他的活动有延迟.我选择开发者的活动并更改其持续时间.系统仍然按时显示我的项目,所以我高兴地离开工作.

如果我在上午3:00收到一个电话,客户要求我解释为什么这个项目不再准时,你会觉得如何?显然,相当惊讶,因为系统没有以任何方式警告我.为什么会发生这种情况?因为我不得不等待30秒(为什么不只1秒?)下一次运行一个计划的作业来更新项目状态.

这不是一个解决办法.必须立即向用户发送警告,即使运行IsStale()进程需要30秒.向用户显示加载…图像或其他任何内容,但确保用户具有准确的数据.

现在,关于实现,没有什么可以做到逃避上一个问题:当一些影响一些到期日更改的时候,你必须运行该进程.但是,您可以做的不是不必要地运行该过程.例如,您提到您可以在用户登录时运行它.如果两个或更多用户登录并查看同一个项目并且不更改任何内容,该怎么办?没有必要运行这个过程两次.

此外,如果您确保在用户更新项目时运行该过程,则不需要在任何其他时间运行该进程.总而言之,与“轮询”解决方案相比,该模式具有以下优点和缺点:

优点

>没有计划的工作
>没有不需要的进程运行(这是可以争论的,因为你可以在项目中设置一个脏标志,只有当它是true时才运行)
>没有不必要的脏值查询
>用户将永远被通知项目的当前和实际状态(这是迄今为止所提供的任何解决方案中最重要的项目)

缺点

>如果用户更新项目,然后在几秒钟内再次升级,则进程将运行两次(在轮询模式中,该过程甚至可能在该时间段内不会运行一次,具体取决于已安排的频率)
>更新项目的用户将不得不等待该过程完成

更改为如何实现通知系统与StackOverflow类似,这是一个完全不同的问题.我想你与用户和项目有多对多的关系.最简单的解决方案是将一个属性添加到这些实体(中间表)之间的关系中:

基数:用户有很多项目.一个项目有很多用户

这样当您运行该过程时,您应该使用新结果更新每个用户的Has_pending_notifications.例如,如果用户更新项目并且不再及时,那么您应该设置为所有用户Has_pending_notifications为真,以便他们了解情况.同样,当项目准时进行时,将其设置为false(我知道您只是想确保在项目不再及时显示通知时).

以StackOverflow为例,当用户读取通知时,应将该标志设置为false.确保您不使用时间戳来猜测用户是否读取了通知登录并不意味着阅读通知.

最后,如果通知本身足够复杂,您可以将其从用户和项目之间的关系中移开,并进行如下操作:

基数:用户有很多项目.一个项目有很多用户.用户有很多通知.通知有一个用户.一个项目有很多通知.通知有一个项目.

我希望我说的话有意义,或者给你一些更好的主意:)

猜你在找的MsSQL相关文章