拉丁的傳說
2018-11-13 17:18:10
主菜單,就是那種后臺(tái)管理系統(tǒng)里面,通過配置可以控制是否顯示某菜單,或某菜單里的某個(gè)功能。關(guān)于它的設(shè)計(jì)和實(shí)現(xiàn)方式,我個(gè)人總結(jié)大概有以下幾種。(1)用數(shù)據(jù)庫(kù)表保存一般主菜單都是樹結(jié)構(gòu),基于用傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)來保存的方案,有2種。(1-1)用1個(gè)表的方案,則表里面包含1個(gè)id和parentid來關(guān)聯(lián)父子關(guān)系。(1-2)用2個(gè)表的方案,則1個(gè)表用來記錄菜單父子關(guān)系,另一個(gè)表純記錄菜單的信息。數(shù)據(jù)傳遞方案也有2種:(1-1-1)后端查詢出數(shù)據(jù),通過后臺(tái)代碼循環(huán)構(gòu)建,或者用sql事務(wù)構(gòu)建好樹結(jié)構(gòu),再傳遞給前端(1-1-2)后端查詢出數(shù)據(jù),傳給前端,讓前端自行構(gòu)建樹結(jié)構(gòu)(2)用json保存 這個(gè)是我這個(gè)問題主要想了解的方式,不知道你們是否有用過,則直接把主菜單的父子節(jié)點(diǎn)信息構(gòu)建成json格式,存到一個(gè)配置表里,或者一個(gè)json文件里。這樣可以免去構(gòu)造樹結(jié)構(gòu)的麻煩。但是由于是純json格式,人工維護(hù)的話,數(shù)據(jù)結(jié)構(gòu)不復(fù)雜的情況下還可以,如果遇到復(fù)雜的情況,可能需要編寫一個(gè)維護(hù)界面來維護(hù),這時(shí)候由于json并沒有類似sql的查詢語法,前端(假設(shè)是js)寫增刪查改起來會(huì)特別復(fù)雜(特別是刪除)。這個(gè)。。。。不知道你們平時(shí)用的是什么方式?可以的話希望可以簡(jiǎn)要的說說,同時(shí),如果對(duì)(2)用json保存這種方式有什么看法的話,也可以說說。綜合考慮性能,可擴(kuò)展性,可維護(hù)性等等。
1 回答

largeQ
TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
方案選型上面兩位已經(jīng)說了,這里說說數(shù)據(jù)庫(kù)表存儲(chǔ)樹結(jié)構(gòu)關(guān)系的具體實(shí)現(xiàn)。
同一張表存儲(chǔ)時(shí),僅存儲(chǔ)parent_id是不夠的??紤]一下以下的場(chǎng)景。
查詢某個(gè)節(jié)點(diǎn)的所有子孫節(jié)點(diǎn)。
查詢某個(gè)節(jié)點(diǎn)的路徑。
...
只有父id的情況下均需要遞歸查詢,查詢與構(gòu)建都非常麻煩。
一般在數(shù)據(jù)庫(kù)中存儲(chǔ)樹形結(jié)構(gòu)的數(shù)據(jù)是采用預(yù)排序遍歷樹算法,可以google一下相關(guān)的資料?;蛘咴趯蛹?jí)深度不夠深的情況下,可以參考如下的形式:樹狀結(jié)構(gòu)的數(shù)據(jù)表如何設(shè)計(jì)?
添加回答
舉報(bào)
0/150
提交
取消