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

Posted

技术标签:

【中文标题】如果基础对象是人,那么表示家庭内关系的最佳数据库结构是啥【英文标题】:What's the best db structure to represent the relationships within a family if the base-object is a Person如果基础对象是人,那么表示家庭内关系的最佳数据库结构是什么 【发布时间】:2013-04-06 01:56:22 【问题描述】:

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

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

我在想这样的事情:

FAMILY
PERSON_IDS: 123, 345, 678
RELATIONS:  self, brother, daughter

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

这是正确的做法吗?

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

PERSON_IDS: 123, 456
RELATION: brother

-

PERSON_IDS: 123, 678
RELATION: daughter

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

或者我应该有一个只包含 PARENTS 的表并将性别与 PERSON 一起存储?

TABLE PARENTS:
PARENT_ID: 123
CHILD_ID: 678

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

感谢您的帮助。

【问题讨论】:

以上所有;没有。详细描述您首先需要捕捉的关系。您是否在捕捉阶梯关系以及自然关系。等等? 对自然关系和阶梯关系一视同仁。 对族建模的一个常见问题是人们希望将它们建模为层次结构。他们不是。它们是网络,它们有循环。 “父母”和“孩子”具有有时与法律意义相冲突的生物学意义。 “丈夫/妻子”关系可以同时是“丈夫/侄女”或“丈夫/女儿”关系。 另外,任何时候你想在 ID 号码后面加上逗号,你就走错路了。 【参考方案1】:

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

Relationship(Id, Kind)
Family(Person_Id, Relative_Id, Relationship_Id)

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

Person:             Relationship:
Id | Name           Id | Kind
 1 | John            1 | Father
 2 | Mike            2 | Sister
 3 | Susan

家庭表如下:

P_Id | Rel_Id | Relation_Id
 1   |   2    |      1
 1   |   3    |      1
 2   |   3    |      2

家庭表显示约翰是迈克和苏珊的父亲,迈克的妹妹是苏珊。我认为这可能是一个很好的方法,但当然,就像数据库设计中的几乎所有内容一样,这个解决方案是值得商榷的。

【讨论】:

谢谢。这看起来是一个很好的解决方案。最初,我希望这是一个非常普遍的“问题”,并且已经建立了某种标准化的方法。哦,好吧...生活和学习... 您可能还希望添加一个reverse_relation_id 列来显示Relative_IdPerson_Id 的关系。即,儿子,女儿,兄弟。

以上是关于如果基础对象是人,那么表示家庭内关系的最佳数据库结构是啥的主要内容,如果未能解决你的问题,请参考以下文章

数据库-语言基础

js基础,DOM 文档对象模型

关于Javascipt基础6

Java学习笔记UML基础

核心数据获取关系对象

蔡康永的201堂情商课 蔡康永201情商百度云下载