各位大家好,所謂的分類階層的設計。相信大家都不陌生。
一般人接觸的大多是所謂的上階層定義法
這樣子來看,也的確可以達到多層樹狀。但缺點就是,你得先將所有的資料載入,才能得到包含的id。
雖然要取單一層則需要判斷aid就好。
這裏要介紹的是,另一種樹狀的分配法。我是叫他做LR分支法。(不過它好像有另外一個名稱,這我就不研究了)
一般來說,其原理如下處理
所有的節點,都會有其一個L值跟一個R值
其記錄就是 節點(L,R)
A節點一開始為
當我加入 B 節點在 A 下面時,會變成
接著再加入 C 節點:
# 假設一般的程式運作流程,我們可能先用 ORM 之類的取得 A 的資料
SELECT * FROM
# 取得 A 之後,用 A 的 lft, rgt 來query
SELECT * FROM
# 如果想要包含 A 一起的話
SELECT * FROM
# 以上寫法可以用任何一個語言實現
所以一般在分類上如果要建立的話。
可以建立如下的欄位格式
id 為主ID
title 分類名稱
lft 左對應值
rgt 右對應值
一般來說,我其實有時為了程式搭配方便使用。我還是會保留
parent_id 對應的上層id
level 對應的層級
所以其資料庫的建立就是
這樣~~~其準備的工作就完成了。
一般人接觸的大多是所謂的上階層定義法
代碼:
id name aid
----------------------
1 AAA 0
2 BBB 1
3 CCC 1
4 DDD 2
5 EEE 3
這樣子來看,也的確可以達到多層樹狀。但缺點就是,你得先將所有的資料載入,才能得到包含的id。
雖然要取單一層則需要判斷aid就好。
這裏要介紹的是,另一種樹狀的分配法。我是叫他做LR分支法。(不過它好像有另外一個名稱,這我就不研究了)
一般來說,其原理如下處理
所有的節點,都會有其一個L值跟一個R值
其記錄就是 節點(L,R)
A節點一開始為
HTML:
A(1,2)
當我加入 B 節點在 A 下面時,會變成
HTML:
A (1,4)
|
|
B (2,3)
HTML:
A (1,6)
|
---------------
| |
B (2,3) C (4,5)
SELECT * FROM
tree
WHERE id
= 1;# 取得 A 之後,用 A 的 lft, rgt 來query
SELECT * FROM
tree
WHERE lft
> 1 AND rgt
< 6# 如果想要包含 A 一起的話
SELECT * FROM
tree
WHERE lft
>= 1 AND rgt
<= 6# 以上寫法可以用任何一個語言實現
所以一般在分類上如果要建立的話。
可以建立如下的欄位格式
id 為主ID
title 分類名稱
lft 左對應值
rgt 右對應值
一般來說,我其實有時為了程式搭配方便使用。我還是會保留
parent_id 對應的上層id
level 對應的層級
所以其資料庫的建立就是
代碼:
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`lft` int(11) NOT NULL DEFAULT '0',
`rgt` int(11) NOT NULL DEFAULT '0',
`level` int(10) UNSIGNED NOT NULL DEFAULT '0',
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_left_right` (`lft`,`rgt`)
) DEFAULT CHARSET=utf8;
INSERT INTO `categories` VALUE (1, 0, 'ROOT', 1, 2, 1);
這樣~~~其準備的工作就完成了。