mysql - 如果我们更改主键值,为什么我们不必更改从属列值?

标签 mysql sql database-normalization

我看了one tutorial on youtube关于数据库规范化。

表格如下所示:

|Item(PK) | Supplier | Supplier Phone | Price|
---------------------------------------------
| Xbox One| Microsoft| 1234           | 250  |
---------------------------------------------
| PS4     | Sony     | 4321           | 300  |
---------------------------------------------
| PS Vista| Sony     | 4321           | 400  | 
---------------------------------------------

根据教程,该表采用 2NF 格式,每一列都取决于 PK。

我不明白的是 Supplier 列如何依赖于 PK 并且对不同的行具有相同的值。如果逻辑是B(供应商)依赖A(PK),我们改A,B也要改吗?为什么在这种情况下更改后的 PK 的供应商会保持不变?

最佳答案

TL;DR Item/A 是 PK(主键)意味着每个 Item/A 值只有一个 Supplier/B 值。它并没有说每个表只有一个值。

那个视频是胡说八道。他们与您的问题一样对“依赖”和 FD(功能依赖)和 PK 存在同样的误解(所以也许这就是您从那里得到的)以及许多其他误解,他们不知道自己在说什么。查找学院/大学教科书、幻灯片和/或类(class)(其中许多在线免费)。


我们可以讨论表或表变量的 FD、 super 键、唯一列集、CK(候选键)和 PK。如果给定业务/应用程序中可能出现的每个表值都将其作为实例,则表变量将具有其中一个实例。

What I don't understand is how column Supplier depends on PK and has the same value for different rows.

当确定集的每个给定值只能有一个值时,列集在功能上依赖于另一个列集。

但这并不意味着不同的确定值具有不同的确定值。

super 键是一组列,每一行都有不同的子行值。 CK 是不包含更小 super key 的 super key 。 PK就是你选择当PK的一些CK。 每个 列集在功能上都依赖于每个 super 键。其中一些是CK。其中一个可以PK。

但这并不意味着除了 super 键/CK/PK 之外的某些子行(并且每个子行必须在功能上依赖于它们根据定义)是独一无二的。

If the logic is that B (supplier) depends on A (PK), and we change A, should B be changed?

不是基于 A 是 PK/CK。 A 是 PK/CK 意味着 A 和 A 的每个超集都是唯一的。如果您在查看不同行或查看该行具有不同 A 值的不同表值(不能在任一表的任何其他行中)的意义上“更改 A”,则不会限制 B 可以是什么。

一些其他约束可能会限制 B 可以是什么。例如,如果 FD {Supplier} -> {Supplier Phone} 成立,那么这将限制供应商电话可以在其他行中,即使项目是 PK 没有。

任何特定的 FD 是否成立取决于在给定情况下哪些行应该进入表以及可能出现的情况。然后 FD 持有什么决定了 super key 和 CK 是什么。然后你可以选择一个CK作为PK。

关于mysql - 如果我们更改主键值,为什么我们不必更改从属列值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46839375/

相关文章:

c# - 具有分组依据的 Linq 查询

sql - 修订的数据库设计?

database - 给定的表格是什么范式?

database - 在数据库列中存储分隔列表真的那么糟糕吗?

php - 当字符串由数字和字母组成时使用 Order By 仅按数字排序

mysql - 计算字段中的最小值和最大值

mysql - 如何将数据添加到不同的表但保持相同的ID?

database - 用户图像/配置文件字段-数据库规范化-社交网络-Grails

php - 使用 php 脚本连接到数据库,但没有返回任何值

c# - 为什么entity framework+mysql provider枚举返回部分结果无一异常(exception)