我有这样的数据库架构:
[Patients] [Referrals]
| |
[PatientInsuranceCarriers] [ReferralInsuranceCarriers]
\ /
[InsuranceCarriers]
PatientInsuranceCarriers和ReferralInsuranceCarriers是相同的,除了它们引用患者或推荐人的事实。我想合并这两个表,所以它看起来像这样:
[Patients] [Referrals]
\ /
[PatientInsuranceCarriers]
|
[InsuranceCarriers]
我有两个选择
一般来说,我试图避免可以为空的列,因为我认为它们是一种不好的做法(意思是,如果你可以生活没有空,那么你真的不需要一个可空的列)并且它们更难以使用在代码中(例如,LINQ to SQL)。
但是我不确定第一个选项是不是一个好主意。我看到有可能在ID_PatientOrReferral上创建两个FK(一个用于患者,一个用于推荐),虽然我不能在那里设置任何更新/删除行为,原因很明显,我不知道对插入的约束检查是否有效方式,或者,所以看起来FK只是为了标记存在关系。或者,我可能不会创建任何外键,而是手动在DBML中添加关系。
有哪些方法更好,为什么?
答案 0 :(得分:0)
如果你真的需要TableZ中的A_or_B_ID
,你有两个类似的选择:
1)在表z中添加可空A_ID
和B_ID
列,在这两列上使用ISNULL使A_or_B_ID
成为计算列,并添加一个CHECK约束,使{ {1}}或A_ID
不为空
2)将TableName列添加到表z,约束为包含A或B.现在创建B_ID
和A_ID
作为计算列,当它们的相应表被命名时,它们只是非null (使用CASE表达式)。让他们坚持下去
在这两种情况下,您现在都拥有B_ID
和A_ID
列,这些列可以具有适当的外部列
基表的键。不同之处在于计算哪些列。还有,你
如果2个ID列的域没有,则不需要上面选项2中的TableName
重叠 - 只要您的案例表达式可以确定哪个域B_ID
落入
答案 1 :(得分:0)
扩展我的一些简洁评论:
我想合并这两个表
我相信这是一个坏主意。目前你有两个表具有良好的清晰关系谓词(简而言之,意味着表示在表中存在记录) - 而且至关重要的是,这些关系谓词是这两个表的不同:
PatientInsuranceCarriers
< =>中存在记录Patient
与Insurance Carrier
ReferralInsuranceCarriers
< =>中存在记录Referral
与Insurance Carrier
当然,它们很相似,但它们并不相同。现在考虑一下组合表的关系谓词:
ReferralAndPatientInsuranceCarriers
< =>中存在记录{(IsPatient
为true
,Patient
为ID ID_PatientOrReferral
)或者IsPatient
为false
,Referral
为ID ID_PatientOrReferral
)}与Insurance Carrier
或者如果您使用NULL
s
ReferralAndPatientInsuranceCarriers
< =>中存在记录{(ID_Patient
不是NULL
而Patient
ID为ID_Patient
)或者ID_Referral
不是NULL
而Referral
} {ID为ID_Referral
}}与Insurance Carrier
现在,我不是一个自动暗示更复杂的关系,而且必然更糟糕的人;但我很确定上述两种情况中的任何一种都比他们要替换的情况要差。
解决您的疑虑:
我们现在有两个LINQ to SQL实体,每个
分别有控制器和视图
总的来说,我同意减少重复;但是,只有重复相同的东西!在这里,不是所有上述都是“样板”的情况,它们的构造和维护可以委托给合适的开发工具吗?
并且在为报告准备数据时必须合并它们
如果要创建包含VIEW
的{{1}}用于报告目的,您可以保持实际数据的简单性,并且仍然能够报告组合列表;例如(对列名等做出假设):
UNION