樹形結構在關聯式資料庫中的設計

2022-03-22 00:17:36 字數 2374 閱讀 8737

在程式設計中,經常以樹形結構表示資料的層次關係,如選單的結構、商品的分類等。

這樣的層次結構在關聯式資料庫中難以直觀地表示。常見的一種做法是用乙個字段指向上級節點來表示記錄的上下級關係。

fidpid

fname

1  food

21  

fruit32

red4

3cherry52

yellow65

banana 71

meat87

beef97

pork

當要查詢某一節點的上一級節點,比如 beff,可以查詢 beff(pid=7) 指向的那條記錄。

select

*from food where fid =

7;

當要查詢某一節點的下一級節點,比如 fruit,可以查詢 pid 指向 fruit(fid=2) 的記錄。

select

*from food where pid =

2;

另有一種基於左右值編碼的設計,這種設計方式的表結構如下:

fidfname

lftrgt

1food

1 18 

2fruit

211 

3red

3 6 

4  cherry 45 

5yellow710

6banana 

8 9 

7meat

12 17  

8beef

13 14 

9pork

15  

16  

fid 跟節點的層次完全沒有關係,僅僅用來標識節點。引入了左右值來表示節點之間的關係,如下圖所示。

這樣的設計能夠方便地遍歷一棵樹,從左值數到右值便是先序遍歷了一棵(子)樹。更多詳細的設計,參見  和 

最後一種自己想到的設計:用字串 str 來標識節點,並約定標識其上級節點的字串為 substr(str, 1, length(str)-1)。例如,有一節點的以 "abc" 標識,則其上級節點以 "ab" 標識。

fidfname

afood

aafruit

aaared

aaaa 

cherry

aabyellow

aaba

banana 

abmeat

ababeef

abbpork

當要查詢某一節點的上一級節點,比如 beff,因為 beff 的 fid 為 "aba", 所以其上級節點的 fid 為 "ab"。

select

*from food where fid ='ab

';

當要查詢某一節點的路徑,比如 beff,因為 beff 的 fid 為 "aba",所有其路徑為 a/ab/aba。

select

*from food where fid in ('

a', '

ab', '

aba') order

by fid;

當要查詢某一節點的下一級節點,比如 fruit,因為 fruit 的 fid 為 "aa",所以其下一級節點的 fid 是以 "aa" 開頭且比 "aa" 多乙個字元的字串。

select

*from food where fid like

'aa_

';

當要查詢某一節點的所有下級節點,比如 fruit,因為 fruit 的 fid 為 "aa",所以其所有下級節點的 fid 是以 "aa" 開頭的字串。

select

*from food where fid like

'aa%

'and fid !='aa

';

第一種設計方式, 直觀方便,但是在對樹的遍歷過程中需要遞迴查詢,資料量大時,對效率的影響很大。這種設計適合的場景:1) 資料量不大的時候; 2) 只會經常查詢節點的下一級節點而不會頻繁查詢節點的所有下級節點。

基於左右值編碼的設計方式,消除了遍歷樹時的遞迴操作,查詢效率高,但是設計較為複雜,增刪節點的代價較大。

第三種設計方式,同樣刪除了遍歷樹是的遞迴操作,無論是廣度優先搜尋(order by length(fid))還是深度優先搜尋(order by fid),都極為方便。這種設計在增刪節點時會影響著節點的所有下級節點的標識編碼。這種設計方式適合的場景:1) 樹形結構基本穩定,很少需要對其增刪節點; 2) 需要頻繁地查詢某個節點的所有下級節點。

關聯式資料庫 關係資料結構

若關係中的某一屬性組的值能夠唯一地標識乙個元組,而其他子集不能,則稱該屬性組為候選碼。若乙個關係中有多個候選碼,則選定其中乙個為主碼。候選碼的諸屬性稱為主屬性,不包含在任何候選碼中的屬性稱為非主屬性或者叫非碼屬性。在最簡單的情況下,候選碼只包含乙個屬性,在最極端的情況下,關係模式的所有屬性是這個關係...

關聯式資料庫設計正規化

簡介 設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。目前關聯式資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 巴德斯科正規化 bcnf 第四正規化 4nf 和第...

關聯式資料庫的設計正規化

所謂第一正規化 1nf 是指資料庫表的每一列都是不可分割的基本資料項,同一列不能有多個含義,即實體的某個屬性不能有多個含義或者不能有重複的屬性。1nf是關聯式資料庫的基本原則,不滿足1nf的要求,就不能稱其為關聯式資料庫。第一正規化表達了如下3個意思。1 乙個表中不能同時存在兩個含義重複的屬性。2 ...