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

时间:2017-10-19 21:44:40

标签: 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。

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

2 个答案:

答案 0 :(得分:0)

这种混淆可能源于对电话号码属于客户的误解,实际上这是一个供应商编号。

在这种情况下,如果您有产品X,您知道它必须来自供应商Y,而该供应商只有1个电话号码Z.它向您显示Z直接依赖于X.如果您有XboX电话号码是1234,如果你有PS4,它将是4321。

当然,项目并不依赖于手机,因为您可以为同一部手机拥有多个项目,但这样可以实现标准化的不同步骤。

理想情况下,我们会有名称为+ phone的供应商表,而在产品表中仅提供supplier_id

答案 1 :(得分:0)

TL; DR 项目/ A是PK(主键)意味着每个项目/ A值只有一个供应商/ B值。它没有说每个表只有一个值。

那段视频是胡说八道。他们正遭受同样的误解,因为"依赖" &安培; FD(功能依赖性)& PK是你的问题(也许是你从中得到它们的地方)和许多其他误解,他们不知道他们在说什么。查找大学/大学教科书,幻灯片和/或课程(其中许多是免费的在线)。

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

  

我不明白的是,供应商列如何依赖PK并且不同行的值相同。

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

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

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

但这并不意味着某些subrow 其他而不是超级键/ CK / PK(以及每个 subrow 必须在功能上依赖于它们的定义)是独一无二的。

  

如果逻辑是B(供应商)依赖A(PK),我们改变A,B应该改变吗?

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

某些其他约束可能会限制B的含义。例如,如果FD {供应商} - > {Supplier Phone}然后限制了供应商电话在其他行中的含义,即使PK不是。

是否存在任何特定的FD取决于在给定情况下哪些行应该进入表中&可能出现什么情况。然后FD持有什么决定了超级密钥和& CK是。然后你可以选择CK作为PK。