我正在创建一个应用程序(桌面)来存储和检索患者的病历以及疾病。由于患者和疾病有很多关系,所以我创造了三张桌子;患者,疾病和一个是结点表。由于一名患者可以在一段时间内在一种疾病中注册多次,因此“患者”表包含患者“参考号”和“注册日期”的复合主键。表'DISEASES'仅包含'name'作为主键。
现在我对连接表的设计有点困惑。它包含'PATIENTS'表的复合主键和'DISEASES'表的主键作为外键。
我应该在联结表中创建所有这些外键的复合主键,还是创建另一个主键或不同的主键?
非常感谢任何帮助。
答案 0 :(得分:5)
看起来设计并不合适。如果患者的参考编号唯一地标识患者,那么 应该是主键。如果同一患者可以多次注册给定疾病,那么这应该是联合表中关键的一部分,而不是患者表中。
联结表中的主键应该是唯一标识关联的关键字,在这种情况下应该是由患者表中的密钥,疾病表和注册日期组成的复合密钥。
答案 1 :(得分:2)
我建议你再提一个案例表。该表将包含一个输入日期。您不应将疾病名称用作主键。这样就很难纠正错别字或者只是为了将来选择一个更合适的名字,或者你可能想要一个拉丁文和一个英文名字。
Patient table ------------- PK PatientID Name DateOfBirth etc.
Disease table ------------- PK DiseaseID Name
Case table ------------- PK CaseID FK PatientID EntryDate etc.
CaseDisease table ------------- PK, FK CaseID PK, FK DiseaseID
现在你有了这些关系
Patient --1:n--> Case --1:n--> CaseDisease <--n:1-- Disease
编辑:
现在可能不需要案例表,似乎过度设计了。但是,如果将来结果是,您还必须将其他数据存储到案例中;数据库设计不必从根本上改变。
更新:
或者,您可以在没有案例表的情况下执行此操作。在这种情况下,联结表将日期作为主键的一部分
PatientDisease table ------------- PK, FK PatientID PK, FK DiseaseID PK Date
关系将是
Patient --1:n--> PatientDisease <--n:1-- Disease
答案 2 :(得分:1)