时间:2016-11-20 16:39:13

标签: sql sql-server

我有两张表DOCTORSPATIENTS。我希望医生和患者都能获得未修复的联系信息(如电话号码,地址等)。例如,我们可以为医生或患者添加多部手机。

我考虑过创建一个单独的表,例如PHONES字段phoneID,电话号码和指向联系人的外键,如下所示:

电话

phoneID [pk]
number
contactID [fk]

医师

docID [pk]
fname
sname
specialization
.
.
.

患者

patID [pk]
fname
sname
.
.
.

第一个问题来自patIDdocID可能(并且最终)具有相同值的事实。因此,将手机与一个人联系起来会变得更加困难。

到目前为止,我已经想到了三种可能的解决方案:

  1. 为医生和患者提供自定义格式的主键。例如,医生可以使用" d00001"," d00002"等等,以及患者ids,如" p00001"," p00002"。我担心的是,这可能会使问题变得不必要。

  2. 另一种解决方案是将医生和患者放在一张桌子上,并通过使用其他字段来确定他们是医生还是患者。

  3. 为医生和患者创建单独的PHONE表,但这更加笨拙。

  4. 不知何故,我认为这两种方法都不是最好的。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以引入PERSON - 表格。这1:1与您的医生和患者有关(后来可能与员工,供应商,机构等有关)。让联系人与此人员表相关联。

应用程序代码可以很容易地使用继承对此进行建模......

在您的人员表中,您可以保留一些常规信息,例如DisplayNamePersonType(引用包含DoctorPatientposition: fixed等条目的人员类型表。 ..)。

让这张桌子保持苗条......

如果你必须选择自己的想法,我宁愿选择第二个。将它们保存在一个表中,并使用类型列标记它们。避免说话密钥 ...

答案 1 :(得分:2)

你正在考虑错误的关系。

人与电话号码之间存在多对多关系。

一个人可以拥有许多不同的电话号码(家庭,工作,移动等)

一个电话号码可以与很多人(丈夫,妻子,孩子,同事......)相关联。

我不明白为什么你需要一个主要实体,电话号码作为主要或备用密钥。

我会使用5个表:

Doctor PK=DoctorID

Patient PK=PatientID

PhoneType PK=PhoneTypeCode

DoctorPhone PK=DoctorID,PhoneTypeCode,PhoneNum  
  FK1=Doctor.DoctorID  
  FK2=PhoneType.PhoneTypeCode

PatientPhone PK=PatientID,PhoneTypeCode,PhoneNum
  FK1=Patient.PatientID
  FK2=PhoneType.PhoneTypeCode

考虑到两类人的电话角色可能不同,您可能会考虑使用不同的DoctorPhoneType和PatientPhoneType表。