数据库规范化练习

时间:2015-11-01 21:16:48

标签: mysql database

我正在学习表的规范化。但我不确定我是否做得对。我在UNF中创建了下表:

enter image description here

1NF

enter image description here

2NF

enter image description here

这是对的吗?我不太确定......

1 个答案:

答案 0 :(得分:1)

规范化是我们检查和生成有效表结构的过程。每个表应代表一个实体(主题)。不会将数据值不必要地存储在多个表中。所有非键值都取决于主键和主键。最后,每个表都没有数据异常。也就是说,规范化归结为桌面设计。

要获得1NF资格,必须识别主键,并且表格不得包含任何重复组。也就是说,每个行/列交集包含一个且仅包含一个值。此外,每个非键属性必须依赖于主键。

关于1NF中的表格:
左边的那个,事件表:这是正确的1NF。

右边的那个也符合1NF的要求。 responder_status完全或部分取决于主键,足够1NF。

为了符合第二范式,表必须是1NF。它必须没有部分依赖。

关于2NF中的表格: 左侧的第一个表,事件,正确符合条件。请注意,仅当1NF表具有复合主键时,才会从1NF转换为2NF。否则它已经在2NF。

中间表,我猜测名为incident_response(或类似的东西)也符合条件。它在1NF中,它的主键是incident_id和responder_id的组合。它没有其他属性(列),因此部分依赖关系不是问题。

右边的最后一个表,响应者,是不正确的。它不是在1NF。值在主键列responder_id中重复。此外,responder_status似乎依赖于incident_id而不依赖于responder_id。您可能希望重新考虑responder_status的语义并将其重命名和/或将其放在不同的表中。如果意图表示响应者由于被分配到事件而不可用,则您可能根本不需要该列,因为incident_response表已经捕获了响应者被分配到事件的事件。

关于依赖关系的快速说法:我们如何判断某个值是否依赖于主键?这是一个例子。如果我查看incident_id I101,它总是匹配responder_status为1.同样,每次事件I020出现在数据中它总是有responder_status为0.这表明responder_status依赖于incident_id。相反,每当responder_id R010出现时,它并不总是具有相同的responder_status值。有时它是1而另一次是0.所以它不依赖。

对于有资格获得2NF的表,它必须没有部分依赖关系。此类表中的属性必须依赖于两个主键列值。

我希望这有助于解释规范化是什么以及为什么要这样做。祝你好运。