【问题标题】:How to handle count of how many times some events occurs?如何处理某些事件发生的次数?
【发布时间】:2018-01-29 22:39:02
【问题描述】:

尝试获得处理书籍“我喜欢”多少次的最佳实践。假设现在,我有很多系列的书,每个系列都可以有很多书。现在,当人们对一本书点击“我喜欢”时,我想给这本书加 1,同时也给系列加 1,以便稍后我可以相应地渲染这些数字。现在,我在两个方面苦苦挣扎。

1)当点击一本书时,我会在 book 表的“liked”列上加 1,同时在 series 表中的“liked”列上加 1。

2)当点击一本书时,我只在书表的“喜欢”列上添加 1。当我尝试渲染该系列的编号时,我会在属于该系列的书籍的“喜欢”列上进行 SUM。

不过,两者各有利弊。 1) 方式,当我尝试显示有多少人喜欢整个系列时,我可以简单地获取系列表的“喜欢”列。这将比 2) 方式有效,因为不需要聚合,尤其是当许多人尝试渲染系列页面时。但是,当我们单击“我喜欢”按钮时,这将需要更多的努力。因为即使人们点击不同的书。只要这些书属于同一系列,就需要更新系列的编号。这将是并发过程。相反,如果当人们点击“我喜欢”这本书时,我没有在系列表上进行更新。在那个级别上它会更有效,但是当许多人尝试加载相同的系列页面时会浪费大量的精力来进行冗余聚合计算,其中显示了该系列的“喜欢”数字。

还有其他想法吗?如果不是,有什么更好的解决方案? 1)还是2)?提前致谢。

【问题讨论】:

    标签: java performance processing-efficiency


    【解决方案1】:

    使用 HttpSession

    HttpSession session = request.getSession(false);
    if (session == null) {
        // store value in session
    }
    else {
        // read value from session
    }
    

    另一种选择是将 Redux 用于更大的单页应用程序,但前提是有意义。

    【讨论】:

    • 您选择了最佳答案吗?
    【解决方案2】:

    使用 RDBMS,您应该关注data integrity。如果不是在单个事务中完成,第一种方法可能会引入更新异常。无论如何,您将在系列计数器上具有高并发性。所以我更喜欢第二种方法。

    仅当您的解决方案缺乏性能时,才以denormalization 开头。

    【讨论】:

      【解决方案3】:

      我建议使用数据库。你可以有一个书本表和一个喜欢表。当有人喜欢一本书时,您可以获取他们喜欢的书籍的 id 并将其添加到喜欢表中。

      这样,您还可以存储喜欢它的人的名字,并阻止他们喜欢超过两次,您还可以让他们选择删除他们的喜欢。 例如:

      图书桌:

      id、书名、作者(以及任何其他信息)

      点赞表:

      id、用户名、book_id、日期

      那么在统计一本书的点赞数时,可以查询数据库,统计其中 book_id = 的行数。

      【讨论】:

        【解决方案4】:

        将数据保存在数据库中,否则服务器重启时会丢失数据。

        【讨论】:

          【解决方案5】:

          我更喜欢第二种方法。那里的逻辑更有意义。不用每次点击图书时给系列加 1,您只需将系列的总点赞数加起来即可。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-10-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-26
            相关资源
            最近更新 更多