如果基础对象是人,那么表示家庭内关系的最佳数据库结构是啥
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_Id
与Person_Id
的关系。即,儿子,女儿,兄弟。以上是关于如果基础对象是人,那么表示家庭内关系的最佳数据库结构是啥的主要内容,如果未能解决你的问题,请参考以下文章