如何创建类似树形结构的动态结构

3

我有一个家庭成员数据库,想要通过从表中读取信息动态生成一个家谱网页。

我的表结构如下:

id(int)  name  father(int)  mother(int)  spouse(int)  dateOfBirth

在这里,fathermotherspouse都是引用同一张表中的id列。根节点的父母列(fathermother)都为null。

有了这些数据,我该如何动态生成家谱呢?由于我是设计表的新手,如果这种设计不够优秀,请建议另一种能够实现此目标的架构。

任何关于如何开始的指针都将不胜感激。

3个回答

2

0

你的设计看起来没问题,但使用这个设计插入节点比从表中获取节点更容易。

你可以查看嵌套集合并实现该模型。嵌套集合更难更新,但你可以通过单个查询获得任何子树的节点,所以我认为它非常适合你的问题(家谱并不会经常变化:)。

除了嵌套集合父子关系之外,你还需要一些元数据,例如关系类型(孩子、兄弟、配偶),但我认为你可以很容易地添加它们。


那是个好建议。好的,假设我已经有了在表格中的数据,我该如何在网页上呈现这些数据?应该看起来像这样,只不过是竖向排列 链接 - Eby John
从语义上讲,我会使用嵌套的<ul>,但是我不知道CSS(只需应用边距?)和样式,一个好的设计师会帮助 :)。 - Daniel Dinu
Google Visualization API 我更倾向于这个方案。感谢您的建议。 - Eby John

0

这个设计还可以,但是你要么选择选取所有数据然后在客户端依次检查返回的数组构建树结构,要么执行多个子查询,这都不是非常好的方法。

我知道的最好的解决方案(针对分层结构,包括配偶)是将树路径存储在字符串字段中。例如,你有一个祖父的id为1,孩子的id为2和3,2有孩子4和5。那么,它们的路径分别为“”,“1”,“1”,“1,2”,“1,2,4”,“1,2,5”。

你可以使用这个结构按顺序检索树元素,使用ORDER BY path子句。


你也可以使用类似 php-gd 的工具来可视化树形结构。 - vissi
你能详细说明一下那个字符串表示吗?我发现你的例子很难理解。 - Eby John
这里有一个关于嵌套集的链接:http://stackoverflow.com/questions/687995/what-is-the-best-way-to-store-a-threaded-message-list-tree-in-sql - vissi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接