5 回答

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
給個(gè)思路。以空間換時(shí)間,就是冗余。
舉個(gè)例子,一下是分類
-
電器 cat_id = 1
- 電腦 cat_id = 2 pid = 1
-
手機(jī) cat_id = 3 pid = 1
- 蘋果手機(jī) cat_id =4 pid =3
那么 有個(gè) 商品 iphone 8 ,商品ID goods_id G1001
可以兩種方案都可以搞定。
第一做中間表
cat_id goods_id
1 G1001
3 G1001
4 G1001
這樣,如果你是到哪個(gè)分類下,都可以找到該商品
第二種做多級(jí)字段
catid_string 1,3,4
做查詢的時(shí)候 比如說(shuō)找電器 , 只要 where catid_string LIKE "1%"
找手機(jī) where catid_string LIKE "1,3%"
以上兩種方法都可以適合做查詢
但是第一種方法可以更好的做各種業(yè)務(wù)拓展,更有選擇的余地。

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊
閉包表,單獨(dú)用一個(gè)表來(lái)記錄全部的祖先關(guān)系。
CREATE TABLE `tree` (
`ancestor` int NOT NULL COMMENT '祖先ID(分類ID)',
`descendant` int NOT NULL COMMENT '后代ID',
`descendant_type` tinyint NOT NULL COMMENT '后代類型(0分類,1商品)',
PRIMARY KEY (`ancestor`, `descendant`, `descendant_type`)
);
要查某個(gè)分類的下的全部商品id:
select descendant from tree where ancestor = 10 and descendant_type = 1;
要查出商品信息就關(guān)聯(lián)查詢:
select p.* from products p
join tree t on p.id = t.descendant
where t.ancestor = 10 and t.descendant_type = 1
當(dāng)然,增刪分類和商品的時(shí)候要修改閉包表。
《SQL反模式》里總結(jié)的一個(gè)表:

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊
剛網(wǎng)上搜到一個(gè)比較不高大上的方法,但是我覺得可行,不知道還有沒有比這更好的方法,就是所有子分類用一個(gè)字段記錄他所有的父級(jí)id,有多少就記錄多少,查詢的時(shí)候用find_in_set,不過(guò)這個(gè)函數(shù)貌似很慢,繼續(xù)關(guān)注大神們的回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
我們一般設(shè)計(jì)都是需要有一個(gè)字段記錄他的上級(jí)id,如果是頂級(jí)就是0,然后遞歸查詢無(wú)限極分類

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果注重查詢效率的話可以考慮MPTT - Modified Preorder Tree Traversal
- 5 回答
- 0 關(guān)注
- 2376 瀏覽
添加回答
舉報(bào)