程序設(shè)計(jì)過程中,我們常常用樹形結(jié)構(gòu)來表征某些數(shù)據(jù)的關(guān)聯(lián)關(guān)系,如企業(yè)上下級(jí)部門、欄目結(jié)構(gòu)、商品分類等等,通常而言,這些樹狀結(jié)構(gòu)需要借助于數(shù)據(jù)庫完成持久化。理想中樹形結(jié)構(gòu)應(yīng)該具備如下特征:數(shù)據(jù)存儲(chǔ)冗余度小、直觀性強(qiáng);檢索遍歷過程簡單高效;節(jié)點(diǎn)增刪改查CRUD操作高效。
列舉了一個(gè)食品族譜的例子進(jìn)行講解,通過類別、顏色和品種組織食品,樹形結(jié)構(gòu)圖如下:
1,對(duì)樹形結(jié)構(gòu)最直觀的分析莫過于節(jié)點(diǎn)之間的繼承關(guān)系上,通過顯示地描述某一節(jié)點(diǎn)的父節(jié)點(diǎn),從而能夠建立二維的關(guān)系表,則這種方案的Tree表結(jié)構(gòu)通常設(shè)計(jì)為:{Node_id,Parent_id}
2,在基于數(shù)據(jù)庫的一般應(yīng)用中,查詢的需求總要大于刪除和修改。為了避免對(duì)于樹形結(jié)構(gòu)查詢時(shí)的“遞歸”過程,基于Tree的前序遍歷設(shè)計(jì)一種全新的無遞歸查詢、無限分組的左右值編碼方案,來保存該樹的數(shù)據(jù)。
至于上述兩種方法的具體介紹和實(shí)現(xiàn)以及優(yōu)缺參考:樹形結(jié)構(gòu)的數(shù)據(jù)庫表Schema設(shè)計(jì)。
其實(shí)我們最重要的數(shù)據(jù)是這個(gè)樣子的:
{Catagory:"Food",FoodCategory:"Fruit",color:"Red",Name:"Cherry"}
{Catagory:"Food",FoodCategory:"Fruit",color:"Yellow",Name:"Banana"}
{Catagory:"Food",FoodCategory:"Meat",Name:"Beef"}
{Catagory:"Food",FoodCategory:"Meat",Name:"Pork"}
其實(shí)我覺得這種關(guān)系型數(shù)據(jù)庫可以用MongoDb來存儲(chǔ)(Json的數(shù)據(jù)格式),這樣用非關(guān)系數(shù)據(jù)庫的思想解決這個(gè)問題豈不是更好?這種可以不通過遞歸過程不斷地訪問數(shù)據(jù)庫,每次數(shù)據(jù)庫IO都會(huì)有時(shí)間開銷;也避免了第二種節(jié)點(diǎn)的添加、刪除及修改代價(jià)較大,將會(huì)涉及到表中多方面數(shù)據(jù)的改動(dòng)。是不是萌萌噠?一家之言,歡迎拍磚!