mysql - 数据库规范化练习

标签 mysql database

我正在学习表格的标准化。但我不太确定我是否做对了。我在 UNF 中创建了下表:

enter image description here

1NF

enter image description here

2NF

enter image description here

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

最佳答案

规范化是我们检查和生成有效表结构的过程。每个表应代表一个实体(主题)。任何数据值都不会不必要地存储在多个表中。所有非键值都依赖于主键并且仅依赖于主键。最后,每张表不得有数据异常。也就是说,标准化归结为表格设计。

为了符合 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/

相关文章:

创建表中的 MySQL 日期格式

MySQL 排序依据不一致

php - 如何在 mysql codeigniter 事件记录中启用反引号

c++ - 我的逻辑有什么问题?我的 Vector 或对象不会 push_back 新对象。保持大小为 0

PHP 和 MySQL,获取 JSON 数据以提供 HighCharts

mysql - cakephp 在条件中找到多组 OR

mysql - 尝试使用同一表中的值更新表

android - 在 RECEIVE_BOOT_COMPLETED 上通过广播接收器访问数据库

javascript - 如何将 HashMap 数组插入 Redis? ( Node .js)

sql - 在 SQL Server 中向触发器添加条件