在数据库表中表示人员之间关系的适当方法是什么?

Emi*_*lio 5 database database-design many-to-many self-join

我有一个人员表 - ID 主键和姓名。在我的应用程序中,人们可以与其他人有 0 或更多的现实世界关系,因此杰克可能“为”简“工作”,汤姆可能“取代”托尼,鲍勃可能“是”的雇员,而鲍勃也可能“结婚”给“玛丽。

在数据库中表示这一点的最佳方式是什么?多对多相交表?一系列自加入?一个关系表,每个关系对和类型一行,我可以在其中双向插入关系记录吗?

Bil*_*win 5

为每种类型的关系创建单独的多对多表。

如果您尝试在单个多对多表中表示多种类型的关系,则违反了第四范式


回复评论:

实际上违反 4NF 的情况是这样的:

Person1 Person2 Is_Employer Is_Teacher Is_Father
Tom     John     No          No         Yes
Run Code Online (Sandbox Code Playgroud)

如果您有一个三列表,其中列出了两个人和一种关系类型,那就更好了,但是您仍然会遇到相互关系的问题。

Person1 Person2  Rel_type
John     Ann     married
Run Code Online (Sandbox Code Playgroud)

有些人对于是否存储两行,或者以某种一致的顺序存储两个人(例如,首先是较低的 ID 值)感到困惑。但也存在一些有针对性的关系,比如“雇主”,其中的命令意味着某种意义。并且与多个人有关系,例如“兄弟姐妹”。

因此,组织这些关系的另一种方法是创建一个列出组的表,每行一个组,然后创建另一个列出该组中人员的表。

Group Rel_type    Group Person
123   siblings    123   Bobby
                  123   Peter
                  123   Greg
                  123   Cindy
                  123   Jan
                  123   Marsha
Run Code Online (Sandbox Code Playgroud)

这最适合成员数量可变且互惠的关系。运动队的成员是另一个例子。它本质上是组和人员之间的多对多表。

您可能需要多种方式来存储关系,以考虑所有不同的类型。