为了提高性能,在DB中允许冗余数据

时间:2010-02-03 12:21:36

标签: performance database-design rating-system

假设您正在为下一个堆栈溢出设计数据库架构,更具体地说是处理问题评级的架构部分。

我假设您使用的表格如下:
评级(question_id,user_id,rating)
...这将记录评级并确保没有用户在同一问题上投票两次。

仅此表可以处理评级数据,但可能会导致查询速度变慢。

考虑到性能,您是否会考虑在问题表中存储每个问题的评级总和,即使这些数据是多余的,因为它是来自评级表中的数据?

3 个答案:

答案 0 :(得分:6)

我通常首先从标准化模型开始,而不是对问题表中的评级总和进行去标准化。

然后,当应用程序运行良好时,我会做一些性能测试,以确定应用程序是否处理足够好的负载 - 与我期望在生产中的负载相比。

如果它不能很好地处理负载,我会检查瓶颈 - 并纠正最重要的瓶颈,直到应用程序运行良好。

一旦应用程序投入生产,如果网站有很多opf用户,那么现在是时候进行一些额外的优化了。


简单来说:

  • 不要过度优化
  • 让您的应用程序正常运行
  • 一旦有效,将其作为基准
  • 如果/在需要时,优化


最后,是的,也许,将问题表中的评级总和去标准化可能会有所帮助;但你需要这样做吗?

这是真正的问题; - )

答案 1 :(得分:0)

如果您计划预先聚合表,那么值得查看物化视图(T-SQL中的索引视图)。

答案 2 :(得分:0)

一般而言 - 如果您知道数据的读取频率高得多,那么它是存储聚合值的有效方法。 在这个特定的情况下,我还会考虑在答案表中进行phisical设计,这使聚合变得便宜。为此,我将在query_id,answer_id上定义聚簇索引。 因此,只会从磁盘读取几个DB页面,以获取特定查询的所有答案。

相关问题