我将以简化的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。失败的原因是答案
tags
和title
字段
另一种选择当然是两个表:
Questions:
category = ForeignKey(Category)
title = CharField()
description = TextField()
Answers:
parent = ForeignKey(Questions)
description = TextField()
这需要两个查询才能获得问题和答案。
Instinct说前者是一个可怕的想法,但我不确定为什么。
哪种更快,更具可扩展性?
答案 0 :(得分:2)
我认为这里没有一个好的答案。根据我的拙见,最好的答案是它取决于它。例如,如果您将问题和答案放在两个单独的表中,那么您将自己限制在该模型中。例如,您不能在某种层次结构中具有子答案或子问题。这可能没问题,但可能不一定适合您的环境。
就个人而言,我试着看一下情况和数据。如果我必须存储与答案相比的问题的不同数据(或者如果我必须为两个不同的目的使用相同的列),我改为创建两个表。如果数据相同并且总是相同,我将它存储在一个表中。
然而,除了这种有限的数据库模式视图之外,还需要考虑更大的图景。例如,什么是最适合您的存储引擎?什么是最适合您的硬件?对于备份?存档?性能和可扩展性取决于许多因素。这是开始讨论的好地方,但它只是冰山一角。
答案 1 :(得分:2)
直接回答你的问题,你的直觉是正确的。将实体(问题和答案)混合到一个表中几乎总是一个坏主意。从逻辑上讲,它们是两个独立的实体,实际上它们应该分开。
你的第二个解决方案是正确的。使用索引和外键通过问题ID链接2个表将允许您选择任何问题的所有答案。这将更快,并且除了对将来必须使用该结构的任何人更容易理解之外,还会更好地扩展。