資料庫 樹型關係的資料表

2021-08-11 19:19:16 字數 3012 閱讀 9105

樹型關係的資料,例如常見的類別表,即乙個大類,下面有若干個子類,某些子類又有子類這樣的情況。當類別不確定,使用者希望可以在任意類別下新增新的子類,或者刪除某個類別和其下的所有子類,而且預計以後其數量會逐步增長,此時就會考慮用乙個資料表來儲存這些資料。

類別表_1(type_table_1)

名稱     型別        約束條件   說明

type_id      int       無重複     類別標識,主鍵

type_name  char(50)    不允許為空   型別名稱,不允許重複

type_father   int         不允許為空   該類別的父類別標識,如果是頂節點的話設定為某個唯一值

這樣的設計短小精悍,完全滿足3nf,而且可以滿足使用者的所有要求。

我們來估計一下使用者希望如何羅列出這個表的資料的。對使用者而言,他當然期望按他所設定的層次關係一次羅列出所有的類別,例如這樣:

總類別類別1

類別1.1

類別1.1.1

類別1.2

類別2類別2.1

類別3類別3.1

類別3.2

……為了實現這樣的列表顯示(樹的先序遍歷),要對上面的表進行多少次檢索?注意,儘管類別1.1.1可能是在類別3.2之後新增的記錄,答案仍然是n次。這樣的效率對於少量的資料沒什麼影響,但是日後型別擴充到數十條甚至上百條記錄後,單單列一次型別就要檢索數十次該錶,整個程式的執行效率就不敢恭維了。只要對資料表進行一定的擴充,再對新增型別的數量進行一下約束就行了,要完成上面的列表只需一次檢索就行了。下面是擴充後的資料表結構:

類別表_2(type_table_2)

名稱     型別     約束條件                       說明

type_id      int       無重複                     類別標識,主鍵

type_name  char(50)    不允許為空                   型別名稱,不允許重複

type_father   int         不允許為空                   該類別的父類別標識,如果是頂節點的話設定為某個唯一值

type_layer    char(6)     限定3層,初始值為000000       類別的先序遍歷,主要為減少檢索資料庫的次數

按照這樣的表結構,我們來看看上面例子記錄在表中的資料是怎樣的:

type_id     type_name    type_father    type_layer

1             總類別             0                 000000

2             類別1               1                 010000

3             類別1.1           2                 010100

4             類別1.2             2                 010200

5             類別2               1                 020000

6             類別2.1           5                 020100

7             類別3               1                 030000

8             類別3.1           7                 030100

9             類別3.2           7                 030200

10           類別1.1.1        3                 010101

……現在按type_layer的大小來檢索一下:select * from type_table_2 order by type_layer

列出記錄集如下:

type_id      type_name    type_father    type_layer

1             總類別           0                 000000

2             類別1             1                 010000

3             類別1.1         2                 010100

10           類別1.1.1       3                 010101

4             類別1.2           2                 010200

5             類別2             1                 020000

6             類別2.1         5                 020100

7             類別3           1                 030000

8             類別3.1        7                 030100

9             類別3.2          7                 030200

……現在列出的記錄順序正好是先序遍歷的結果。在控制顯示類別的層次時,只要對type_layer欄位中的數值進行判斷,每2位一組,如大於0則向右移2個空格。當然,我這個例子中設定的限制條件是最多3層,每層最多可設99個子類別,只要按使用者的需求情況修改一下type_layer的長度和位數,即可更改限制層數和子類別數。其實,上面的設計不單單只在類別表中用到,網上某些可按樹型列表顯示的論壇程式大多採用類似的設計。

或許有人認為,type_table_2中的type_father欄位是冗餘資料,可以除去。如果這樣,在插入、刪除某個類別的時候,就得對type_layer 的內容進行比較繁瑣的判定,所以我並沒有消去type_father欄位,這也正符合資料庫設計中適當保留冗餘資料的來降低程式複雜度的原則,後面我會舉乙個故意增加資料冗餘的案例。

關係型資料庫 非關係型資料庫

關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...

關係型資料庫 非關係型資料庫

2019 02 25 20 38 36 關係型資料庫和非關係型資料的比較 一 關係型資料庫 關係型資料庫最典型的資料結構是表,由二維表及其之間的聯絡所組成的乙個資料組織 優點 1 易於維護 都是使用表結構,格式一致 2 使用方便 sql語言通用,可用於複雜查詢 3 複雜操作 支援sql,可用於乙個表...

Android資料庫與資料表的關係

1.比較資料庫和資料表的形象表示 資料庫 db 好比是excel中的工作簿,在乙個工作簿下,你可以建立不同的sheet,比如sheet1,sheet2.每個sheet就好比是資料表 table 在乙個android應用中,你可以根據型別的不同建立不同的資料庫,你又可以根據每個子型別的不同,建立不同的...