javaeye:關(guān)系型數(shù)據(jù)庫表設(shè)計(jì),如何保存樹狀結(jié)構(gòu)數(shù)據(jù)? 我有我見解。
Posted on 2006-07-08 10:35 oxl 閱讀(861) 評論(0) 編輯 收藏 所屬分類: 技術(shù)感語
鏈接:
http://forum.javaeye.com/viewtopic.php?t=15829
這是一個(gè)很有趣的東西,無限分類問題。
這里涉及到沉余數(shù)據(jù)的問題,如果不這樣做,我們沒法很快的對數(shù)據(jù)進(jìn)行搜索。
我的方法是,在表中加入layerpath,用特別的符號分隔id;加入parentlayer,用來標(biāo)記父節(jié)點(diǎn);加入level,用來表示這是第幾層(這個(gè)可以不要,實(shí)際應(yīng)用中幾乎沒用,反而加大了修改layer的難度)。
這樣做的優(yōu)點(diǎn)是把搜索的重任交給了數(shù)據(jù)庫,比如說查找某個(gè)節(jié)點(diǎn)下的所有子節(jié)點(diǎn),包括繼承子節(jié)點(diǎn),我們就可以用一刀切的方式取得,而不用遍歷樹的方法,比如我的layerpath的格式如下:
|1|3|7|8|
我要查找id為1的所有子節(jié)點(diǎn)及繼承子節(jié)點(diǎn):
SQL:select * from craft where layerpath like '%|1|%';
而修改一個(gè)節(jié)點(diǎn)的上下文關(guān)系時(shí),僅僅只要修改一個(gè)parentlayer就行,當(dāng)然,我們要在修改更新時(shí)檢查節(jié)點(diǎn)的繼承關(guān)系(這是最重要的)。
當(dāng)然,這樣的設(shè)計(jì)也會(huì)有缺點(diǎn),當(dāng)類別數(shù)據(jù)量太多時(shí),就會(huì)讓數(shù)據(jù)庫吃不消,就比如電信的電子黃頁,就有一千多個(gè)類別,至少四層,特別是在搜索時(shí),系統(tǒng)的很容易掛掉。解決方法唯有是用緩存。
這是一個(gè)很有趣的東西,無限分類問題。
這里涉及到沉余數(shù)據(jù)的問題,如果不這樣做,我們沒法很快的對數(shù)據(jù)進(jìn)行搜索。
我的方法是,在表中加入layerpath,用特別的符號分隔id;加入parentlayer,用來標(biāo)記父節(jié)點(diǎn);加入level,用來表示這是第幾層(這個(gè)可以不要,實(shí)際應(yīng)用中幾乎沒用,反而加大了修改layer的難度)。
這樣做的優(yōu)點(diǎn)是把搜索的重任交給了數(shù)據(jù)庫,比如說查找某個(gè)節(jié)點(diǎn)下的所有子節(jié)點(diǎn),包括繼承子節(jié)點(diǎn),我們就可以用一刀切的方式取得,而不用遍歷樹的方法,比如我的layerpath的格式如下:
|1|3|7|8|
我要查找id為1的所有子節(jié)點(diǎn)及繼承子節(jié)點(diǎn):
SQL:select * from craft where layerpath like '%|1|%';
而修改一個(gè)節(jié)點(diǎn)的上下文關(guān)系時(shí),僅僅只要修改一個(gè)parentlayer就行,當(dāng)然,我們要在修改更新時(shí)檢查節(jié)點(diǎn)的繼承關(guān)系(這是最重要的)。
當(dāng)然,這樣的設(shè)計(jì)也會(huì)有缺點(diǎn),當(dāng)類別數(shù)據(jù)量太多時(shí),就會(huì)讓數(shù)據(jù)庫吃不消,就比如電信的電子黃頁,就有一千多個(gè)類別,至少四層,特別是在搜索時(shí),系統(tǒng)的很容易掛掉。解決方法唯有是用緩存。