数据库可伸缩性:哪个更重要,表的大小或查询数量?

时间:2011-05-30 20:08:52

标签: sql database-design scalability scaling

我将以简化的StackOverflow系统为例。

虽然限制了某些功能,但可能会将问题和答案放在同一个表中:

(Django-esque pseudo-code)

QA table:
    parent = ForeignKey(self)
    category = ForeignKey(Category)
    title = CharField()
    description = TextField()

然后,要获得ID为1的问题的问题和答案,将为id==1parent==1执行SQL SELECT。失败的原因是答案

未使用tagstitle字段

另一种选择当然是两个表:

Questions:
    category = ForeignKey(Category)
    title = CharField()
    description = TextField()

Answers:
    parent = ForeignKey(Questions)
    description = TextField()

这需要两个查询才能获得问题和答案。

Instinct说前者是一个可怕的想法,但我不确定为什么。

哪种更快,更具可扩展性?

2 个答案:

答案 0 :(得分:2)

我认为这里没有一个好的答案。根据我的拙见,最好的答案是它取决于它。例如,如果您将问题和答案放在两个单独的表中,那么您将自己限制在该模型中。例如,您不能在某种层次结构中具有子答案或子问题。这可能没问题,但可能不一定适合您的环境。

就个人而言,我试着看一下情况和数据。如果我必须存储与答案相比的问题的不同数据(或者如果我必须为两个不同的目的使用相同的列),我改为创建两个表。如果数据相同并且总是相同,我将它存储在一个表中。

然而,除了这种有限的数据库模式视图之外,还需要考虑更大的图景。例如,什么是最适合您的存储引擎?什么是最适合您的硬件?对于备份?存档?性能和可扩展性取决于许多因素。这是开始讨论的好地方,但它只是冰山一角。

答案 1 :(得分:2)

直接回答你的问题,你的直觉是正确的。将实体(问题和答案)混合到一个表中几乎总是一个坏主意。从逻辑上讲,它们是两个独立的实体,实际上它们应该分开。

你的第二个解决方案是正确的。使用索引和外键通过问题ID链接2个表将允许您选择任何问题的所有答案。这将更快,并且除了对将来必须使用该结构的任何人更容易理解之外,还会更好地扩展。