假设您正在为下一个堆栈溢出设计DB模式,更具体地说,是为模式中处理问题评级的部分设计DB模式。
我假设您会使用这样的表格:
评级(question_id、user_id、评级)
..。这将记录评分,并确保没有用户在同一问题上投票两次。
仅该表就可以处理评级数据,但它可能会导致查询速度较慢。
考虑到性能,您是否会考虑将每个问题的评分总和存储在问题表中,即使此数据是多余的,因为它是从评分表中的数据派生出来的?
发布于 2010-02-03 20:29:47
我通常会首先从标准化模型开始,而不是对问题表中的评级总和进行反标准化。
然后,当应用程序工作得足够好时,我会做一些性能测试,以确定应用程序处理负载是否足够好--与我期望的生产环境中的负载相比。
如果它不能很好地处理负载,我将检查瓶颈--并纠正最重要的瓶颈,直到应用程序运行良好。
一旦应用程序投入生产,如果网站有很多opf用户,就是时候做一些额外的优化了。
为了让事情变得简单:
最后,是的,也许,将评分总和反规范化到问题表可能会有所帮助;但你需要这样做吗?
这才是真正的问题;-)
发布于 2010-02-03 20:25:48
如果您计划预聚合表,那么看一下物化视图(T-SQL中的索引视图)是值得的。
发布于 2010-02-04 02:25:45
一般而言,如果您知道数据读操作比写操作频繁得多,那么这是存储聚合值的有效方法。在这种特定的情况下,我还会考虑以这种方式对answers表进行物理设计,这使得聚合变得便宜。为此,我将在query_id、answer_id上定义聚集索引。因此,只会从磁盘中读取几个DB页,以获取特定查询的所有答案。
https://stackoverflow.com/questions/2191774
复制相似问题