我对如何从1NF到2NF感到困惑,因为我的1NF有3个主键(我不熟悉在一个表中使用3个主键,但我相信这是最好的选择)。我的尝试列在下面。如果不正确以及我如何改进,请告诉我。
[Patient#, Patient_Name, First_Seen, Social_Worker, (Visit_Date, Visit_Time,
Visit_Reason, New_Symptm, LevelofPain)]
**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]
**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)]
Same as 2NF
答案 0 :(得分:1)
您的规范化大多是正确的。我看到的唯一区别是你没有在Patient#
的PK中包含Visit_Time
。在您的1NF中,不同的患者可以同时访问,但不能在您的2NF中访问。你的2NF并不是无效的,但规范化并没有改变关系的含义。
关于术语的说明:您的1NF具有由3个属性组成的单个复合主键。它不是3个单独的键。除了一个表只能有一个主键(这就是它被称为主键的原因)之外,一个键中的每个条目都必须是唯一的。在复合键中,每个条目都是属性值的唯一组合。单独的密钥意味着3个属性中的每个属性都是独一无二的,这样可以防止患者多次访问(或者每天或每天访问的患者不止一个)。