我有两张表DOCTORS
和PATIENTS
。我希望医生和患者都能获得未修复的联系信息(如电话号码,地址等)。例如,我们可以为医生或患者添加多部手机。
我考虑过创建一个单独的表,例如PHONES
字段phoneID
,电话号码和指向联系人的外键,如下所示:
电话
phoneID [pk]
number
contactID [fk]
医师
docID [pk]
fname
sname
specialization
.
.
.
患者
patID [pk]
fname
sname
.
.
.
第一个问题来自patID
和docID
可能(并且最终)具有相同值的事实。因此,将手机与一个人联系起来会变得更加困难。
到目前为止,我已经想到了三种可能的解决方案:
为医生和患者提供自定义格式的主键。例如,医生可以使用" d00001"," d00002"等等,以及患者ids,如" p00001"," p00002"。我担心的是,这可能会使问题变得不必要。
另一种解决方案是将医生和患者放在一张桌子上,并通过使用其他字段来确定他们是医生还是患者。
为医生和患者创建单独的PHONE
表,但这更加笨拙。
不知何故,我认为这两种方法都不是最好的。有什么建议吗?
答案 0 :(得分:2)
您可以引入PERSON
- 表格。这1:1
与您的医生和患者有关(后来可能与员工,供应商,机构等有关)。让联系人与此人员表相关联。
应用程序代码可以很容易地使用继承对此进行建模......
在您的人员表中,您可以保留一些常规信息,例如DisplayName
和PersonType
(引用包含Doctor
,Patient
和position: 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表。