这是我的情况。我正在建立一个数据库来跟踪人和家庭之间的关系。通常,一切都与“户主”有关。
我试图避免这种情况,因为它会在人们搬家(即兄弟终于找到工作并搬出)或家庭破裂(即爸爸和妈妈离婚,家庭现在一分为二,有些 child 和妈妈呆在一起,有些 child 留在妈妈身边)时产生问题和爸爸)。
当模型基于 HOH 时,弄清楚如何级联数据是一个巨大的挑战。我的方法是将数据拆分为 3 个表,即家庭、人员和关系。 hh 只存储一个地址和一个 id。关系存储 person_id_a、person_id_b 和关系代码(即 1 = sibling )。 person 存储名称和 hh_id。这样,如果一个家庭破裂,我可以将妈妈和爸爸之间的关系更改为 NULL,并为爸爸和与他一起来的任何 child 创建一个新的 hh,而不会破坏其他关系。![这是模型的样子:
人
-person_id
-hh_id
关系
-person_id_a
-person_id_b
-relationship_cd
家庭
-hh_id
-地址
这对你们有意义吗?你能想到这行不通的任何原因,或者认为有更好的模型吗?
抱歉,我知道这有点令人沮丧。所有这些离婚让我的工作变得困难>:(
最佳答案
对于名称,我建议保持简单。有一个包含三列的名称表:
您甚至可以只为 FullName 使用单个名称列。我不会有中间名、已婚姓名、婚前姓氏、父姓、昵称或任何其他“特殊”姓名列。它只会使任何名称搜索算法复杂化,并混淆数据输入。以下是一些需要考虑的示例名称:
那么这些名字代表什么呢?第一个是很普通的英文名字,有第一个 (John)、中间 (Paul) 和最后一个 (Smith)。第二个是玛丽。她的法定姓名中没有中间名。她的娘家姓是保罗,婚后姓是史密斯。她使用两者,没有连字符。第三个是约翰。他的 parent 认为给他三个中间名会很棒。第四个是西类牙裔名字,这是她的法定全名。她的名字是玛丽亚·德·洛杉矶。 “de los Angeles”是她拳头名字的一部分。她没有中间名。她父亲的第一个姓氏是戈麦斯。她母亲的第一个姓氏是波蒂略。所以玛丽亚的全名是戈麦斯波蒂略。她通常只和玛丽亚·戈麦斯 (Maria Gomez) 擦肩而过,因为她厌倦了以错误的方式输入自己的名字。从技术上讲,Portillo 是她的“姓氏”,但如果她只使用两个姓氏中的一个,她会使用第一个姓氏(父姓)。第五个是阿卜杜勒·拉赫敏,他是巴勒斯坦阿卜杜勒·阿齐兹的孙子赛义德的儿子。把它放在第一个/中间/最后一个,玩得开心。 Abdul Rahmin 是他的名字。其余的都是姓氏。最后一位是阿卜杜拉。他来自阿富汗。人们在那里没有姓氏并不少见。他只是阿卜杜拉。他也不知道自己的生日,因为他来自哪里,他们并不关心(这在美国殖民时代经常发生……在许多文化中关心生日是最近发生的事情)。
您应该有一个单独的姓名表,这样一个人可以有多个姓名行。一个例子说明了许多原因之一。玛丽·史密斯讨厌她的俗名。所以她把它合法地改为宇宙的阳光 Lollipop 伯爵夫人。两年后,她有点后悔。现在,她有时使用 Mary Smith,有时使用 Sunshine Universe,这取决于月相。将它们都存储起来,您可以通过任何一种方式找到她。
无论您怎么做,人们都会以各种可以想象的方式(以及一些您无法想象的方式)修改名称,并在不同的时间输入不同的名称。如果你不接受它是理所当然的,你就会遇到问题。
对于家庭,正如我在评论中提到的,您可能希望支持多对多关系。一个家庭可以有零到多个人,一个人可以有零到多个家庭。不过这有点棘手,因为这取决于您对家庭的定义。您可能觉得有必要将其表示为主要的,但请考虑一个 child 一半时间与母亲在一起,一半时间与父亲在一起。哪个是初级?
关于代表家庭、家庭和关系的数据库模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30128025/