一位前同事坚称拥有更多表格且每个表格的列数更少的数据库比拥有更少表格且每个表格的列数更多的数据库更好。例如,您将拥有一个名字表、一个地址表、一个城市表等,而不是一个客户表格,其中包含名称、地址、城市、州、邮政编码等列。
他认为这种设计更高效和灵活。也许它更灵活,但我无法评论其效率。即使它更有效率,我认为增加的复杂性可能会抵消这些收益。
那么,相对于少量表格但每个表格包含更多列,是否有更多表格但每个表格包含更少列的重要优势呢?
一位前同事坚称拥有更多表格且每个表格的列数更少的数据库比拥有更少表格且每个表格的列数更多的数据库更好。例如,您将拥有一个名字表、一个地址表、一个城市表等,而不是一个客户表格,其中包含名称、地址、城市、州、邮政编码等列。
他认为这种设计更高效和灵活。也许它更灵活,但我无法评论其效率。即使它更有效率,我认为增加的复杂性可能会抵消这些收益。
那么,相对于少量表格但每个表格包含更多列,是否有更多表格但每个表格包含更少列的重要优势呢?
我在设计数据库时遵循几个相当简单的经验法则,我认为这些法则可以用于帮助做出像这样的决策...
这些规则的通常结果是,初始设计将偏向于表而不是列,并专注于消除冗余。随着项目的进展和非范式化点的确定,整体结构将朝着在有限的冗余和列扩展换取其他有价值的收益之间妥协的平衡发展。
这似乎不是关于表/列的问题,而是有关规范化的问题。在某些情况下,具有高度规范化(在此情况下为“更多表”)是好的和干净的,但通常需要大量JOIN才能获得相关结果。而且对于足够大的数据集,这可能会降低性能。
Jeff 在 StackOverflow 设计方面写了一些内容,可以参考他引用的Dare Obasanjo的文章。
我认为增加更多的表是可以的,但只能到一定程度。以你的例子为例,如果你将用户信息分成两个表,比如用户表和地址表,这样就可以让一个用户拥有多个地址了。其中一个显而易见的应用场景就是有一个用户需要拥有不同的账单和邮寄地址。
支持使用单独的城市表的观点是,你只需存储每个城市的名称一次,然后在需要时引用它即可。虽然这样可以减少重复,但在这个例子中,我认为这种方法过于复杂了。虽然可以更节省空间,但当你从数据库中选择数据时会付出连接查询(join)的代价。
这取决于你的数据库类型。例如,MS SQL Server 倾向于使用较窄的表格,这也是更规范化的方法。其他数据库引擎可能会倾向于相反的方式。大型机往往属于这一类别。
像其他事情一样:这取决于情况。
关于列数与表数之间的硬性规定并不存在。
如果您的客户需要拥有多个地址,则单独创建一个表是有意义的。如果您有很好的理由将City列规范化为自己的表,那么也可以这样做,但我以前从未见过,因为它是自由格式字段(通常情况下)。
表数量多、规范化的设计在空间上非常高效,看起来“教科书式”,但可能变得非常复杂。它看起来很好,直到你不得不进行12次连接才能获得客户的姓名和地址。这些设计在最重要的查询性能方面并不自动表现出色。
如果可能的话,请尽量避免复杂性。例如,如果一个客户只能拥有两个地址(而不是任意多个),那么将它们全部保存在一个表中可能是有意义的(CustomerID、Name、ShipToAddress、BillingAddress、ShipToCity、BillingCity等)。
如果这些一对一关系中的任何一个在将来可能变成一对多或多对多,那么多表数据库会更加灵活。例如,如果您需要为某些客户存储多个地址,则拥有客户表和地址表会更容易。我真的看不出你可能需要复制地址的某些部分但不是其他部分的情况,因此单独的地址、城市、州和邮政编码表可能有点过头了。
减少表格列数有其优点,但您还需要查看上述场景并回答以下问题:
客户是否被允许拥有多个地址?如果不是,那么地址的单独表格就不是必需的。如果是,那么单独的表格变得很有用,因为您可以根据需要随时轻松添加更多的地址,而向表格添加更多的列则变得更加困难。