确定给定表中的PK

时间:2014-06-21 17:38:20

标签: mysql sql database

表格是:

Patient(PatientID, FirstName, LastName)
Disease(DiseaseID, DiseaseName)
PatientDisease(PatientID, DateID, DiseaseID)

很明显 Patient Disease 表有 PatientID DiseaseID 作为PK,但是怎么样 PatientDisease 表知道一天内每位患者都可以被诊断为单一疾病?

3 个答案:

答案 0 :(得分:0)

我认为,在这里你应该使用包含所有3个字段的复合PK:PatientId,DateId,DiseaseId。 无论每天是否有一种疾病都可以被诊断出来,所有3个领域对于患者疾病都是强制性的。

答案 1 :(得分:0)

你可以使用复合键

添加另一列患者疾病ID作为唯一行号

答案 2 :(得分:0)

我认为一个病人可以在一天内被诊断出只有一个死亡是非常幸运的,但这个系统不会那么幸运 - 它对任何真正的应用都有很大的设计缺陷。医生无法写出我既感冒又对抗生素过敏可能会带来潜在的灾难。

像(PatientID,DateID,DiseaseID)这样的密钥不允许你添加多个死亡。它是物理上可能的最大密钥,但是对于您的问题域,此表甚至还不够first normal form

即使Date表实际存储了不会使PatientDecease表非常合理的日期和时间(几乎不可能有人在一秒钟内被诊断出两次死亡,但它不能完全解决问题 - 考虑一些批量死亡更新)。

1)所以你应该添加一些代理键

PatientDisease(PatientDiseaseID, PatientID, DateID, DiseaseID)

,您的密钥将为PatientDiseaseID

2)或在当天为病人添加序数:

PatientDisease(PatientID, DateID, DiseaseID, PatientDeceaseInDayOrdinal)

主键(PatientID, DateID, DiseaseID, PatientDeceaseInDayOrdinal)

第一个想法可能更好,更简单。