我对如何从 1NF 到 2NF 感到困惑,因为我的 1NF 有 3 个主键(我不熟悉在单个表中使用 3 个主键,但我认为这是最佳选择)。下面列出了我的尝试。请让我知道它是否不正确以及我如何改进。
非规范化表
[Patient#, Patient_Name, First_Seen, Social_Worker, (Visit_Date, Visit_Time,
Visit_Reason, New_Symptm, LevelofPain)]
1NF 表
**Patient_Visit_Time** [Patient#(PK), Visit_Date(PK), Visit_Time(PK), Visit_Reason,
New_Symptm, LevelofPain, Patient_FirstName, Patient_LastName, First_Seen,
SocialWorker_FirstName, SocialWorker_LastName]
2NF 表
**Patient** [Patient#(PK), Patient_FirstName, Patient_LastName, First_Seen,
SocialWorker_FirstName, SocialWorker_LastName]
**Visit_Time** [Visit_Date(PK), Visit_Time(PK), Visit_Reason, New_Symptm, LevelofPain,
Patient#(FK)]
3NF 表
Same as 2NF
最佳答案
您的规范化大部分是正确的。我看到的唯一区别是您没有在 Visit_Time
的 PK 中包含 Patient#
。在您的 1NF 中,不同的患者可以同时就诊,但在您的 2NF 中则不行。您的 2NF 就目前而言并非无效,但规范化不会改变关系的含义。
关于术语的说明:您的 1NF 有一个由 3 个属性组成的复合主键。它不是 3 个单独的键。除了一个表只能有一个主键这一事实(这就是它被称为主键的原因)之外,键中的每个条目都必须是唯一的。在复合键中,每个条目都是属性值的唯一组合。单独的键意味着这 3 个属性中的每一个都将是唯一的,从而防止患者多次访问(或每天或每次访问超过一名患者)。
关于mysql - 我是否正确规范了这张表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33194115/