我是否正确规范了这个 table?

Did I normalize this table correctly?

user view

我对如何从 1NF 到 2NF 感到困惑,因为我的 1NF 有 3 个主键(我不熟悉在单个 table 中使用 3 个主键,但我相信这是最好的选择).下面列出了我的尝试。请让我知道它是否不正确以及我如何改进。

Un-normalized Table

[Patient#, Patient_Name, First_Seen,  Social_Worker, (Visit_Date, Visit_Time, 

Visit_Reason, New_Symptm, LevelofPain)]

1NF Tables

**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 Tables

**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 Tables

Same as 2NF

您的规范化大部分是正确的。我看到的唯一区别是您没有在 Visit_Time 的 PK 中包含 Patient#。在您的 1NF 中,不同的患者可以同时就诊,但在您的 2NF 中则不行。您的 2NF 就目前而言并非无效,但规范化不会改变关系的含义。

关于术语的说明:您的 1NF 有一个由 3 个属性组成的复合主键。它不是 3 个单独的键。除了 table 只能有一个主键(这就是它被称为主键的原因)这一事实之外,键中的每个条目都必须是唯一的。在复合键中,每个条目都是属性值的唯一组合。单独的键意味着这 3 个属性中的每一个都将是唯一的,从而防止患者多次访问(或每天或每次访问超过一名患者)。