Database design DB设计:根实体是链接到两个或更多相关实体的好方法吗?

Database design DB设计:根实体是链接到两个或更多相关实体的好方法吗?,database-design,Database Design,我的应用程序基于关系数据库,必须处理两种客户实体(自然人)和组织。它们具有不同的属性,因此每个组都位于自己的表中 现在我有了其他数据对象,比如地址、标签或备忘录。每个记录完全属于一个人或一个组织 我想知道如何表达这种联系。当链接到个人或组织时,我不希望在目标表中有另一个字段 我在考虑在个人和组织之上创建一种超级实体。我在Highrise或Capsule CRM等CRM应用程序中看到过这种情况,他们称之为“派对”。每个人和每个组织在party表中都有相应的条目。其他表现在链接到party表,而不是

我的应用程序基于关系数据库,必须处理两种客户实体(自然人)和组织。它们具有不同的属性,因此每个组都位于自己的表中

现在我有了其他数据对象,比如地址、标签或备忘录。每个记录完全属于一个人或一个组织

我想知道如何表达这种联系。当链接到个人或组织时,我不希望在目标表中有另一个字段

我在考虑在个人和组织之上创建一种超级实体。我在Highrise或Capsule CRM等CRM应用程序中看到过这种情况,他们称之为“派对”。每个人和每个组织在party表中都有相应的条目。其他表现在链接到party表,而不是直接链接到个人或组织

缔约方:

  id | person_id | org_id
   1 |         1 |
   2 |           |      1
在上面的示例中,party记录#1链接到person#1,party#2链接到organization#1

这真的是一种可行的方法,还是我对一个更简单的解决方案有点盲目?

拥有一个类似“Party”的元表是一种选择,尽管我会使解决方案更具可扩展性。这个怎么样

PartyType
- id
- name

Party
- id
- partyTypeId
- typeSpecificId

在PartyType表中,您将定义“人员”和“组织”类型。然后,您创建的每个参与方都将有一个PartyType与之关联。通过这种方式,您可以在将来添加更多类型,并且您的表更加密集,没有那么多空列。

我将使用“超级”表的方法,但要改变引用<代码>人员和
组织
将引用
表,而不是相反

如果DBMS不直接支持关系数据库中的“继承”(如PostgreSQL),则这是在关系数据库中建模“继承”的常用设计模式


为方便起见,您可以创建加入party/person和party/Organization的视图,以便轻松访问基本属性和专用类型。

我已经多次回答了类似的问题。我给出的两个信息最丰富的答案是和。这两个答案在不同的语境中使用相似的结构;我认为,对第二个问题的评论特别有用。

这是一个非常简单的解决方案。作为一种副作用,它将两个实体的“主”表向下移动到同一级别,如地址等,并使头数据只是一方的另一个方面。您会在party表中创建类型字段(P/O)吗?否,对于两个单独的“类型表”,不需要类型列。唯一可能的用途是,您可以快速计算您拥有多少个人和组织(无需在子表上进行两次单独的计算)。除此之外,我看不到type列的任何优点。我喜欢使用party表的PK作为party和子类型条目的公共ID。这避免了在party表中存储(不同的)子类型ID。回答不错。我特别喜欢您解决问题的方式,即如何确保使用检查约束引用了正确的类型。但是,作为基表中主键的一部分的类型列不是更可靠吗?在这种上下文中的SQL级别上,主键是否是id以及唯一约束是否是id和类型的组合并不重要,或者b)主键是id和类型的组合,唯一约束位于id上。外键约束可以以PK或唯一约束为目标,而不管它们以何种方式定义。重要的是,为了安全性和灵活性,你需要这两个约束。哦,我不能因为解决了这个问题而得到赞扬。几年前,我通过Usenet新闻组学到了这些东西。(嗯,也许几十年前)我不记得是从谁那里学的,但如果我能弄清楚是谁学的,我很乐意相信他。
 party (id, customer_number, [other common attributes] )
 person (person_id, party_id, ... )
 organizations (org_id, party_id, ... )
 address (address_id, party_id, ...)