2012-08-12 70 views
1

你会如何坚持自定义树结构的根节点,以便可以用简单的SELECT来检索它们?树木:如何在持续时识别/标记根对象?

伪代码

class Node { 
    Long id; 
    String label; 
    Node parent; 
    List<Node> children; 
} 

编辑:表可以如下。随意提出改进建议。

CREATE TABLE NODES(
    ID INTEGER NOT NULL UNIQUE, 
    LABEL VARCHAR(255) 
); 

CREATE TABLE PARENTS_CHILDREN(
    PARENT_ID INTEGER NOT NULL, 
    CHILD_ID INTEGER NOT NULL 
); 
+0

非常模糊的问题国际海事组织。 Pesist在哪里?你在谈论什么样的“选择”? – 2012-08-12 09:51:56

+0

@ SanjayT.Sharma请参阅标签。 – 2012-08-12 09:52:58

+0

你使用什么数据库和版本? – 2012-08-12 09:56:29

回答

1

你可以使用邻接表:

node parent 
1  NULL 
2  1 
3  1 
4  2 
5  NULL 
6  5 

根节点可以WHERE parent IS NULL被发现。

+0

太好了。这证实了我的想法:)。我看到树实现没有针对根节点的特殊情况。我只需要放心他们如何编码。 – 2012-08-12 10:01:13

1

如果每个子节点最多只能有一个父节点,则不需要在单独的表中建模关系。此外,为了加快树的加载速度,以更慢的速度进行更改,请将根节点的ID存储在每一行中。这使您可以在一次快速查询中加载树的所有节点,并在客户端上构建树。

CREATE TABLE NODES(
    ID   INTEGER NOT NULL UNIQUE, 
    ROOT_ID  INTEGER NOT NULL, 
    PARENT_ID INTEGER, 
    LABEL  VARCHAR(255) 
); 
+0

“这使您可以在一个快速查询中加载树的所有节点,并在客户端上构建树。” - 非常酷的建议。没有想到这一点。 – 2012-08-12 10:09:25