Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 像这样的事情该怎么办';s选票计数是否存储在数据库中?_Mysql_Sql - Fatal编程技术网

Mysql 像这样的事情该怎么办';s选票计数是否存储在数据库中?

Mysql 像这样的事情该怎么办';s选票计数是否存储在数据库中?,mysql,sql,Mysql,Sql,我假设StackOverflow上的投票是用户和帖子之间的关系。计算每个页面加载的投票数会很昂贵,所以我假设它缓存在某个地方。是否有存储可从其他DB数据计算的值的最佳实践 我可以将其存储在Redis之类的东西中,但按投票对问题进行排序会很昂贵 我可以将其存储为posts表中的一个新列,但这会让其他工程师感到困惑,因为派生值通常不会与实际数据一起存储 我可以为派生数据创建一个实体属性值表,这样就可以将它与posts表连接起来。连接的性能受到了轻微的影响,我不喜欢用非结构化数据填充表的想法,因为

我假设StackOverflow上的投票是用户和帖子之间的关系。计算每个页面加载的投票数会很昂贵,所以我假设它缓存在某个地方。是否有存储可从其他DB数据计算的值的最佳实践

  • 我可以将其存储在Redis之类的东西中,但按投票对问题进行排序会很昂贵

  • 我可以将其存储为posts表中的一个新列,但这会让其他工程师感到困惑,因为派生值通常不会与实际数据一起存储

  • 我可以为派生数据创建一个实体属性值表,这样就可以将它与posts表连接起来。连接的性能受到了轻微的影响,我不喜欢用非结构化数据填充表的想法,因为它很容易被未使用的数据填充

  • 我使用的是MySQL 8,还有其他选择吗

    还有一个需要考虑的问题是,这些数据不需要保持一致,如果投票总数稍有下降就可以了。因此,在创建投票时,投票总数不需要立即更新,作业可以定期运行以更新投票。

    最佳做法在很大程度上取决于情况,并且通常基于意见。我是这样看的

    您的问题似乎是关于如何使数据库驱动的应用程序按规模运行,以及什么样的权衡是可以接受的

    首先,我会尽可能地坚持使用关系化、规范化的数据模型。你说“为每个页面加载计算选票会很昂贵”-可能没有那么贵,因为你将使用外键加入,除非你谈论的是非常大量的记录和/或请求,否则这应该可以很好地扩展

    如果可伸缩性和性能是一个挑战,我会构建一个测试平台,优化这些查询,对它们进行负载和性能测试,并在做任何其他事情之前添加硬件容量

    这是因为没有复制/缓存的标准化数据库和应用程序更容易维护,不太可能出现奇怪的错误,并且在将来更容易扩展

    如果你达到了不再工作的地步,我会看看缓存。这里有一系列的选择——你提到了3个。挑战在于,一旦您达到标准化数据库因为性能瓶颈而无法正常运行的程度,通常会有许多潜在的查询成为瓶颈-如果您优化“一篇文章获得多少选票?”查询,那么问题将转移到“有多少人浏览过这篇文章?”查询

    因此,在这一点上,我通常尝试通过在应用程序层缓存来限制对数据库的请求。这可以采取Redis缓存的形式。按有效性的降序排列,您可以:

    • 缓存整个页面。这大大减少了数据库的点击次数,但像这样的个性化网站很难做到这一点
    • 缓存页面片段,例如SO主页有几十个问题;您可以将每个问题缓存为HTML片段,并将这些片段组合起来呈现页面。这允许您通过为不同的用户组合不同的片段来创建个性化页面
    • 缓存查询结果。这意味着应用服务器需要解释查询结果并转换为HTML;这样做是为了缓存用于组装页面的数据。例如,您可以缓存“Leo Jiang的化身路径是x,并且他们在跟踪标记{a,b,c}”
    当然,缓存的问题在于失效以及性能和最新信息之间的权衡。在负载平衡器中,缓存不同步也会导致很多奇怪的错误