gpt4 book ai didi

sql-server - 构建类似于 Stackoverflow "Inbox"的功能的推荐方法是什么?

转载 作者:行者123 更新时间:2023-12-02 08:31:46 25 4
gpt4 key购买 nike

我有一个 asp.net-mvc 网站,人们管理一个项目列表。基于某种算法,我可以判断一个项目是否已经过时。当用户登录时,我希望它显示陈旧项目的数量(类似于我在收件箱中看到的更新数量)。

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

  • 为所有项目的所有者运行查询
  • 运行 IsStale() 算法
  • 显示 IsStale = true 时的计数

  • 我的猜测是这会很慢。此外,在项目编写的所有内容中,我都必须重新计算上述内容以查看是否发生更改。

    我的另一个想法是创建一个表并在几分钟内运行一项工作来计算陈旧的项目并将最新计数存储在此指标表中。然后在用户登录时查询。问题是我仍然必须保持该表同步,如果它每分钟只重新计算一次,如果人们更新项目,它在一分钟后才会更改该值。

    有没有一种快速、可扩展的方式来支持这个收件箱概念来提醒用户要查看的项目数量?

    最佳答案

    第一步始终是正确的需求分析。假设我是一名项目经理。我登录到系统,它按时显示我唯一的项目。一位开发人员来到我的办公室,告诉我他的事件有延迟。我选择开发人员的事件并更改其持续时间。系统还是按时显示我的项目,所以我很高兴地下类了。

    如果我在凌晨 3:00 接到客户的电话,要求我解释为什么项目不再按时进行,您认为我会有什么感觉?显然,相当惊讶,因为系统并没有以任何方式警告我。为什么会这样?因为我必须等待 30 秒(为什么不只有 1 秒?),以便下次运行计划作业来更新项目状态。

    这不能成为解决方案。必须立即向用户发送警告,即使运行 IsStale() 进程需要 30 秒。向用户显示 loading... 图像或其他任何内容,但要确保用户拥有准确的数据。

    现在,关于实现,没有什么可以逃避上一个问题:当影响某些截止日期的事情发生变化时,您将不得不运行该过程。但是,您可以做的并不是不必要地运行该进程。例如,您提到您可以在用户登录时运行它。如果 2 个或更多用户登录并看到同一个项目并且不做任何更改怎么办?没有必要运行该过程两次。

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

    优点

  • 无预定作业
  • 没有不需要的进程运行(这是有争议的,因为你可以在项目上设置一个 dirty 标志,并且只有在它是 true 时才运行它)
  • dirty
  • 没有不需要的查询
  • 用户将始终被告知项目的当前和真实状态(这是迄今为止提供的任何解决方案中最重要的项目)

  • 缺点
  • 如果用户更新一个项目,然后在几秒钟内再次更新它,该进程将运行两次(在轮询模式中,该进程甚至可能不会在该期间运行一次,具体取决于它已安排的频率)
  • 更新项目的用户必须等待进程完成

  • 更改为以与 StackOverflow 类似的方式实现通知系统的方式,这是一个完全不同的问题。我猜您与用户和项目之间存在多对多关系。最简单的解决方案是向这些实体(中间表)之间的关系添加单个属性:



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

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

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

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



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

    我希望我说的有些道理,或者给你一些其他更好的主意:)

    关于sql-server - 构建类似于 Stackoverflow "Inbox"的功能的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9661834/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com