如果基本对象是一个人,那么表示家庭内关系的最佳数据库结构是什么

Rid*_*ous 1 mysql sql relationship

我有一个完整的大型数据库或称为 PERSONS 的人。

我想将它们彼此的关系存储在单独的表中。

我在想这样的事情:

FAMILY
PERSON_IDS: 123, 345, 678
RELATIONS:  self, brother, daughter
Run Code Online (Sandbox Code Playgroud)

使用“自我”标志来指示引用关系的人。所以,在这个例子中,123 是一个男人,345 是他的兄弟,678 是一个女人,他的女儿。即,可以从关系中导出性别信息。

这是正确的方法吗?

或者每行只有 2 个人和一种关系类型会更有效吗

PERSON_IDS: 123, 456
RELATION: brother
Run Code Online (Sandbox Code Playgroud)

——

PERSON_IDS: 123, 678
RELATION: daughter
Run Code Online (Sandbox Code Playgroud)

或者每个人都有一个男性/女性字段并且关系表只指定例如“兄弟姐妹”更好。

或者我应该有一张只有 PARENTS 的表并存储 PERSON 的性别?

TABLE PARENTS:
PARENT_ID: 123
CHILD_ID: 678
Run Code Online (Sandbox Code Playgroud)

目的是在显示Person 时显示相关人员。设计应该针对性能和速度进行优化,而不是为了便于管理。

谢谢你的帮助。

eca*_*ver 6

这是一种多对多的关系:每个人可以有很多亲戚,也可以是很多人的亲戚。假设您的 Person 表有一个名为 的主键Id,您可以有一个表,其中包含两个人之间的关系以及他们之间的关系类型。拥有一个包含所有可能类型关系的表格会很有用,如下所示:

Relationship(Id, Kind)
Family(Person_Id, Relative_Id, Relationship_Id)
Run Code Online (Sandbox Code Playgroud)

因此,如果您有以下人员和关系表的数据:

Person:             Relationship:
Id | Name           Id | Kind
 1 | John            1 | Father
 2 | Mike            2 | Sister
 3 | Susan
Run Code Online (Sandbox Code Playgroud)

以及 Family 表的以下内容:

P_Id | Rel_Id | Relation_Id
 1   |   2    |      1
 1   |   3    |      1
 2   |   3    |      2
Run Code Online (Sandbox Code Playgroud)

家庭表上说约翰是迈克和苏珊的父亲,迈克的妹妹是苏珊。我认为这可能是一个很好的方法,但是当然,作为数据库设计中的几乎所有内容,这个解决方案是有争议的。

  • 您可能还希望添加一个 `reverse_relation_id` 列来显示 `Relative_Id` 与 `Person_Id` 的关系。即,儿子,女儿,兄弟。 (4认同)