• 游客 您好:

    目前「IT人巴啦啦天地」需要數個專家協助發表文章。

    只要您願意,可以直接與我 ihstat 連絡。我將會給你「專家」身份。

    成為「專家」有什麼好處?目前暫時還沒有。我也只願意提供最多10名會員有這樣的身份。

    他可能可以成為未來非常高的權限。(除了管理) 也可以獲得由浩瀚星空站提供的資源。

  • 本站不接受任何被列入廣告發文黑名單的電子信箱。如您無法註冊,可能是您使用的電子信箱為廣告黑名單信箱。正常的信箱都是可以正常註冊。

    如果您可以証實您的信箱非廣告黑名單,請自行來信 hstaryoching#gmail.com 申請。

    申請請留下您的正統名稱及信箱,並告知從何得知及想進來的理由。

  • 浩瀚星空站已經重新整合並新增新的開發小站天地。

    採用新版的xenforo 2.2.3 做為最新的站點系統。

    中文搜尋已在本站啟用成功,歡迎多加測試看看

    有問題請再回報

教學 無限樹狀分類設計理念-二元樹理念

ihstar

管理員
管理成員
各位大家好,所謂的分類階層的設計。相信大家都不陌生。

一般人接觸的大多是所謂的上階層定義法

代碼:
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)
接著再加入 C 節點:
HTML:
       A (1,6)
           |
    ---------------
    |             |
B (2,3)        C (4,5)
# 假設一般的程式運作流程,我們可能先用 ORM 之類的取得 A 的資料
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);

這樣~~~其準備的工作就完成了。
 

ihstar

管理員
管理成員
在來是不是就這樣完了??當然不是了。
應用這樣的原理解釋。這邊可能會需要用圖來說明
1705397362185.png


好的,先如上面這樣,明白了嗎??
明白就有鬼了。
這是一種用圓包含的特性的理念圖,讓大家知道說,其LR分支的方式原理是什麼。|
當然,這樣一看怎麼感覺跟無限樹圖表沒關係的感覺呢??
那我用下面這張圖給你們看。
1705397384567.png
這樣是否有看出來了。其實所謂的lr值。就是一種樹狀外包圍的方式。
其如果將其拉平的話。是不是就跟上面的圖一樣了??

但,我還是相信,很多人還是搞得一頭霧水。
沒關係,原理給你們先去研究吧。我們下一課就會進入你們想要的正題了。
 
頂部