【发布时间】:2011-09-05 00:58:40
【问题描述】:
我将以一个简化的 StackOverflow 系统为例。
虽然限制了某些功能,但可能会将问题和答案放在同一个表中:
(Django-esque pseudo-code)
QA table:
parent = ForeignKey(self)
category = ForeignKey(Category)
title = CharField()
description = TextField()
然后,要获取 ID 为 1 的问题的问题和答案,将对 id==1 或 parent==1 执行 SQL SELECT。缺点是 Answers 不使用 tags 和 title 字段
当然可以选择两张表:
Questions:
category = ForeignKey(Category)
title = CharField()
description = TextField()
Answers:
parent = ForeignKey(Questions)
description = TextField()
这需要两个查询才能获得问题和答案。
本能说前者是一个可怕的想法,但我不知道为什么。
哪个更快、更具可扩展性?
【问题讨论】:
-
可扩展性远不止这些因素。服务器上的负载、并发客户端的数量、索引策略、缓存策略和许多其他因素都会影响它。这个问题真的不好回答。
-
这种情况下的答案很可能是“这取决于您使用的数据库 + 版本 + 索引(+ 数据库可用内存量) - 所以分析并找出” .两种结构都只需要一个查询来提取问题和答案,并且两种选择语句都可以通过连接来完成。
-
“失败是 Answers 不使用标签和标题字段”——是的。 所以不要那样做。 从“好的”规范化数据库设计开始。问题会来,解决方案也会来。从“良好的基础”开始将减少需要处理的问题的数量,并增加解决方案完全专注于实际问题而不是不必要地引入的机会。 (只有在索引不能“选择”查询实际需要的行子集时,表的大小才非常相关。)
标签: sql database-design scalability scaling