排除公告

嗨!遊客

歡迎您的到來喔!第一次來此嗎?

如有任何問題,還請到 建言/問題

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

本帖由 yoching2016-10-11 發佈。版面名稱:PHP

  1. yoching

    yoching 站務人員
    管理成員

    註冊:
    2016-10-01
    文章:
    36
    讚:
    3
    各位大家好,所謂的分類階層的設計。相信大家都不陌生。

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

    代碼:
    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);
    這樣~~~其準備的工作就完成了。
     
    • 喜歡 喜歡 x 1
    #1 yoching, 2016-10-11
    最後編輯: 2018-05-11
  2. yoching

    yoching 站務人員
    管理成員

    註冊:
    2016-10-01
    文章:
    36
    讚:
    3
    在來是不是就這樣完了??當然不是了。
    應用這樣的原理解釋。這邊可能會需要用圖來說明
    04174233_OYLx.png

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

    但,我還是相信,很多人還是搞得一頭霧水。
    沒關係,原理給你們先去研究吧。我們下一課就會進入你們想要的正題了。
     
    #2 yoching, 2016-10-13
    最後編輯: 2018-05-11

分享此頁面

正在載入...