Database design 多个多对一关系到一个表

Database design 多个多对一关系到一个表,database-design,entity-framework-core,relation,Database Design,Entity Framework Core,Relation,我已经有一段时间没有重做整个数据库了,我对一个非常基本的问题提出了质疑,但我无法通过搜索找到正确的答案。好像我错过了什么 三个表(在实体框架核心中工作) 客户 公司 地址 客户可以有多个地址,公司可以有多个地址,但同一地址不应与两者都相关,因此只允许一个地址。我似乎找不到最正确的方法。现在我有两个FK-on地址,所以其中一个总是空的,但感觉很奇怪 一直在考虑创建ClientAddress&CompanyAddress,它继承自Address,并使用每个层次结构的表方法,因为EF Core中还

我已经有一段时间没有重做整个数据库了,我对一个非常基本的问题提出了质疑,但我无法通过搜索找到正确的答案。好像我错过了什么

三个表(在实体框架核心中工作)

  • 客户
  • 公司
  • 地址
客户可以有多个地址,公司可以有多个地址,但同一地址不应与两者都相关,因此只允许一个地址。我似乎找不到最正确的方法。现在我有两个FK-on地址,所以其中一个总是空的,但感觉很奇怪

一直在考虑创建ClientAddress&CompanyAddress,它继承自Address,并使用每个层次结构的表方法,因为EF Core中还不支持每个类型的表。。它们都有相同的字段,但只有关系不同,但不确定这是否正确


这里有什么建议吗?

对于
地址有两个可选的FK,一个引用
客户
,另一个引用
公司
,其中一个对于任何给定的地址行都为空,这是地址与客户或公司之间的替代(XOR-)关联的正确表示


因此,没有必要人为地区分“ClientAddress”和“CompanyAddress”来破坏您的设计

派对模式<代码>客户
公司
是双方。DB中的子类型类似于:@DamirSudarevic Client和Company在我们的数据库中非常不同,所以我不能将它们用作子类型。它们是这个词的一般意义上的“子类型”。每个FK(除其他外)都具有子类型和超类型的特征。阅读链接&googlere-DB/SQL-subtypes/heritation/polymorphics,网址:stackoverflow.com。您还有两种类型的地址——一种用于参与方的每个子类型。不相交的子类型。有更好的设计。具有多态关系的TPH/TPT。@杰西:听起来像是过度工程化了。。。但是如果你认为你知道一个解决方案,那么你应该在回答中提出它。你能再解释一下为什么它过于工程化吗?将在答案完全清楚时发布答案,以便其他人也能从中受益。