存儲(chǔ)一棵樹要考慮節(jié)點(diǎn)插入、刪除、聚合和將一棵樹加載到內(nèi)存。
插入:將節(jié)點(diǎn)加入到樹上;
刪除:將節(jié)點(diǎn)從樹上摘除;
聚合:將某個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)(不遞歸子節(jié)點(diǎn))查找放在一起;
加載樹:相當(dāng)于從根節(jié)點(diǎn)聚合。
方法一
這種方式如果辦公家具 -> 文具盒 -> 鉛筆,如果從辦公家具查找鉛筆,那么將需要遞歸
以節(jié)點(diǎn)為主鍵,其父節(jié)點(diǎn)為某一列值。create table tree(node, value, parentNode);
插入:insert into tree(node, value, parentNode);
刪除:刪除要做聚合操作后,才能delete from tree where node = xxx;(因?yàn)橐獎(jiǎng)h除這個(gè)節(jié)點(diǎn)下所有的子節(jié)點(diǎn))
聚合:如果要聚合某個(gè)節(jié)點(diǎn)A的所有子節(jié)點(diǎn),必須先查找出所有父節(jié)點(diǎn)為A的子節(jié)點(diǎn)
方法二
以節(jié)點(diǎn)為主鍵,其路徑列表為某一列值。(存在字段長(zhǎng)度問(wèn)題和不符合范式)
方法三
在路徑列表的設(shè)計(jì)中,關(guān)鍵字段的本質(zhì)是存儲(chǔ)了兩種信息,一是所有上級(jí)分類的id,而是從頂級(jí)分類到每個(gè)復(fù)分類的距離;所以另增加一張表,含有三個(gè)字段(一個(gè)是所有上級(jí)分類的id,二是本分類的id,三是從頂級(jí)分類到每個(gè)父分類的距離).這樣這張表就能起到與path字段相同的作用,而且還不違反數(shù)據(jù)庫(kù)范式,最關(guān)鍵的是它不存在字段長(zhǎng)度的限制。這種方案也叫ClosureTable。
聯(lián)系客服