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

If we change a primary key value, why don't we have to change a dependent column value?

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

table 看起来像这样:

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

根据教程,这个 table 在 2NF 中,每一列都取决于 PK。

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

混淆可能是由于误解 phone 号码属于客户,而实际上它是供应商号码。

在这种情况下,如果您有产品 X,您知道它必须来自供应商 Y,而该供应商只有 1 个 phone 编号 Z。这表明 Z 直接依赖于 X . 如果你有 Xbox,phone 数字将为 1234,如果你有 PS4,则为 4321。

当然,item 不依赖于 phone,因为同一个 phone 可以有很多 item,但那是标准化的不同步骤。

所以理想情况下,我们的供应商 table 名称 + phone,并且在产品 table 中仅引用 supplier_id

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

只有一个值

那个视频是胡说八道。他们对 "depends" & FD(功能依赖)和 PK 的误解与你的问题(所以也许这就是你从哪里得到的)和许多其他误解一样,他们不知道自己在说什么。查找 college/university 教科书、幻灯片 and/or 课程(其中许多在线免费)。


我们可以讨论 table value 或 table 的 FD、超级键、唯一列集、CK(候选键)和 PK 变量。如果给定 business/application 中可能出现的每个 table 值都将其作为实例,则 table 变量具有这些事物之一的实例。

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

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

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

超级键是一组列,每行都有不同的子行值。 CK 是不包含更小超级密钥的超级密钥。 PK就是你选择当PK的一些CK。 Every 列集在功能上取决于每个超级键。其中一些是CK。其中之一可以PK

但这并不意味着某些子行 other 而不是 superkey/CK/PK(并且 every 子行 必须 根据定义在功能上依赖于它们)是唯一的。

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

不是基于 A 是 PK/CK。 A being PK/CK 意味着 A 和 A 的每个超集都是唯一的。如果你 "change A" 在查看不同的行或查看不同的 table 值的意义上,该值对该行具有不同的 A 值(不能在 [= 的任何其他行中) 62=]), 这并不限制 B 可以是什么。

某些其他 约束可能会限制 B 可以是什么。例如,如果 FD {Supplier} -> {Supplier Phone} 成立,那么这会限制 Supplier Phone 可以在其他行中,即使 Item 不是 PK。

任何特定的 FD 是否成立取决于在给定情况下哪些行应该进入 table 以及可能出现的情况。然后 FD 持有什么决定了超级密钥和 CK 是什么。然后就可以挑个CK来PK了