樹形結構資料儲存方案之閉包錶

2021-09-12 13:07:52 字數 2559 閱讀 5948

。待本人專案完成奉上自己的專案流程及資料庫設計。

將closure table翻譯成閉包錶不知道是否合適,閉包錶的思路和物化路徑差不多,都是空間換時間,closure table,一種更為徹底的全路徑結構,分別記錄路徑上相關結點的全展開形式。能明晰任意兩結點關係而無須多餘查詢,級聯刪除和結點移動也很方便。但是它的儲存開銷會大一些,除了表示結點的meta資訊,還需要一張專用的關係表。

以下圖舉例資料舉例:

建立主表:

create table nodeinfo (

node_id int not null auto_increment,

node_name varchar (255),

primary key (`node_id`)

) default charset = utf8;

建立關係表:

create table noderelationship (

ancestor int not null,

descendant int not null,

distance int not null,

primary key (ancestor, descendant)

) default charset = utf8;

其中新增資料(建立儲存過程)

create definer = `root`@`localhost` procedure `addnode`(`_parent_name` varchar(255),`_node_name` varchar(255))

begin

declare _ancestor int;

declare _descendant int;

declare _parent int;

if not exists(select node_id from nodeinfo where node_name = _node_name)

then

insert into nodeinfo (node_name) values(_node_name);

set _descendant = (select node_id from nodeinfo where node_name = _node_name);

insert into noderelationship (ancestor,descendant,distance) values(_descendant,_descendant,0);

if exists (select node_id from nodeinfo where node_name = _parent_name)

then

set _parent = (select node_id from nodeinfo where node_name = _parent_name);

insert into noderelationship (ancestor,descendant,distance) select ancestor,_descendant,distance+1 from noderelationship where descendant = _parent;

end if;

end if;

end;

完成後2張表的資料大致是這樣的:(注意:每個節點都有一條到其本身的記錄。)

查詢fruit下所有的子節點:

select

n3.node_name

from

nodeinfo n1

inner join noderelationship n2 on n1.node_id = n2.ancestor

inner join nodeinfo n3 on n2.descendant = n3.node_id

where

n1.node_name = 'fruit'

and n2.distance != 0

查詢fruit下直屬子節點:

select

n3.node_name

from

nodeinfo n1

inner join noderelationship n2 on n1.node_id = n2.ancestor

inner join nodeinfo n3 on n2.descendant = n3.node_id

where

n1.node_name = 'fruit'

and n2.distance = 1

查詢fruit所處的層級:

select

n2.*, n3.node_name

from

nodeinfo n1

inner join noderelationship n2 on n1.node_id = n2.descendant

inner join nodeinfo n3 on n2.ancestor = n3.node_id

where

n1.node_name = 'fruit'

order by

n2.distance desc

另外要刪除節點也非常的簡單,這裡就不再做過多的闡述。

**

樹形結構閉包錶設計

閉包錶是解決分層儲存乙個簡單而又優雅的解決方案,它記錄了表中所有的節點關係,並不僅僅是直接的父子關係。在閉包錶的設計中,額外建立了一張節點關係表 空間換取時間 它包含兩列,每一列都是乙個指向樹形結構中主鍵的外來鍵。這張表存放包括自身在內的所有的和他有關係的節點資料 create table comm...

樹形結構資料的儲存

樹形結構在國人中的需求很多,比如單位和子單位 人員的上下級管理關係等,一般資料庫設計是通過id,pid來確定父子關係,但如果要查詢某個節點下所有的子節點,可以通過with關鍵字查詢效,具體方法可見這篇文章,改進方法主要有兩種 物化路徑和左右節點。對於使用物化路徑,有通過儲存過程實現的,比如 最近在網...

資料庫 閉包錶

一 精英 晶 1 閉包錶中設計distance欄位,用於查詢指定節點指定子層級的所有子節點 2 可管理機構的查詢 合同專案的查詢 3 查詢所有的上級機構,hd group path 4 通過為指定資料庫使用者授權訪問表的許可權 5 oracle 授權sql方法 建立dblink create pub...