有一個表結構比如:
```
項目:
項目ID
項目名
分類ID
...
```
```
還有一個多級分類結構:
分類1
+ 分類1.1
++ 分類1.1.1
+++ 分類1.1.1.1
+++ 分類1.1.1.2
+ 分類1.2
分類2
...
```
假定我現在有分類1的序號,現在想通過這個序號取出對應分類1及其子項中的所有項目的列表,請問有沒有什么方便快捷的解決方案?最好能O(1)解決的。
目前想到的方法:
1、項目里新增一個字段(暫時稱為“分類路徑”),存儲一個線性數據,用來儲存分類的路徑,數據比如:分類1[分隔符]分類1.1[分隔符]分類1.1.1。做查詢的時候用LIKE從左開始匹配。
比如進到“分類1”的時候,搜索`分類路徑` = "分類1[分隔符]*"。
進到“分類1.1”的時候,搜索`分類路徑` = "分類1[分隔符]分類1.1[分隔符]*"。
但是LIKE這樣算不算濫用什么的?+ 如果遷移到一個沒有LIKE的數據庫不就歇菜了么。
2、新建一個數據表,類似于:
```
項目分類路徑們:
項目ID
隸屬于分類
```
然后當寫入項目的時候,爬出所選目標分類的路徑樹,比如
當一個項目被分配到“分類1.1.1.2”這個分類下,則依次寫入記錄:
```
項目ID:001
隸屬于分類:分類1.1.1.2
項目ID:001
隸屬于分類:分類1.1.1
項目ID:001
隸屬于分類:分類1.1
項目ID:001
隸屬于分類:分類1
```
相當于空間換時間了。但是這樣的話:
1、如果未來這個項目要變更分類記錄,就變得麻煩了,得刪掉之前所有的記錄,然后重新爬表(雖然可以優化掉一部分查詢);
2、得維護一張分類的全表樹形(或至少部分樹)結構的緩存來讓路徑計算變得更快一些、并借此降低用來獲得路徑的數據庫查詢次數,這很顯然增加了系統復雜度(因為需要處理比如緩存更新等等這樣的情況)。
好吧各位。所以我想的兩個方案都有缺點,你有啥辦法呢?請分享下見解。謝謝。