2012-08-01 53 views
0

我有一个考试问题: 我的名字是D.我是三个小孩的父亲,A,B和C.我有一个父母Z.我的父母有一个父母X我有一个兄弟,Y.我存储在一个Mysql数据库中。亲子关系可能的mysql数据库表结构

CREATE TABLE `test_tree` (
`idperson` int(11) NOT NULL, 
`name` varchar(45) DEFAULT NULL, 
`prime` int(11) DEFAULT NULL, 
`product` int(11) DEFAULT NULL, 
PRIMARY KEY (`idperson`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

INSERT INTO `temp`.`test_tree` 
(`idperson`, 
`name`, 
`prime`, 
`product`) 
VALUES 
('1', 'x', '2', '2'), 
('2', 'z', '3', '6'), 
('3', 'y', '17', '102'), 
('4', 'd', '5', '30'); 

注:总理和产品用于计算我的家庭的父母子女关系。 Prime =下一个可用素数 Product =(prime *父级产品)。素数的每个产品只能被这些素数分开。

问题:可以用来创建树的其他方法是什么,它们与当前的解决方案相比如何?

我答:

Solution 1: 
**test_tree** 
-id pk 
-parent_id fk (references id) 
-name 

Solution 2: 
**person** 
-id pk 
-name 

**relation** 
-child_id fk (references person.id) 
-parent_id fk (references person.id) 

For me, solution 2 has redundant table. 

ü可以给我建议其他的方法来创建表这样的关系?

+0

你建议的方式是我会这么做的。 – 2012-08-01 17:31:17

+0

谢谢,但问题也说:最多3个替代品。因此,必须有其他解决方案不是吗? – rockstar 2012-08-01 17:33:24

+1

确信你可以将关系存储在一个单独的表中,如果你有更复杂的关系需要映射,这可能会更合适。或者我最喜欢的是将树结构存储在NoSQL数据库中,在这种情况下,您的案例将整个树存储对象表示。 – 2012-08-01 17:36:35

回答

1

您已经省略了用于表示层次结构的“嵌套集模型”。

http://en.wikipedia.org/wiki/Nested_set_model


维基百科的文章提供了一个例子,以及链接到用大量的其他实施例的引用。

+0

你可以给这个问题的一个样本解决方案与上述问题? – rockstar 2012-08-01 18:17:39