数据库规范化 - 两个具有相同主键的表?

时间:2015-12-28 20:43:08

标签: mysql database primary-key normalization database-normalization

我在这里苦苦挣扎。

基本上我有这种关系:

  • 员工(员工 - 电子邮件,员工 - 姓名,员工 - 姓名,员工资格)

重要的是要注意Staff-Qualification是一个多值属性。

因此,是否必须单独使用表格?

  • Staff_Qual(员工 - 电子邮件,员工资格)

因为它是多值的,或者它可以留在Staff表中。

但是,将它们拆分的问题是两个表都具有相同的主键。我真的在努力做什么。这会发生吗?我需要在某处添加约束吗?

任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:1)

他们会进入单独的表格,但该表格中的PRIMARY KEY (Staff-EMail)它是(Staff-Email, Staff-Qualification)。您FOREIGN KEY (Staff-EMail) REFERENCES PRIMARY KEY Staff {/ 1}}中的{{1}} 。

答案 1 :(得分:1)

什么是表中的UNIQUE NOT NULL列集(可能通过PRIMARY KEY声明),表中的FOREIGN KEY列集与该表或其他表中的其他表无关,除了a FOREIGN KEY应引用UNIQUE NOT NULL。

来自this recent answer

  

只需声明您的关系/表格的真实情况:

     
      
  • PK或UNIQUE NOT NULL声明表示列集中的每个子行值都是唯一的。即列集是超级密钥。 (PK是   只是一个杰出的UNIQUE NOT NULL。)
  •   
  • FK声明表示引用列中的列列表子行值也必须位于引用的超级键列中。
  •   

PS是的,您应该从表中删除“多值”列,并使用原始的一些UNIQUE NOT NULL列集(例如PRIMARY KEY)添加一个新表,并为每个与之关联的多个值添加一列这些列的价值。将原始复制的列在新表中声明为原始的FOREIGN KEY。新单元的PRIMARY KEY是那些列加上新列。

PPS(由Mike Sherrill 'Cat Recall'评论)“MySQL不强制要求引用的列为UNIQUE或声明为NOT NULL。”即使“建议您使用仅引用UNIQUE(包括PRIMARY)和NOT NULL键的外键。” (“此外,MySQL要求出于性能原因对引用的列进行索引。”)