C# 绑定到复合FK

C# 绑定到复合FK,c#,database-design,data-modeling,C#,Database Design,Data Modeling,是否有可能/或良好的做法,将一个类似于地址簿的表与不同实体(例如:人员、公司等)关联起来 我正在考虑使用compsite FK(typeid=实体类型id,例如:1表示人员,2表示公司等,而另一列表示实体表的主键) 另一种选择是在实体和地址簿表之间使用连接表 我使用的是VS2005c#,和SQLServer2008假设:您的实体都存储在一个带有类型鉴别器的表中 是的,外键可以有多个列 一个地址条目只需要知道父实体的主键 它不需要知道实体的类型:实体类型是实体的属性不是地址 连接表还是直FK?这取

是否有可能/或良好的做法,将一个类似于地址簿的表与不同实体(例如:人员、公司等)关联起来 我正在考虑使用compsite FK(typeid=实体类型id,例如:1表示人员,2表示公司等,而另一列表示实体表的主键)

另一种选择是在实体和地址簿表之间使用连接表


我使用的是VS2005c#,和SQLServer2008

假设:您的实体都存储在一个带有类型鉴别器的表中

是的,外键可以有多个列

一个
地址
条目只需要知道父
实体的主键

它不需要知道
实体的类型
实体类型
实体的属性
不是
地址

连接表还是直FK?这取决于你的人际关系:

  • 一个地址可以由多个实体共享吗
  • 一个实体可以有多个地址吗

    • 两个都可以:连接表
    • 仅对Q1为是:
      地址
      主键是
      实体
      的属性。实体是FK中的子表
    • 仅对Q2是:
      实体
      PK是
      地址
      的属性。Address是FK中的子表
  • 我不希望发生这样的情况:

    • 两者均为否:1:1关系或您只需要一个表,
      地址
      实体

    我认为不需要引用一个表或另一个表的类型和实体id。这是一种复杂的方法(两个表使用相同的ID池,并且可能没有表的外键),以后可能会导致问题

    你的问题似乎很简单,这里不需要任何技巧


    您有公司、人员和地址。如果每个人和每个公司都有一个地址,则在“公司和人员”表中有地址id。如果一个人可以有多个地址,您需要一个桥接表。每个公司有一个以上的地址。仅此而已。

    这是一个通用数据库设计问题。绑定此设计需要VS C部分。我的C#delima是:我需要在我的UI中绑定到一个数据源(地址)并让它显示所有地址,如果涉及到人们的地址,则应该选择一个无线电接口,这对公司也是一样的,感谢您花时间回复,但是,每个实体都有不同的模式,因此,我相信地址表应该知道它。好的,那么请提供我们需要的所有信息。无论如何,你不能有一个FK到多个父母,但可以自由地尝试。所以你需要一个超类型子类型解决方案,我读了两个线程,看起来第二个类似于我想要做的。人应该是(id、firstN、lastN、sex、dob)、公司(id、姓名、联系人id-fk-to-Person),现在是地址(id、entityid、entityTypeID、城市、省)。如果我从您提供的链接中的第二个线程中正确理解,这将是可能的,并且对我的应用程序没有影响。请注意,这个问题也与c#而不仅仅是db.thx有关。这是一个数据库设计问题,而不是c#one。我刚刚通过设计找到了这个链接SQL:超类型和子类型,它似乎暗示了gbn的答案,在某种程度上,我的问题的另一部分是UI绑定。还有什么建议吗?这个方法有严重的影响吗?实际上我提到这是我的第二个选择,看起来你提倡这个方法,因为它会使事情变得复杂。但是我考虑了第一种方法,因为我需要在我的UI中绑定到一个数据源(地址),并让它显示所有的地址,如果涉及到人们的地址,那么应该选择一个无线电按钮,公司也是如此。如果这种方法不能解决我的问题而不出现并发症,我会选择第二种方法(桥接器、连接表),除非有人提出另一种解决方案。到目前为止,我还没有在C#中尝试过这种方法,但这不会是一个问题,因为信息就在那里。您不链接到表,而是链接到查询。您可以简单地编写一个查询,告诉您某个地址属于某个人还是某个公司,然后进行相应的筛选。这样:
    选择一个*,如果存在(从公司c中选择*,其中c.address\u id=a.id),则1或0结束为地址中的\u company\u address
    。如果一家公司本身有一个地址,这可能是可以的,但我们需要一家公司有多个地址,对于个人也是如此。