当SQL数据库需要更多的规范化时,您如何知道?

6

当您试图获取数据时,没有明显简单的方法来完成它,这就是需要使用技巧的时候吗?

当您发现某些内容应该独立成表格时,是吗?

有哪些相关法律规定?

13个回答

7

请查看维基百科,这篇文章讲述了数据库正规化及其不同形式(第一、第二、第三等)。大多数情况下,您应该至少达到第三范式。有时候您可能想要放松规则(例如,连接多个表可能太昂贵,因此需要适当地去正规化),但在大多数情况下,第三范式是最好的。


实际上,在正式语言中可以定义三种常规形式。而且你不需要采取任何行动,只需遵循规则并应用它们即可。 - St.Shadow

6
当你注意到需要重复相同的数据,或者当你开始将单个字段用作数组时。

3
当你发现数据没有足够规范化时,这可能是一个有点嘲讽的答案。网上有很多关于规范化级别(或更确切地说,“形式”)的资源,它们更完整地描述了这些形式,而我在这里无法做到。第一和第二范式应该是必须的。如果你没有达到第三(或者真正的第四)范式,你需要有一个强有力的理由。
请查看维基百科关于数据库规范化的文章

2

当你开始质疑一个SQL数据库是否需要更多的规范化时。


2
每当你有一个关系型数据库时...<grin/> 不,实际上存在着法则,可以查看这个维基百科链接
它们被称为五个范式或类似的东西。最初是由在50年代/60年代发明关系型数据库的人E. F. Codd提出的。
"The key the whole key and nothing but the Key, so help me Codd"
这是一个概要:
第一范式(1NF)表格忠实地表示关系并且没有重复的组。 第二范式(2NF)表格中没有非主属性是函数依赖于候选键的一个部分(真子集)。 第三范式(3NF)每个非主属性都不是传递依赖于表格的每个键。表格中的每个非平凡功能依赖都是超键上的依赖关系。 第四范式(4NF)表格中的每个非平凡多值依赖都是超键上的依赖关系。 第五范式(5NF)表格中的每个非平凡连接依赖都是由表格的超键所暗示的。域/键正常形式(DKNF)罗纳德·法金(1981)[19]表格上的每个约束都是表格的域约束和键约束的逻辑结果。 第六范式(6NF)表格根本没有非平凡的连接依赖(涉及广义连接运算符)。

哈哈!那是从哪里冒出来的?谢啦! - Charles Bretana

2

其他人已经向您介绍了规范化的正式规则。以下是我使用的一些非正式指南:

  1. 如果您在表中有列名仅以数字不同的列(例如Phone1和PHone2)。

  2. 如果您在表中有任何应该只填写另一列填写时才能填写的列。

  3. 如果更新数据库中的“事实”(如街道地址)需要多个UPDATE操作。

  4. 如果同一个问题可能会根据您获取信息的表格而得到两个不同的答案。

  5. 如果任何非平凡问题的答案可以从数据库中获得,而无需JOIN至少两个表格。

  6. 如果您在数据库中有任何基于数量的限制,除了“只允许一个东西”之外(即,“只允许一个地址”是可以的,但“只允许两个地址”表示规范化问题)。


1

3NF通常是您需要的,它遵循三个规则:

表中的每一列都应该依赖于:

  • 键(1NF),
  • 整个键(2NF),
  • 只有键(3NF)(所以帮助我科德通常以这种方式结束引用)。

出于性能原因,您经常可以“降级”为2NF,前提是您理解其影响并且仅在遇到问题时使用,但是对于所有设计,3NF应该是最初的目标。


1

正如其他人所说,当您在多个表中拥有(太多)重复列时,您就会知道。

话虽如此,有时在多个表之间具有冗余列是有用的。这可以减少在复杂查询中必须执行的连接数。只需小心保持所有表同步,否则您只会自找麻烦。


1
是的,为了提高性能,将数据非规范化到第二范式是完全可以接受的。触发器是一种救星,可以确保这些冗余列得到同步。 - paxdiablo

0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接