合并两个表的推荐方法

时间:2010-09-28 10:01:59

标签: sql-server linq-to-sql foreign-keys

我有这样的数据库架构:

[Patients]                    [Referrals]
     |                             |
[PatientInsuranceCarriers]    [ReferralInsuranceCarriers]
                        \        /
                    [InsuranceCarriers]

PatientInsuranceCarriers和ReferralInsuranceCarriers是相同的,除了它们引用患者或推荐人的事实。我想合并这两个表,所以它看起来像这样:

[Patients]      [Referrals]
       \           /
  [PatientInsuranceCarriers]
              |
      [InsuranceCarriers]

我有两个选择

  • 要么创建两个新列--ID_PatientOrReferral + IsPatient(将告诉我要引用哪个表)
  • 或创建两个不同的列--ID_Patient和ID_Referral,两者都可以为空。

一般来说,我试图避免可以为空的列,因为我认为它们是一种不好的做法(意思是,如果你可以生活没有空,那么你真的不需要一个可空的列)并且它们更难以使用在代码中(例如,LINQ to SQL)。

但是我不确定第一个选项是不是一个好主意。我看到有可能在ID_PatientOrReferral上创建两个FK(一个用于患者,一个用于推荐),虽然我不能在那里设置任何更新/删除行为,原因很明显,我不知道对插入的约束检查是否有效方式,或者,所以看起来FK只是为了标记存在关系。或者,我可能不会创建任何外键,而是手动在DBML中添加关系。

有哪些方法更好,为什么?

2 个答案:

答案 0 :(得分:0)

this question

复制我的回答

如果你真的需要TableZ中的A_or_B_ID,你有两个类似的选择:

1)在表z中添加可空A_IDB_ID列,在这两列上使用ISNULL使A_or_B_ID成为计算列,并添加一个CHECK约束,使{ {1}}或A_ID不为空

2)将TableName列添加到表z,约束为包含A或B.现在创建B_IDA_ID作为计算列,当它们的相应表被命名时,它们只是非null (使用CASE表达式)。让他们坚持下去

在这两种情况下,您现在都拥有B_IDA_ID列,这些列可以具有适当的外部列 基表的键。不同之处在于计算哪些列。还有,你 如果2个I​​D列的域没有,则不需要上面选项2中的TableName 重叠 - 只要您的案例表达式可以确定哪个域B_ID 落入

答案 1 :(得分:0)

扩展我的一些简洁评论:

  

我想合并这两个表

我相信这是一个坏主意。目前你有两个表具有良好的清晰关系谓词(简而言之,意味着表示在表中存在记录) - 而且至关重要的是,这些关系谓词是这两个表的不同

  • PatientInsuranceCarriers< =>中存在记录PatientInsurance Carrier

  • 相关联
  • ReferralInsuranceCarriers< =>中存在记录ReferralInsurance Carrier

  • 相关联

当然,它们很相似,但它们并不相同。现在考虑一下组合表的关系谓词:

  • ReferralAndPatientInsuranceCarriers< =>中存在记录{(IsPatienttruePatient为ID ID_PatientOrReferral)或者IsPatientfalseReferral为ID ID_PatientOrReferral)}与Insurance Carrier
  • 相关联

或者如果您使用NULL s

进行此操作
  • ReferralAndPatientInsuranceCarriers< =>中存在记录{(ID_Patient不是NULLPatient ID为ID_Patient)或者ID_Referral不是NULLReferral } {ID为ID_Referral}}与Insurance Carrier
  • 相关联

现在,我不是一个自动暗示更复杂的关系,而且必然更糟糕的人;但我很确定上述两种情况中的任何一种都比他们要替换的情况要差。


解决您的疑虑:

  

我们现在有两个LINQ to SQL实体,每个

分别有控制器和视图

总的来说,我同意减少重复;但是,只有重复相同的东西!在这里,不是所有上述都是“样板”的情况,它们的构造和维护可以委托给合适的开发工具吗?

  

并且在为报告准备数据时必须合并它们

如果要创建包含VIEW的{​​{1}}用于报告目的,您可以保持实际数据的简单性,并且仍然能够报告组合列表;例如(对列名等做出假设):

UNION