-->

有什么更好的数据库设计:多个表列或多列? [关闭] 有什么更好的数据库设计:多个表列或多列?

2019-05-13 09:22发布

一位前同事坚持认为,与每个较少列的多个表的数据库是更好然后一个与每个多个列更少的表。 例如,而不是客户列表中的名称,地址,城市,州,邮编等栏目,你将有一个名称表,地址表,一个城市表等

他认为这种设计是更有效和灵活。 也许是更灵活,但我没有资格对其效率发表评论。 即使是更高效的,我觉得这些收益可以通过增加的复杂性所抵消。

所以,在那里与在具有多个列更少的表更少的列多表的任何显著的好处?

Answer 1:

我有拇指设计数据库,我认为可以用来帮助作出这样的决定时,我遵循的一些相当简单的规则....

  1. 青睐正常化。 反规范化是优化的一种形式,与所有必要的权衡,因此,应以走近YAGNI态度。
  2. 确保客户端代码引用数据库是从返工不必要对客户机的一个重大的重新设计架构脱钩足够。
  3. 不要害怕进行非规范化时,它提供了一个明确的好处表现或查询的复杂性。
  4. 使用视图或下游表来实现非规范化而不是非规范化架构的核心, 当数据量和使用场景允许它

这些规则通常的结果是,最初的设计将有利于在表列,重点是消除冗余。 随着项目的进展和非规范化点确定,整体结构将向着发展,在换取其他有价值的好处有限的冗余和列增殖妥协的平衡。



Answer 2:

我认为有利于更多的表,但只有达到一定点。 使用你的例子,如果你分开你的用户信息成两个表,据用户和地址,这让您可以灵活地为每位用户设置多个地址。 这方面的一个明显的应用是谁拥有独立的账单和发货地址的用户。

赞成有一个单独的CITY表的说法是,你只需要存储每个城市的名字一次,然后引用它,当你需要它。 这并减少重复,但在这个例子中,我认为这是矫枉过正。 这可能是更加节省空间,但是当你从数据库中选择数据连接,你会为此付出代价。



Answer 3:

这听起来并不那么像一个关于表/列,但关于规范化的问题。 在某些情况下具有高度的正常化 (在这种情况下,“更多的表”)是好的,干净的,但它通常需要大量的连接来获得相关的结果。 并配有足够大的数据集,这会拖垮性能。

杰夫写了一些关于这方面的StackOverflow的设计。 还看到帖子杰夫指向由敢于奥巴桑乔 。



Answer 4:

一个完全标准化的设计(即“其他表”)更灵活,更容易维护,避免数据的重复,这意味着你的数据的完整性将是一个更容易执行。

这些都是有力的理由正常化。 我会选择先校准,然后你只看到了性能成为一个问题后,非规范化特定的表。

我的经验是,在现实世界中,你将不会达到的地步,非规范化是必要的,甚至是非常大的数据集。



Answer 5:

这取决于你的数据库的味道。 MS SQL Server为例,更倾向于使用较窄的表。 这也是更为“正常”的做法。 其他引擎可能会围绕喜欢它的其他方式。 大型机趋于下降这一类。



Answer 6:

每个表应该只包含属于该唯一真实的主键标识的实体列。 如果数据库中的所有列是同一实体的所有属性,那么你只需要与所有列一个表。

如果有任何列也可以为空,但是,你需要把每一个空列到它自己的表的外键的主表中为了规范它。 这是一个常见的情况,所以对于一个清爽的设计,你likley比现有的表列以增加更多的表。 此外,通过将这些可选属性自己的表,他们将不再需要为允许空值和你避免NULL相关的问题摆。



Answer 7:

多表数据库是一个很大的灵活性,如果这些一对一的关系可能会变得一对多或多对多的未来。 例如,如果你需要存储多个地址的一些客户,这是一个容易得多,如果你有一个客户表和地址表。 我真的不能看到一个情况下,你可能需要复制一个地址的某些部分,但不是别人,那么独立的地址,城市,州和邮编表可能有点过分了。



Answer 8:

像其他事物一样:它依赖。

有关于列数VS表数没有硬性的规定。

如果您的客户需要有多个地址,然后为一个单独的表是有道理的。 如果你有一个很好的理由归市列到它自己的表,那么可以去了,但是我还没有看到过,因为它是一个自由格式字段(通常情况下)。

一张桌子重,归一化的设计是有效的在空间方面,看起来“教科书好”,但可以得到极其复杂。 直到你必须做12联接获得客户的姓名和地址,它看起来不错。 这些设计不是在性能才是最重要的术语自动美妙:查询。

避免复杂性如果可能的话。 例如,如果一个客户只能有两个地址(不要随意很多),那么它可能是有意义的只是让他们在一个单一的表(客户ID,姓名,ShipToAddress,BillingAddress,ShipToCity,结算城市,等等)。

这里是杰夫的职位上的话题。



Answer 9:

有来有较少的列的表的优势,但你也需要在你的情况看上面和回答这些问题:

将客户允许有1个多地址? 如果不是,则地址单独的表是没有必要的。 如果是这样,那么一个单独的表变得有用的,因为需要在路上,它变得更加困难多列添加到表中,您可以轻松地添加多个地址。



Answer 10:

我认为作为正常化的第一步,让市,县,州,国家将作为单独的列更好... SQL语言的力量,今天DBMS-ES在一起允许您将您的数据后,如果您需要查看它在一些其他的,非规范化的视图。

当正在开发的系统,你可能会如果你看到考虑“unnormalizing”某些部分,作为一个改进。



Answer 11:

我认为平衡是为了在这种情况下。 如果是有意义的把列在一个表中,然后把它放在桌子上,如果没有,那就不要。 你的同事的做法肯定会有助于将数据库规范化,但如果你有加入50桌合力得到你需要的信息可能不是非常有用的。

我猜我的回答是是,使用您的最佳判断。



Answer 12:

有很多面的这一点,但是从应用效率的角度微尘表有时可能更有效。 如果你每次有几张桌子和一帮柱的分贝为做到这一点具有使锁的机会的操作,更多的数据是由对锁的持续时间不可用。 如果锁升级获得页面和表格(以及希望不是表:)),你可以看到这会减慢系统。



Answer 13:

嗯。

我认为它的一洗,并取决于特定的设计模型。 绝对分解出具有比几场多出到自己表的实体,或者其化妆可能会改变,因为你的应用程序需求的变化(例如实体 - 我反正分解出的地址,因为它有这么多的领域,但我“D 特别是做,如果你想有你需要办理外国地址的任何机会,它可以是一个不同的形式,与电话号码相同)。

这就是说,你得到了它的工作,保持眼睛上的表现时。 如果你的是,你需要做大型,昂贵的加入,也许就变成了更好的设计决策,以旋转该表放回原纺的实体。



Answer 14:

有使用尽可能少的列可以查询巨大的好处。 但表本身可以有一个很大的数字。 杰夫说,这个事情也是如此。

基本上,确保你不要问比你更需要做一个查询时 - 查询的性能直接关系到你要的列数。



Answer 15:

我认为你必须看看那种你存储数据的您作出这样的决定。 有一个地址表是伟大的,但只有在多人共享相同地址的可能性是很高的。 如果每个人有不同的地址,保持数据在不同的表只是带来不必要的连接。

我没有看到有一个城市台的利益,除非他们自己的城市是你关心的实体在应用程序中。 或者,如果你想限制提供给用户的城市数量。

底线是,这样的决定让你开始拍摄的效率之前采取应用程序本身到考虑。 IMO。



Answer 16:

When you design your database, you should be as close as possible from the meaning of data and NOT your application need !

A good database design should stand over 20 years without a change.

A customer could have multiple adresses, that's the reality. If you decided that's your application is limited to one adresse for the first release, it's concern the design of your application not the data !

It's better to have multiple table instead of multiple column and use view if you want to simplify your query.

Most of time you will have performance issue with a database it's about network performance (chain query with one row result, fetch column you don't need, etc) not about the complexity of your query.



Answer 17:

首先,规范你的表。 这可以确保你避免冗余数据,让您的数据更少的行扫描,从而提高您的查询。 然后,如果你遇到了一个地步,你是加盟的标准化表导致查询采取长的过程(昂贵的加盟条款),非规范化更合适。



Answer 18:

很高兴看到这么多的启发和有据可依的答案。

我的答案是(不幸):这要看情况。

两种情况:*如果您创建一个数据模型将被使用多年,因此可能具有娴熟许多未来的变化:去多个表和更少的行和漂亮的严格标准化。 *在其他情况下,你可以更多的表,更少的行或更少的表,更多的行之间进行选择。 特别是对于人们比较新的课题最后这个方法可以更直观和容易理解。

同样是有效的面向对象的方法和其他选项之间的选择。



文章来源: What's the better database design: more tables or more columns? [closed]