针对患者和疾病的数据库设计

时间:2012-02-18 17:40:13

标签: sql database database-design sql-server-2008-r2

我正在创建一个应用程序(桌面)来存储和检索患者的病历以及疾病。由于患者和疾病有很多关系,所以我创造了三张桌子;患者,疾病和一个是结点表。由于一名患者可以在一段时间内在一种疾病中注册多次,因此“患者”表包含患者“参考号”和“注册日期”的复合主键。表'DISEASES'仅包含'name'作为主键。

现在我对连接表的设计有点困惑。它包含'PATIENTS'表的复合主键和'DISEASES'表的主键作为外键。

我应该在联结表中创建所有这些外键的复合主键,还是创建另一个主键或不同的主键?

非常感谢任何帮助。

3 个答案:

答案 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)

  1. 'name'作为主键并不是一个好主意 - 该表中的Id列应该设置为主键
  2. DiseasesToPatients表应该由两个外键组成 - 来自患者和疾病表,它们应该被设置为该表上的复合主键。