中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

樹狀數據結構存儲方式的案例

發布時間:2020-11-09 11:51:21 來源:億速云 閱讀:215 作者:小新 欄目:編程語言

這篇文章主要介紹樹狀數據結構存儲方式的案例,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

Create

在嵌套集合模型中,每個數據其實就是一個節點 (node),而每個節點占用 2 個位值,比如我們先新增一個 Smartphones 一級節點開始。

INSERT INTO `categories` (`title`, `lft`, `rgt`) VALUES('Smartphones', 1, 2);

Smartphones 作為一個主節點 (root),它的 lft 必定為 1,而 rgt 的值,會隨著其集合內的子元素增加而增加。

現在,我們希望在 Smartphones 內,添加一個子元素 Android。借助 mysql 的存儲過程。

LOCK TABLE categories WRITE;
SELECT @root_left := lft FROM categories WHERE title = 'Smartphones';
UPDATE categories SET rgt = rgt + 2 WHERE rgt > @root_left;
UPDATE categories SET lft = lft + 2 WHERE lft > @root_left;
INSERT INTO categories (title, lft, rgt) VALUES('Android', @root_left + 1, @root_left + 2);
UNLOCK TABLES;
SELECT `title`, `lft`, `rgt` FROM `categories`;
+-------------+-----+-----+
| title       | lft | rgt |
+-------------+-----+-----+
| Smartphones |   1 |   4 |
| Android     |   2 |   3 |
+-------------+-----+-----+

我們再嘗試往 Android 內添加一個子元素 小米:

LOCK TABLE categories WRITE;
SELECT @root_left := lft FROM categories WHERE title = 'Android';
UPDATE categories SET rgt = rgt + 2 WHERE rgt > @root_left;
UPDATE categories SET lft = lft + 2 WHERE lft > @root_left;
INSERT INTO categories (title, lft, rgt) VALUES('小米', @root_left + 1, @root_left + 2);
UNLOCK TABLES;
SELECT `title`, `lft`, `rgt` FROM `categories`;
+-------------+-----+-----+
| title       | lft | rgt |
+-------------+-----+-----+
| Smartphones |   1 |   6 |
| Android     |   2 |   5 |
| 小米        |   3 |   4 |
+-------------+-----+-----+

這時候,我們再嘗試往 Smartphones 內添加一個子元素 iOS,在前面,我們已經在里面添加了一個 Android 元素,所以這里要調整一下存儲過程,將 iOS 插入到 Android 的右邊

LOCK TABLE categories WRITE;
SELECT @next_right := rgt FROM categories WHERE title = 'Android';
UPDATE categories SET rgt = rgt + 2 WHERE rgt > @next_right;
UPDATE categories SET lft = lft + 2 WHERE lft > @next_right;
INSERT INTO categories(title, lft, rgt) VALUES('iOS', @next_right + 1, @next_right + 2);
UNLOCK TABLES;
SELECT `title`, `lft`, `rgt` FROM `categories`;
+-------------+-----+-----+
| title       | lft | rgt |
+-------------+-----+-----+
| Smartphones |   1 |   8 |
| Android     |   2 |   5 |
| 小米        |   3 |   4 |
| iOS         |   6 |   7 |
+-------------+-----+-----+

Delete

刪除節點時,其實可以看做是新增節點的逆過程,我們引入一個寬度,來衡量節點的寬段,其表示為: rgt - lft + 1 所以我們可以這樣寫存儲過程:

LOCK TABLE categories WRITE;
SELECT @delete_left := lft, @delete_right := rgt, @delete_width := rgt - lft + 1
FROM categories WHERE title = 'Android';
DELETE FROM categories WHERE lft BETWEEN @delete_left AND @delete_right;
UPDATE categories SET rgt = rgt - @delete_width WHERE rgt > @delete_right;
UPDATE categories SET lft = lft - @delete_width WHERE lft > @delete_right;
UNLOCK TABLES;
SELECT `title`, `lft`, `rgt` FROM `categories`;
+-------------+-----+-----+
| title       | lft | rgt |
+-------------+-----+-----+
| Smartphones |   1 |   4 |
| iOS         |   2 |   3 |
+-------------+-----+-----+

Update

移動節點,是一個比較復雜的過程,例如下圖,macOS 應該歸類到 Unix 分類下。

樹狀數據結構存儲方式的案例

要實現節點的移動,需要三步:

1、將要移動的節點摘出來

2、重新編排 lft 和 rgt 參數

3、將節點移動到指定位置

LOCK TABLE categories WRITE;
-- 將要移動的節點摘出來,并且重新邊篇 lft 和 rgt
SELECT @move_left := lft , @move_right := rgt, @move_width := rgt - lft + 1
FROM categories WHERE title = 'macOS';
UPDATE categories SET rgt = -rgt WHERE lft BETWEEN @move_left AND @move_right;
UPDATE categories SET lft = -lft WHERE lft BETWEEN @move_left AND @move_right;
UPDATE categories SET rgt = rgt - @move_width WHERE rgt > @move_right;
UPDATE categories SET lft = lft - @move_width WHERE lft > @move_right;
-- 將節點放到 Unix 節點里
SELECT @root_left := lft FROM categories WHERE title = 'Unix';
UPDATE categories SET rgt = rgt + @move_width WHERE rgt > @root_left;
UPDATE categories SET lft = lft + @move_width WHERE lft > @root_left;
-- 
UPDATE categories SET lft = @root_left + 1 WHERE lft BETWEEN -@move_right AND -@move_left;
UPDATE categories SET rgt = @root_left + 2 WHERE rgt BETWEEN -@move_right AND -@move_left;
UNLOCK TABLES;

總結

其實 SQL 中的嵌套集合的數據模型已經提出很久了,也有很多包已經實現了這個功能,比如 laravel-nestedset 或者 django-mptt

對于生產使用中,肯定是沒有這么簡單的表結構設計,或者甚至別的優化,比如一種稱為閉合表的數據模型,這個應該會在本系列文章中介紹給大家。

以上是樹狀數據結構存儲方式的案例的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

抚顺市| 湖南省| 习水县| 新疆| 余姚市| 临沂市| 临清市| 南昌市| 呼图壁县| 玉树县| 社会| 黄平县| 怀柔区| 九龙城区| 阳朔县| 柘荣县| 东乌珠穆沁旗| 峡江县| 高唐县| 阿勒泰市| 兰溪市| 铜川市| 新津县| 海盐县| 濮阳市| 合作市| 延边| 屯门区| 阿克陶县| 鹿泉市| 图木舒克市| 江阴市| 阿拉善右旗| 固镇县| 拜城县| 遂溪县| 邵阳县| 永清县| 商南县| 临朐县| 桂阳县|