2012-08-12 66 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