一位前同事坚持认为,一个数据库与更多的表与少列每个是好的那么一个较少的表中有更多列的每一个。例如,而不是一个客户表的姓名、地址、市、州、邮政编,等等。列,你会有一个名称表,有一个地址表,一个城市的表格,等等。

他认为这种设计更有效率和灵活性。也许是比较灵活,但我没有资格评论其效率。即使它更有效率,我认为这些收益可能被抵销增加的复杂性。

所以,是否有任何重大利益向更多的表与少列过少表与多个列?

有帮助吗?

解决方案

我有几个相当简单的规则的拇指,我遵循在设计的数据库,这是我觉得可以用来帮助做出决定等。

  1. 有利于正常化。非正规化是一种形式的优化,与所有必要的权衡,因此它应该有一个 YAGNI 态度。
  2. 确保客户代码引用的数据库中分离出足够的架构,改造它不需要重大的重新设计的客户(s)。
  3. 不要害怕非规范化时,它提供了一个明确的利益,表现或查询的复杂性。
  4. 使用的风景或下游表实施的非正规化而不是将核心的架构, 的时候数据量和使用情况允许它.

通常的结果,这些规则是,初步设计将有利于表列,重点是消除冗余。随着项目的进展和非正规化点被确定,整个结构走向一个平衡的妥协与有限的冗余和列扩散换取其他有价值的效益。

其他提示

我认为有利于多个表格,但只有达到某一点。用你的例子,如果你离你的用户的信息进入两个表,说的用户和地址,这个给你的灵活性,有多个地址的每用户。一个显而易见的应用,这是一个用户拥有单独记账和运输地址。

的参数,有利于具有一个独立的城市表将是的,你只需要储存每个城市的名字一次,然后把它当你需要它。这并减少重复,但在这个例子中,我认为这是大材小用。它可能是更高效的空间,但你会付出代价在加入时你选择的数据,从数据库。

它听起来不太像一个问题是关于表/列,但是有关正常化。在一些情况下具有高度的 规范化 ("多表"在这种情况下)是良好的,干净的,但它通常需要大量的加入,获得相关的结果。和一个足够大的数据集,这可能陷入困境下的性能。

杰夫写的 一些关于其有关设计的计算器.另见的后Jeff链接到过 敢奥巴桑乔.

一个完全准化设计(i。e时,"多个表格")更加灵活,更容易维护,并避免数据重复,这意味着数据的完整性将是一个很容易强制执行。

这些都是强有力的原因正常化。我会选择正常化的第一,那么只有非规范化 具体 你看到了,表现正在成为一个问题。

我的经验是,在现实世界,你不会达到非正规化是必要的,甚至具有非常大的数据集。

这取决于你的数据库的味道。MS SQL服务器,例如,往往更喜欢较窄表。这也是更多的归一化'的方法。其他发动机可能会喜欢它的其他方式。大型机往往属于这一类。

每个表格应只包括列有关的实体的唯一确定的主要关键。如果所有列数据库中的所有属性相同的实体,那么你只需要一个表所列。

如果任何列可null,虽然,你需要把每个nullable列入其自己的表与外国的关键主要表以正常化。这是一个常见的情况,因此,对于一个更清洁的设计,你在likley要添加更多表的比列,以现有的表格。此外,通过将这些可选属于他们自己的桌,他们将不再需要允许空值和避免大量的空有关的问题。

多表格数据库是一个很大的灵活,如果任何这些一对一的关系可能成为一个为许多人或许多许多的未来。例如,如果需要保存的多个地址对于一些客户,这是一个容易多了如果你有一个客户表和一个地址表。我真的不能看到的情况下,你可能需要重复一些零部件的地址,但不是其他的,所以独立地址、城市、国家和邮政编码的表格可有点过了

像一切:它依赖。

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

如果你的客户的需要有多个地址,然后单独表是有道理的。如果你有一个很好的原因正常化的城市列入其自己的表格,然后,可以去,但是我还没有看到,因为这是一个免费的形式领域(通常)。

表重,标准化的设计是有效的空间,看起来"的教科书-好的"但是,可以得到极其复杂的。它看起来很好直到你需要做的12个连接,以获得客户的姓名和地址。这些设计是不是 自动 梦幻般的性能而言,最重要的事情:查询。

避免的复杂性,如果可能的。例如,如果客户只能有两个地址(无任意的许多),那么它可能会使意义的只是让他们都在一个单一的表格(客户Id,Name,ShipToAddress、BillingAddress ShipToCity,BillingCity,等等)。

这是杰夫的职位 在主题。

还有的优点是具有表列数更少,但也需要看你的方案上面,并回答这些问题:

客户会被允许有超过1的地址吗?如果没有,那么一个单独的表格用的地址不是必要的。如果是这样,然后单独表成为有用的,因为你可以很容易地增加更多的地址,作为所需要的道路,它变得更加难以加入更多的列表。

我会考虑的正常化作为第一步,使城市、县、国家、国家将更好地为单独列...电SQL语言,连同今天DBMS-es可以让你组数据之后,如果你需要看它在某些其他非标准化图。

当该系统正在开发的,可以考虑'unnormalizing'的某些部分,如果你认为这是一种改进。

我觉得平衡是为了在这种情况。如果它是有意义的投入列在表中,然后把它放在桌上,如果没有,则没有。你的同事的办法肯定会有助于正常化的数据库,但这可能不是非常有用的,如果你要加入50表一起得到你需要的信息。

我猜是什么我的回答将是,用你最好的判断。

有许多方面,但从一个应用程序效率的角度看莫特的表可以更有效的时候。如果你有几个表格有一堆列每一次数据库做一个运作,它有一个机会,使锁,更多的数据是制期间不可用的锁。如果锁定得到升级到网页和表格(以及希望不表:))你可以看到如何这样可以慢下来的系统。

嗯。

我认为它的洗一洗,并取决于你的特别设计的模型。肯定因素的实体,有超过几个领域推进入他们自己的桌上,或实体的构成将可能改变你的应用程序的要求的变化(例如-我会的因素出地址不管怎么说,因为它有这么多的领域,但是我会 尤其是 做到这一点,如果你想有任何机会,你会需要处理外国地址,它可以是一个不同的形式。相同的电话号码)。

这就是说,当你得到了它的工作,保持眼睛上的性能。如果你纺实体出,需要做大的、昂贵的加入,也许它成为一个更好的设计决定的旋,表回到原来的。

有巨大的好处 查询 使用列为可能。但该表本身可以有一个大的数字。 杰夫 说什么对此如此。

基本上,确保你不要问为比你更需要这样做时查询的性能查询的数量直接相关的列要求。

我认为你必须看看这样的数据存储在你做出这一决定。有一个地址表是巨大的,但只有如果可能多的人共享同样的地址是高的。如果每个人都有不同的地址,保持该数据在不同的表刚才介绍了不必要的联接。

我不见的利益,有一个城市表,除非城市在自己的实体,你在关心您的应用程序。或者如果你想的数量限制的城市提供给用户。

底线是决定这样已经采取的应用程序本身进入到考虑之前你开始拍摄的效率。国际海事组织。

当你设计数据库,应尽可能靠近自意义的数据并不是你的应用程序所需要的!

一个好的数据库的设计应超过20年来没有改变。

客户可能会有多个地址,那就是现实。如果你决定这就是你的应用仅限于一个adresse的第一个版本,它关注的设计应用程序不一的数据!

这是更好地以有多种表,而不是多个列和使用查看如果你想要简化您的查询。

大多数时间你将有效的问题与一个数据库,这是关于网络性能(查询链的一个行结果,取柱,你不需要,等等)不在于复杂的查询。

第一,恢复正常你的表。这将确保你避免的冗余数据,给你小行的数据扫描,这提高了你的查询。然后,如果你碰到一个点,在那里的归一化的表格你接造成的查询,以采取对长期的过程(昂贵的加入条款),非规范化那里更合适。

好的看到那么多鼓舞人心和良好的基础的答案。

我的答案是(不幸的是):它依赖。

两种情况:*如果你创建的一个datamodel,将用于多年,因此可能有许多娴熟的未来的变化:去更表和低排和相当严格的正常化。*在其它情况下你可以选择之间更多的桌子-不行,或者少表更多行。尤其是对人民相对较新的主题这一最后的办法可更直观,很容易理解。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top