。待本人專案完成奉上自己的專案流程及資料庫設計。
將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...