什么是数据库常规表单,您能举例说明吗?

bar*_*oon 269 database database-design database-normalization

在关系数据库设计中,存在数据库规范化或简单规范化的概念,其是组织列(属性)和表(关系)以减少数据冗余和改善数据完整性的过程.(如维基百科上所写).

由于大多数文章都是技术性的,因此难以理解,我要求有人根据1NF,2NF,3NF甚至3.5NF(Boyce-Codd)的含义的例子写出一个更容易理解的解释.

Sma*_*ery 426

1NF是最基本的普通形式 - 表中的每个单元格必须只包含一条信息,并且不能有重复的行.

2NF和3NF都是关于依赖主键的.回想一下,主键可以由多列组成.克里斯在回答中说:

数据取决于密钥[1NF],整个密钥[2NF],只有密钥[3NF](所以帮助我Codd).

2NF

假设您有一个包含某个学期课程的表格,并且您拥有以下数据:

|-----Primary Key----|               uh oh |
                                           V
CourseID | SemesterID | #Places  | Course Name  |
------------------------------------------------|
IT101    |   2009-1   | 100      | Programming  |
IT101    |   2009-2   | 100      | Programming  |
IT102    |   2009-1   | 200      | Databases    |
IT102    |   2010-1   | 150      | Databases    |
IT103    |   2009-2   | 120      | Web Design   |
Run Code Online (Sandbox Code Playgroud)

不是2NF,因为第四列不依赖于整个键 - 而只是它的一部分.课程名称取决于课程的ID,但与学习的学期无关.因此,正如您所看到的,我们有重复的信息 - 几行告诉我们IT101正在编程,IT102是数据库.所以我们通过将课程名称移动到另一个表来修复它,其中CourseID是ENTIRE键.

Primary Key |

CourseID    |  Course Name |
---------------------------|
IT101       | Programming  |
IT102       | Databases    |
IT103       | Web Design   |
Run Code Online (Sandbox Code Playgroud)

没有冗余!

3NF

好的,我们也可以说我们还将课程教师的名字及其中的一些细节添加到RDBMS中:

|-----Primary Key----|                           uh oh |
                                                       V
Course  |  Semester  |  #Places   |  TeacherID  | TeacherName  |
---------------------------------------------------------------|
IT101   |   2009-1   |  100       |  332        |  Mr Jones    |
IT101   |   2009-2   |  100       |  332        |  Mr Jones    |
IT102   |   2009-1   |  200       |  495        |  Mr Bentley  |
IT102   |   2010-1   |  150       |  332        |  Mr Jones    |
IT103   |   2009-2   |  120       |  242        |  Mrs Smith   |
Run Code Online (Sandbox Code Playgroud)

现在希望很明显,TeacherName依赖于TeacherID - 所以这不在3NF中.为了解决这个问题,我们做了与2NF中相同的事情 - 从这个表中取出TeacherName字段,并将其放在自己的字段中,其中以TeacherID为键.

 Primary Key |

 TeacherID   | TeacherName  |
 ---------------------------|
 332         |  Mr Jones    |
 495         |  Mr Bentley  |
 242         |  Mrs Smith   |
Run Code Online (Sandbox Code Playgroud)

没有冗余!!

需要记住的一件重要事情是,如果某些东西不在1NF中,那么它也不是2NF或3NF.因此,每个额外的范式要求一切,下部正常形态了,再加上一些额外的条件,必须全部满足.

  • @instantsetsuna - 完整的解释:在一些法庭上,一名证人被问及他们是否会说出"真相,全部真相,除了真相以外,所以请帮助我上帝"; 因为在知道你是否说出真相时,上帝被认为是有权威的人.在数据库的情况下,我们可以说"数据取决于密钥,整个密钥,只有密钥,所以帮助我Codd".Ted Codd提出了关系数据库的概念 - 依赖于密钥等的东西,因此在关系数据库的情况下,他将成为权威. (29认同)
  • 只要从事物之间的关系来考虑它.如果我问你"ID IT101的课程名称是什么?",你可以给我一个答案,对吧?同样,如果我问你"老师有什么ID 332?" 你可以告诉我那是什么老师.因此,课程名称取决于其ID. (9认同)
  • 但是,你不能走另一条路 - 如果我问你"琼斯先生的身份证是什么?" 你可能无法给出一个独特的答案,因为可能有两个Joneses先生.所以ID不依赖于名称 - 它是依赖于ID的名称. (9认同)
  • @Smashery 2NF和3NF有什么区别? (5认同)
  • 你也可以这样想 - 看第三个表(第一个表中有TeacherName).什么阻止我在第一排"琼斯先生",但随后将"博格斯先生"放在第二排?我不应该被允许这样做,因为他们都得到了332的ID. (2认同)
  • 学生编号_uniquely_识别您 - 您不需要知道任何其他内容.数据库中的行不会说你是约翰尼,因为你最喜欢的颜色是红色 - 它会告诉你你是约翰尼,因为你的学生证是314156.所以你的名字取决于身份证,而_only_身份证. (2认同)
  • 你的学期专栏只是让我开口,你通过将两列合并为一个列来打破一个非常重要的规则.你需要做一些字符串操作才能打破这一年. (2认同)

Chr*_*fer 116

我从来没有对确切的措辞有好记,但在我的数据库课中,我认为教授总是这样说:

数据取决于密钥[1NF],整个密钥[2NF],只有密钥[3NF].

  • ...所以帮助我Codd.http://en.wikipedia.org/wiki/Ted_Codd (70认同)
  • 那么`数据取决于密钥[1NF]之间有什么区别,除了密钥[3NF]之外什么都没有?请不要混淆我们,因为1个正确的答案并没有澄清答案,但让访客感到困惑! (6认同)
  • *“表中的每个单元格只能包含一条信息,并且不能有重复的行。” *-我看不到“数据取决于键”如何匹配所有这些信息。 (2认同)

Dav*_*kle 44

这是一个快速的,公认的被宰杀的回应,但在一句话中:

1NF:你的表被组织成一个无序的数据,并且没有重复列.

2NF:由于另一列,您不会在表的一列中重复数据.

3NF:表中的每一列只与表的键相关 - 表中没有列描述表中不是键的另一列.

有关更多详细信息,请参阅维基百科...

  • 据我所知,1NF 对 _repeating **groups**_ 的回避不是指重复列,而是单个 _columns_ 表示同一属性的任意数量的重复值,即不是原子的。我基于例如 (1) http://stackoverflow.com/questions/23194292/normalization-what-does-repeating-groups-mean / (2) http://stackoverflow.com/questions/26357276/1nf-repeating -groups-what-are-他们 (2认同)

Arc*_*rus 31

1NF:每列只有一个值

2NF:表中的所有非主键列都应该依赖于整个主键.

3NF:表中的所有非主键列应直接依赖于整个主键.

我在这里写了一篇更详细的文章

  • 另请注意,这个问题已经有两年了,并且已经有一个高度响应的答案,标记为OP已接受.社区更仔细地仔细审查迟到的答案,以评估他们是否为OP增加了真正的额外价值. (3认同)
  • @Arcturus阅读了这篇文章,仍然是那里规范化的更好解释之一. (3认同)