我想构建一个MySQL数据库来存储家谱数据。然后使用PHP将其输出到网站。家谱只包括直接的祖先和倒金字塔类型:我的女儿作为源,她的2个父母作为第2代,她的4个祖父母作为第3代,她的8个伟大的祖父母作为第4代等。
我正在考虑创建四个表,一个用于男性祖先,另一个用于女性祖先,另外两个表用于表示它们之间的关系。
表“男性”和“女性”中的所有条目都将具有专用ID作为主键和每个人的基本数据(名字,姓氏,代,出生日期和地点,死亡日期和地点等)。我创建了这两个表,用数据填充它们并知道如何查询它们。我不确定的是如何连接“男性”和“女性”表格,以便与婚姻,后代和后代建立联系。
这是我到目前为止所做的。
CREATE DATABASE tree;
CREATE TABLE male ( sosa CHAR(20), firstname VARCHAR(128), lastname VARCHAR(128), birthplace VARCHAR(128), birthday SMALLINT, birthmonth SMALLINT, birthyear SMALLINT, deathplace VARCHAR(128), deathday SMALLINT, deathmonth SMALLINT, deathyear SMALLINT, note VARCHAR(128), generation SMALLINT, PRIMARY KEY (sosa)) ENGINE MyISAM;
CREATE TABLE female ( sosa CHAR(20), firstname VARCHAR(128), lastname VARCHAR(128), birthplace VARCHAR(128), birthday SMALLINT, birthmonth SMALLINT, birthyear SMALLINT, deathplace VARCHAR(128), deathday SMALLINT, deathmonth SMALLINT, deathyear SMALLINT, note VARCHAR(128), generation SMALLINT, PRIMARY KEY (sosa)) ENGINE MyISAM;
然后我创建了两个表来显示关系:
CREATE TABLE marriages ( father CHAR(20), mother CHAR(20), marriageplace VARCHAR(128), marriageday SMALLINT, marriagemonth SMALLINT, marriageyear SMALLINT, note VARCHAR(128)) ENGINE MyISAM;
CREATE TABLE child ( childId CHAR(20), father CHAR(20), mother CHAR(20)) ENGINE MyISAM;
我的数据库结构是否健全,还是我过于复杂?对于列出的每个人,我需要能够展示:谁是他/她的父母,谁是他/她的孩子,他们是他/她的祖先在x世代的时间跨度,例如3代。 / p>
编辑:
感谢您将所有人放在一张桌子中的想法,我会试一试。
至于自动增量,我宁愿在家谱中使用常用的Sosa引用。这给了家谱的来源1号,在这种情况下我的女儿,2为她的父亲,3为她的母亲。下一代的祖父母得到数字4,5,6和7.要找到任何人的父亲,你只需要加倍数字(2是1的父亲,4是2的父亲等)。要找到母亲,你加倍一个(3是1的母亲,5是2的母亲)。自动增量可以工作,但是当你无法追踪某些祖先时,因为某些分支已经死亡,你会留下未使用的参考号。
答案 0 :(得分:0)
我会为人们提供一个表格,每行都有一种引用父母的方式。除非你想要处理不太常见的情况,否则可能只是母亲专栏和父亲专栏。
然后,您可以通过递归执行选择
来读取该表MySQL不支持本机递归查询,因此您可能需要进行多次查询。您可以使用嵌套集模型来获取树结构,但在这种情况下(可能人们可能是树的不同分支中的多个子节点的父节点),我认为这不合适。
婚姻关系表仍然有意义。
顺便说一句,最好通常使用自动递增的整数id字段来引用其他表上的记录(并非总是如此,但在这种情况下会是这样),如果这样做,则将此id存储在INT字段中引用它的其他表。
答案 1 :(得分:0)
GEDCOM data model和Gramps data model是两种在不同工具之间交换生成数据的最常用格式。使用这些数据模型中的任何一个都应该(1)使您的工具与其他工具更兼容;(2)确保您的数据模型与许多特殊情况相符,考虑到这两种数据模型都是专门为处理生成数据而设计的。 p>
像Oxy-Gen或Gramps PHP exporter这样的工具可以帮助您解决如何将GEDCOM数据导入数据库的问题。
有关详情,请参阅我对“Family Tree” Data Structure的回答。