一位前同事坚持认为,一个数据库的表更多,每个表的列更少,比一个数据库的表较少,每个表的列数更多。例如,您将没有名称表,地址表,城市表等,而不是具有名称,地址,城市,州,邮政编码等列的客户表。
他认为这种设计更加有效和灵活。也许它更灵活,但是我没有资格评论它的效率。即使效率更高,我认为增加的复杂性可能会抵消这些收益。
因此,具有较少列的更多表相对于具有较多列的较少表有什么明显的好处吗?
Answers:
设计数据库时,我遵循一些非常简单的经验法则,我认为这些规则可用于帮助做出这样的决策...。
这些规则的通常结果是,初始设计将偏爱表而不是列,重点是消除冗余。随着项目的进展和非规范化点的确定,总体结构将朝着平衡的方向发展,以有限的冗余和色谱柱扩散为代价,以换取其他有价值的利益。
听起来不像是关于表/列的问题,而是关于规范化的问题。在某些情况下,高度规范化(在这种情况下为“更多表”)是好的且干净的,但是通常需要大量的JOIN才能获得相关的结果。有了足够大的数据集,这可能会降低性能。
Jeff就StackOverflow的设计写了一些有关它的内容。另请参阅Jeff链接到Dare Obasanjo的文章。
如果这些一对一关系中的任何一种将来可能变成一对多或多对多,则多表数据库要灵活得多。例如,如果您需要为某些客户存储多个地址,则拥有一个客户表和一个地址表会容易得多。我真的看不到这种情况,您可能需要复制地址的某些部分,而不需要复制其他部分,因此单独的地址,城市,州和邮政编码表可能会有点过头。
像其他一切一样:这取决于。
关于列数与表数没有硬性规定。
如果您的客户需要有多个地址,则可以使用一个单独的表。如果确实有充分的理由将City列标准化为其自己的表,那么也可以这样做,但是我以前从未见过,因为它是一个自由格式的字段(通常)。
表格繁重,规范化的设计在空间方面非常有效,看起来“教科书不错”,但会变得极其复杂。除非您必须进行12次联接才能获得客户的姓名和地址,否则它看起来不错。就最重要的性能而言,这些设计并非自动出色:查询。
尽可能避免复杂。例如,如果一个客户只能有两个地址(不能任意多个),那么将它们全部保留在一个表中就有意义(CustomerID,Name,ShipToAddress,BillingAddress,ShipToCity,BillingCity等)。
我会考虑将标准化作为第一步,因此将城市,县,州,国家/地区作为单独的列会更好... SQL语言的强大功能以及今天的DBMS-es允许您在以后需要查看数据时对数据进行分组它以其他一些非标准化的观点来看。
在开发系统时,如果您认为这是一项改进,则可以考虑“标准化”某些部分。
这有很多方面,但是从应用程序效率的角度来看,表有时会更高效。如果每次db进行操作时,如果有几个表具有一堆列,则有机会进行锁定,则在锁定期间将使更多数据不可用。如果锁升级到页面和表(最好不是表:)),您将看到它如何降低系统速度。
在设计数据库时,应该尽可能地远离数据的含义,而不是应用程序所需要的!
一个好的数据库设计应保持20年不变。
一个客户可能有多个地址,这就是事实。如果您决定在第一个发行版中您的应用程序被限制为一个地址,则与应用程序的设计有关,而不是数据!
如果要简化查询,最好有多个表而不是多个列,并使用视图。
大多数情况下,数据库的性能问题与网络性能(具有单行结果的链式查询,不需要的获取列等)有关,而与查询的复杂性无关。
很高兴看到这么多鼓舞人心且基础扎实的答案。
我的答案是(不幸的):这取决于。
两种情况:*如果您创建了一个将要使用多年的数据模型,因此可能不得不适应许多将来的更改:请使用更多的表,更少的行以及相当严格的规范化。*在其他情况下,您可以在更多表少行或更少表多行之间进行选择。特别是对于刚接触该主题的人们,后一种方法可以更直观,更容易理解。
对于面向对象方法和其他选项之间的选择,这同样有效。