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

问题描述:

我看了关于数据库规范化的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的供应商会保持不变?

+0

你有链接到本教程?因为我想知道这张声明背后的推理是在2NF ..电话显然不取决于PK,因为我们可以为不同的电话拥有相同的项目。 – Moseleyi

+0

这就是为什么我感到困惑。这里是链接https://www.youtube.com/watch?v=UrYLYV7WSHM&t=609s在9:38观看 –

+0

你能解释我们如何为不同的手机配备相同的产品吗? –

TL; DR项目/ A为PK(主键)意味着,只有一个供应商/ B每件商品/ A值的价值。它并不是说每个表只有一个值。

该视频是无稽之谈。他们正在遭受同样的误解,即“依赖”FD(功能依赖)& PKs作为你的问题(所以也许这就是你得到它们的地方)以及许多其他误解,他们不知道他们在说什么。查找大学/大学教科书,幻灯片和/或课程(其中许多是免费在线的)。


我们可以谈论的文件描述符,superkeys,唯一列集,CKS(候选键)& PK表或表变量的。如果在给定的业务/应用程序中可能出现的每个表值都将其作为实例,则表变量具有这些事件中的一个的实例。

我不明白的是如何列供应商依赖于PK和具有相同的值为不同的行。

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

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

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

但是,这并不意味着一些子行其他比超密钥/ CK/PK(和子行必须在功能上的定义依赖于他们)是独一无二的。

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

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

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

是否有任何特定的FD成立取决于在给定情况下应该将哪些行放入表中&可能会出现什么情况。那么,什么FD持有决定什么超级CK是CK。然后你可以选择CK作为PK。

+0

请问您能解释一下:“A sup erkey是一个独特的列集。 CK(候选键)是不包含更小超级键的超级键。 PK(主键)是您选择PK的一些CK(候选键)“在本例中,Whas是超级键? –

+0

(更新/更正)我编辑了我的答案以更正和澄清报价并添加了单独的版本这些术语的*值*和*变量*。你是指什么?该表的超级值为{Item},{Price}及其所有超集。我不知道该表的所有超级键作为一个变量,因为你没有提供足够的信息(Re NFs,CKs,superkeys和/或FDs)(你甚至没有提供足够的信息来证明2NF是合理的。)这是所有绝对基本的,阅读一些学术教科书的章节(s)正常化然后记住并使用的定义PS请采取我的其他意见。 – philipxy

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

在这种情况下,如果您有产品X,您知道它必须来自供应商Y,并且该供应商只有一个电话号码Z.它表明Z直接依赖于X.如果您有XboX的电话号码将是1234,如果你有一个PS4它将是4321.

当然,项目不依赖于手机,因为你可以有多个项目为同一个手机,但这是一个不同的步骤正常化。

那么理想,我们将有供应商表姓名+电话,并在产品表仅供参考,以supplier_id

+0

好的,但项目和Suplier之间的依赖关系,如何2个不同的项目可以在2nf有相同的供应商? –

+0

我刚刚告诉过你,因为在2NF没关系,供应商取决于物品,这就是2NF所代表的一切,一切都取决于关键 - 无论你有50个物品是同一个供应商还是只有一个。在3NF你通过拆分表删除那些重复 – Moseleyi

+0

好的,你能解释一下B是否依赖于A,我们改变A,B是否保持不变?这就是我的脑子:) –