表示家庭、家庭和关系的数据库模型

Database Model to Represent Families, Households, and Relationships

这是我的情况。我正在建立一个数据库来跟踪人与家庭之间的关系。通常,所有内容都绑定到 "head of household"。

我正在努力避免这种情况,因为当人们搬家(即兄弟最终找到工作并搬出去)或家庭破裂(即爸爸妈妈离婚,家庭现在一分为二,一些孩子和妈妈住,一些和爸爸)。

当模型基于HOH时,弄清楚如何级联数据是一个巨大的挑战。我的方法是将数据分成 3 个表,家庭、个人和关系。 hh 只存储一个地址和一个 id。关系存储 person_id_a、person_id_b 和关系代码(即 1 = sibling)。并且 person 存储名称和 hh_id。这样,如果一个家庭分裂了,我可以将妈妈和爸爸之间的关系更改为 NULL,并为爸爸和他带来的任何孩子创建一个新的 hh,而不会破坏其他关系。![这是模型的样子:

人 -person_id -hh_id

关系 -person_id_a -person_id_b -relationship_cd

家庭 -hh_id -地址

这对你们有意义吗?您能想到这行不通的任何原因,或者认为有更好的模型吗?

抱歉,我知道这有点令人沮丧。所有这些离婚让我的工作变得困难 >:(

对于名称,我建议保持简单。名称 table 三列:

  • GivenNames
  • 姓氏
  • NameType {合法,备用}

您甚至可以只为 FullName 使用单个名称列。我不会有中间名、婚前姓名、婚前姓名、父姓、昵称或任何其他 "special" 姓名列。它只会使任何名称搜索算法复杂化,并混淆数据输入。以下是一些需要考虑的示例名称:

  • 约翰·保罗·史密斯
  • 玛丽·保罗·史密斯
  • 约翰·亨利·威廉·阿尔忒弥斯·威廉姆斯
  • 玛丽亚·德·洛杉矶·戈麦斯·波蒂略
  • 阿卜杜勒·拉赫敏·伊本·赛义德·伊本·阿卜杜勒 al-Aziz al-Filasteeni
  • 阿卜杜拉

那么这些名字说明了什么?第一个是很正常的英文名字,有名字(John),中间(Paul)和最后(Smith)。第二个是玛丽。她的法定姓名中没有中间名。她婚前姓保罗,婚后姓史密斯。她两者都用,没有连字符。第三个是约翰。他的 parents 认为给他三个中间名会很棒。第四个是西班牙裔名字,这是她的全名。她的名字是玛丽亚·德·洛杉矶。 "de los Angeles" 是她拳名的一部分。她没有中间名。她父亲的第一个姓氏是戈麦斯。她母亲的第一个姓氏是波蒂略。所以 Maria 的全姓是 Gomez Portillo。她可能通常只叫 Maria Gomez,因为她已经厌倦了自己的名字以一种乱七八糟的方式输入。从技术上讲,Portillo 是她的 "last" 名字,但如果她只使用两个姓氏中的一个,她会使用第一个(父姓)。第五位是巴勒斯坦人阿卜杜勒 al-Aziz 的孙子赛义德的儿子阿卜杜勒拉赫敏。把它放在 first/middle/last 中玩得开心。阿都拉敏是他的名字。其余都是姓氏。最后一个是阿卜杜拉。他来自阿富汗。那里没有姓氏的人并不少见。他只是阿卜杜拉。他也不知道自己的生日,因为他来自哪里,他们不关心这个(这在美国殖民时代经常发生……关心生日在许多文化中都是最近才出现的事情)。

你应该有一个单独的名字table,这样一个人可以有多个名字行。一个例子说明了很多很多原因之一。玛丽史密斯讨厌她的俗名。所以她把它合法地改成了阳光棒棒糖宇宙伯爵夫人。两年后她有点后悔了。现在,她有时使用 Mary Smith,有时使用 Sunshine Universe,具体取决于月相。把它们都存起来,你就可以找到她。

无论您如何操作,人们都会以各种可以想象的方式(有些是您无法想象的)破坏名称,并在不同时间输入不同的名称。如果你不接受它作为给定的,你就会有问题。

对于家庭,正如我在评论中提到的,您可能希望支持 many-to-many 关系。一个家庭可以有零到多人,一个人可以有零到多个家庭。不过这有点棘手,因为这取决于您对家庭的定义。您可能觉得有必要将一个表示为主要对象,但请考虑一个 child,她一半时间与母亲在一起,另一半时间与父亲在一起。哪个是主要的?