最佳答案
规范化是我们检查和生成有效表结构的过程。每个表应代表一个实体(主题)。任何数据值都不会不必要地存储在多个表中。所有非键值都依赖于主键并且仅依赖于主键。最后,每张表不得有数据异常。也就是说,标准化归结为表格设计。
为了符合 1NF,必须确定主键,并且表中不得有任何重复组。也就是说,每一行/列交集包含一个且仅一个值。此外,每个非键属性必须依赖于主键。
关于 1NF 中的表:
左边的事件表:这是正确的 1NF。
右边的也满足1NF的要求。 responder_status 完全或部分取决于主键,这对于 1NF 来说已经足够了。
为了符合第二范式,该表必须采用 1NF。并且它必须没有部分依赖关系。
关于 2NF 中的表: 左边的第一个表,事件,正确地符合资格。请注意,仅当 1NF 表具有复合主键时,才会从 1NF 转换为 2NF。否则它已经处于 2NF 状态了。
我猜中间的表名为 event_response (或类似的东西)也符合资格。它属于 1NF,其主键是 event_id 和 responder_id 的组合。它没有其他属性(列),因此不存在部分依赖关系。
右边最后一个表,响应者,不正确。它不在 1NF 中。主键列responder_id 中重复值。此外,responder_status 似乎依赖于 event_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,它必须没有部分依赖关系。此类表中的属性必须取决于两个主键列值。
我希望这有助于解释什么是标准化以及为什么要进行标准化。祝你好运。
关于mysql - 数据库规范化练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33467316/