需求分析
- 族谱有一个特点就是写入少,所以可以建立一个缓存表。
- 维护关系尽量简单
- 查询上下几代尽量快速,避免递归
数据库结构
people 表
id
name 姓名
relation 表
id
family_id 族号 一个用户可能存在多个族谱中,比如外嫁后进入其他族谱
people_id 用户编号
level 代系
relate_people_id 关联人,
type 关系:如丈夫,妻子,儿子,孙子,情人
order 第几个孩子,第几任妻子
索引
alter table relation create index family_level(family_id,level);
查询(高性能将上下三代查出来)
select * from relation where family_id=3 and level between current_level-3,current_level+3;
分析
这两个表记录基本不用改(除非录错了),任何时候都是增加记录即可,所以维护也非常简单。
界面展示上,查询出上下几代,然后名字作为主要展示标签,关系用连线展示,关系和人是多对多,完美解决关系混乱的问题。
level 代表是族谱里面的第几代。
如果发现了新的祖先,然么当然自己代数要加一。
比如李渊原来 level 是 1 代,然后认了老子做祖宗,那么他就不 1 代了,老子是 1 代。
族谱草图
参考
- 在v2ex上的讨论:https://v2ex.com/t/671013