假设您正在为下一个堆栈溢出设计数据库架构,更具体地说是处理问题评级的架构部分。
我假设您使用的表格如下:
评级(question_id,user_id,rating)
...这将记录评级并确保没有用户在同一问题上投票两次。
仅此表可以处理评级数据,但可能会导致查询速度变慢。
考虑到性能,您是否会考虑在问题表中存储每个问题的评级总和,即使这些数据是多余的,因为它是来自评级表中的数据?
答案 0 :(得分:6)
我通常首先从标准化模型开始,而不是对问题表中的评级总和进行去标准化。
然后,当应用程序运行良好时,我会做一些性能测试,以确定应用程序是否处理足够好的负载 - 与我期望在生产中的负载相比。
如果它不能很好地处理负载,我会检查瓶颈 - 并纠正最重要的瓶颈,直到应用程序运行良好。
一旦应用程序投入生产,如果网站有很多opf用户,那么现在是时候进行一些额外的优化了。
简单来说:
最后,是的,也许,将问题表中的评级总和去标准化可能会有所帮助;但你需要这样做吗?
这是真正的问题; - )
答案 1 :(得分:0)
如果您计划预先聚合表,那么值得查看物化视图(T-SQL中的索引视图)。
答案 2 :(得分:0)
一般而言 - 如果您知道数据的读取频率高得多,那么它是存储聚合值的有效方法。 在这个特定的情况下,我还会考虑在答案表中进行phisical设计,这使聚合变得便宜。为此,我将在query_id,answer_id上定义聚簇索引。 因此,只会从磁盘读取几个DB页面,以获取特定查询的所有答案。