数据库设计模式备忘
一)主擴(kuò)展模式
?
?
主擴(kuò)展模式,通常用來(lái)將幾個(gè)相似的對(duì)象的共有屬性抽取出來(lái),形成一個(gè)“公共屬性表”;其余屬性則分別形成“專有屬性表”,且“公共屬性表”與“專有屬性表”都是“一對(duì)一”的關(guān)系。
“專有屬性表”可以看作是對(duì)“公共屬性表”的擴(kuò)展,兩者合在一起就是對(duì)一個(gè)特定對(duì)象的完整描述,故此得名“主擴(kuò)展模式”。
舉例如下(注:這個(gè)例子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,僅僅是用來(lái)幫助大家理解“主擴(kuò)展模式”這個(gè)概念來(lái)使用的,請(qǐng)大家注意)。
假設(shè)某公司包括如下6種類型的工作人員:采購(gòu)員、營(yíng)銷員、庫(kù)房管理員、收銀員、財(cái)務(wù)人員和咨詢專家,采用主擴(kuò)展模式進(jìn)行設(shè)計(jì),如下圖所示。
無(wú)論哪種類型的工作人員,都要訪問(wèn)公司的辦公軟件,所以都有“登陸代碼”和“登錄密碼”;并且作為一般屬性,“姓名”、“性別”、“身份證號(hào)”、“入職時(shí)間”、“離職時(shí)間”等屬性,都與個(gè)人所從事的工作崗位無(wú)關(guān),所以可以抽取出來(lái)作為公共屬性,創(chuàng)建“公司員工”表。
很顯然,公司委派員工采購(gòu)哪些商品是“采購(gòu)員”的專有屬性,這是由公司的實(shí)際業(yè)務(wù)特點(diǎn)決定的。換句話說(shuō),公司不可能把采購(gòu)任務(wù)放到“營(yíng)銷員”身上,也不可能放到“庫(kù)房管理員”身上,“采購(gòu)商品”屬性就是“采購(gòu)員”的專用屬性。
“采購(gòu)員”表的主鍵與“公司員工”表的主鍵是相同的,包括字段名稱和字段的實(shí)際取值;“采購(gòu)員”表的主鍵同時(shí)是“公司員工”表主鍵的外鍵。在PDM圖里可以看到“采購(gòu)員”表中的“員工ID”字段后面有一個(gè)“<pk,fk>”標(biāo)記,這個(gè)標(biāo)記就說(shuō)明“員工ID”字段既是“采購(gòu)員”表的主鍵,同時(shí)也是該表的外鍵。
“公司員工”表是主表,“采購(gòu)員”表是擴(kuò)展表,二者是“一對(duì)一”的關(guān)系,兩個(gè)表的字段合起來(lái)就是對(duì)“采購(gòu)員”這個(gè)對(duì)象的完整說(shuō)明。同理,“公司員工”表和其他5個(gè)表之間也都分別構(gòu)成了“一對(duì)一”的關(guān)系。
對(duì)于主表來(lái)說(shuō),從表既可以沒(méi)有記錄,也可以有唯一一條記錄來(lái)對(duì)主表進(jìn)行擴(kuò)展說(shuō)明,這就是“主擴(kuò)展模式”。
?
二)主從模式
?
?
主從模式,是數(shù)據(jù)庫(kù)設(shè)計(jì)模式中最常見(jiàn)、也是大家日常設(shè)計(jì)工作中用的最多的一種模式,它描述了兩個(gè)表之間的主從關(guān)系,是典型的“一對(duì)多”關(guān)系。
舉例如下(注:這個(gè)例子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,僅僅是用來(lái)幫助大家理解“主從模式”這個(gè)概念來(lái)使用的,請(qǐng)大家注意)。
比如論壇程序。一個(gè)論壇通常都會(huì)有若干“板塊”,在每個(gè)板塊里面,大家可以發(fā)布很多的新帖。這時(shí)候“板塊”和“發(fā)帖”就是主從模式,主表是“板塊”,從表是“發(fā)帖”,二者是“一對(duì)多”的關(guān)系。
多個(gè)潛水員也可以對(duì)感興趣的同一份發(fā)帖進(jìn)行回復(fù),以表達(dá)各自的意見(jiàn),這時(shí)候,一個(gè)“發(fā)帖”就有了多份“回復(fù)”,又構(gòu)成了一個(gè)“主從模式”。
?
?
三)名值模式
通常用來(lái)描述在系統(tǒng)設(shè)計(jì)階段不能完全確定屬性的對(duì)象,這些對(duì)象的屬性在系統(tǒng)運(yùn)行時(shí)會(huì)有很大的變更,或者是多個(gè)對(duì)象之間的屬性存在很大的差異。
舉例如下(注:這個(gè)例子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,僅僅是用來(lái)幫助大家理解“名值模式”這個(gè)概念來(lái)使用的,請(qǐng)大家注意)。
1. 使用名值模式進(jìn)行設(shè)計(jì)時(shí),如果對(duì)“其他屬性”僅作瀏覽保存、不作其它任何特殊處理,則通常會(huì)設(shè)計(jì)一個(gè)“屬性模板”表,該表的數(shù)據(jù)記錄在系統(tǒng)運(yùn)行時(shí)動(dòng)態(tài)維護(hù)。
系統(tǒng)運(yùn)行時(shí),如需維護(hù)“產(chǎn)品其他屬性”,可先從“屬性模板”中選擇一個(gè)屬性名稱,然后填寫(xiě)“屬性值”保存,系統(tǒng)會(huì)將對(duì)應(yīng)的產(chǎn)品ID、屬性模板ID及剛剛填 寫(xiě)的“屬性值”一起保存在“產(chǎn)品其他屬性”里,這樣就完成了相關(guān)設(shè)置。無(wú)論產(chǎn)品的其他屬性需求發(fā)生怎樣的變化、怎樣增刪改屬性,都可以在運(yùn)行時(shí)實(shí)現(xiàn),而不必修改數(shù)據(jù)庫(kù)設(shè)計(jì)和程序代碼。
2. 使用名值模式進(jìn)行設(shè)計(jì)時(shí),如果對(duì)“其他屬性”有特殊處理,比如統(tǒng)計(jì)匯總,那么這個(gè)屬性名稱需要在程序代碼中作“硬編碼”,即該屬性名稱需要在程序代碼中有所體現(xiàn),此時(shí)可以在“產(chǎn)品其他屬性”表中直接記錄“屬性名稱”,不再需要“屬性模板”表。
系統(tǒng)運(yùn)行時(shí),如需維護(hù)“產(chǎn)品其他屬性”,程序直接列出“屬性名稱”,然后填寫(xiě)“屬性值”保存,系統(tǒng)會(huì)將對(duì)應(yīng)的產(chǎn)品ID、屬性名稱及剛剛填寫(xiě)的“屬性值”一起保存在“產(chǎn)品其他屬性”里,這樣就完成了相關(guān)設(shè)置。以后如果需求發(fā)生變更,則只需修改相應(yīng)的程序代碼即可,不必修改數(shù)據(jù)庫(kù)設(shè)計(jì)。
?
?
四)多對(duì)多模式
也是比較常見(jiàn)的一種數(shù)據(jù)庫(kù)設(shè)計(jì)模式,它所描述的兩個(gè)對(duì)象不分主次、地位對(duì)等、互為一對(duì)多的關(guān)系。對(duì)于A表來(lái)說(shuō),一條記錄對(duì)應(yīng)著B(niǎo)表的多條記錄,反過(guò)來(lái)對(duì)于B表來(lái)說(shuō),一條記錄也對(duì)應(yīng)著A表的多條記錄,這種情況就是“多對(duì)多模式”。
“多對(duì)多模式”需要在A表和B表之間有一個(gè)關(guān)聯(lián)表,這個(gè)關(guān)聯(lián)表也是“多對(duì)多模式”的核心所在。根據(jù)關(guān)聯(lián)表是否有獨(dú)立的業(yè)務(wù)處理需求,可將其劃分為兩種細(xì)分情況。
1. 關(guān)聯(lián)表有獨(dú)立的業(yè)務(wù)處理需求。
舉例如下(注:這個(gè)例子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,僅僅是用來(lái)幫助大家理解“多對(duì)多模式”這個(gè)概念來(lái)使用的,請(qǐng)大家注意)。
比如網(wǎng)上書(shū)店,通常都會(huì)有“書(shū)目信息”和“批發(fā)單”。一條“書(shū)目信息”面對(duì)不同的購(gòu)買(mǎi)客戶、可以存在多張“批發(fā)單”,反過(guò)來(lái),一張“批發(fā)單”也可以批發(fā)多條書(shū)目,這就是多對(duì)多模式。中間的“批發(fā)單明細(xì)”表就是兩者的關(guān)聯(lián)表,具備獨(dú)立的業(yè)務(wù)處理需求,是一個(gè)業(yè)務(wù)實(shí)體對(duì)象,因此它具備一些特有的屬性,比如針對(duì)每一條明細(xì)記錄而言的“累計(jì)退貨次數(shù)”、“累計(jì)退貨數(shù)量”、“累計(jì)結(jié)算次數(shù)”、“累計(jì)結(jié)算數(shù)量”;由于批發(fā)單明細(xì)在數(shù)據(jù)產(chǎn)生后已經(jīng)打印出紙質(zhì)清單提供給客戶,因此在“批發(fā)單明細(xì)”表里對(duì)紙質(zhì)清單中打印的書(shū)目信息屬性作了冗余(逆標(biāo)準(zhǔn)化),這樣在將來(lái)即使修改了“書(shū)目信息”表中的屬性,也不會(huì)影響跟客戶核對(duì)批發(fā)單明細(xì),不會(huì)影響未來(lái)的財(cái)務(wù)結(jié)算業(yè)務(wù)。
2. 關(guān)聯(lián)表沒(méi)有獨(dú)立的業(yè)務(wù)處理需求
舉例如下(注:這個(gè)例子已經(jīng)作了相當(dāng)程度的簡(jiǎn)化,僅僅是用來(lái)幫助大家理解“多對(duì)多模式”這個(gè)概念來(lái)使用的,請(qǐng)大家注意)。
比如用戶與角色之間的關(guān)系,一般系統(tǒng)在做權(quán)限控制方面的程序時(shí)都會(huì)涉及到“系統(tǒng)用戶表”和“系統(tǒng)角色表”。一個(gè)用戶可以從屬于多個(gè)角色,反過(guò)來(lái)一個(gè)角色里面也可以包含多個(gè)用戶,兩者也是典型的“多對(duì)多關(guān)系”。其中的關(guān)聯(lián)表“用戶角色關(guān)聯(lián)表”在絕大多數(shù)情況下都是僅僅用作表示用戶與角色之間的關(guān)聯(lián)關(guān)系,本身不具備獨(dú)立的業(yè)務(wù)處理需求,所以也就沒(méi)有什么特殊的屬性。
?
五)使用上述四種模式的一般原則
1. 什么時(shí)候用“主擴(kuò)展模式”?
對(duì)象的個(gè)數(shù)不多;各個(gè)對(duì)象之間的屬性有一定差別;各個(gè)對(duì)象的屬性在數(shù)據(jù)庫(kù)設(shè)計(jì)階段能夠完全確定;各個(gè)擴(kuò)展對(duì)象有獨(dú)立的、相對(duì)比較復(fù)雜的業(yè)務(wù)處理需求,此時(shí)用“主擴(kuò)展模式”。將各個(gè)對(duì)象的共有屬性抽取出來(lái)設(shè)計(jì)為“主表”,將各個(gè)對(duì)象的剩余屬性分別設(shè)計(jì)為相應(yīng)的“擴(kuò)展表”,“主表”與各個(gè)“擴(kuò)展表”分別建立一對(duì)一的關(guān)系。
2. 什么時(shí)候用“主從模式”?
對(duì)象的個(gè)數(shù)較多且不固定;各個(gè)對(duì)象之間的屬性幾乎沒(méi)有差異;對(duì)象的屬性在數(shù)據(jù)庫(kù)設(shè)計(jì)階段能夠完全確定;各個(gè)對(duì)象沒(méi)有獨(dú)立的業(yè)務(wù)處理需求,此時(shí)用“主從模式”。將各個(gè)對(duì)象設(shè)計(jì)為“從表”的記錄,與“主表”對(duì)象建立一對(duì)多的關(guān)系。
3. 什么時(shí)候用“名值模式”?
對(duì)象的個(gè)數(shù)極多;各個(gè)對(duì)象之間的屬性有較大差異;對(duì)象屬性在數(shù)據(jù)庫(kù)設(shè)計(jì)階段不能確定,或者在系統(tǒng)運(yùn)行時(shí)有較大變更;各個(gè)對(duì)象沒(méi)有相互獨(dú)立的業(yè)務(wù)處理需求,此時(shí)用“名值模式”。
4. 什么時(shí)候用“多對(duì)多模式”?
兩個(gè)對(duì)象之間互為一對(duì)多關(guān)系,則使用“多對(duì)多模式”。
?
?
除了上面提到的四種主要設(shè)計(jì)模式,還有一些其他模式,在某些項(xiàng)目中可能會(huì)用到,在這里先簡(jiǎn)單做個(gè)說(shuō)明,暫不做深入討論,等到以后的項(xiàng)目用到這些模式的時(shí)候,再結(jié)合實(shí)際需求詳細(xì)解說(shuō)。
六)繼承模式
繼承模式,可以看作是“主從模式”的一種特殊情況(或者說(shuō)是“變形”),它所代表的兩個(gè)對(duì)象也是“一對(duì)多”的關(guān)系。它與“主從模式”的區(qū)別是,“繼承模式”中從表的主鍵是復(fù)合主鍵,并且復(fù)合主鍵中必定包含主表的主鍵列。
根據(jù)從表繼承主表的列的數(shù)量,繼承模式又分以下兩種情況:
1. 從表繼承主表的全部列
在這種情況下,從表除了代表自身的專用字段以外,還冗余了主表的全部字段。這種設(shè)計(jì)方式的缺點(diǎn)顯而易見(jiàn):
-
數(shù)據(jù)冗余度大
-
一致性差
-
磁盤(pán)存儲(chǔ)量大
它的優(yōu)點(diǎn)也顯而易見(jiàn):
-
正因?yàn)樗娜哂喽却蟆⑺运灰讈G失數(shù)據(jù)。假設(shè)主表數(shù)據(jù)丟失、或者被誤操作刪改,也能依據(jù)從表數(shù)據(jù)重新生成主表數(shù)據(jù);這種設(shè)計(jì)方式,可以在發(fā)生數(shù)據(jù)損壞的時(shí)候從應(yīng)用的角度進(jìn)行一定程度的數(shù)據(jù)恢復(fù),等于是在SQL Server數(shù)據(jù)庫(kù)級(jí)別的數(shù)據(jù)恢復(fù)功能之上又加了一道保險(xiǎn)。
-
正因?yàn)樗恢滦圆睢⒅鞅頂?shù)據(jù)被重復(fù)存儲(chǔ),所以可依據(jù)外鍵關(guān)系進(jìn)行數(shù)據(jù)驗(yàn)證。將主從表記錄作關(guān)聯(lián)比較,如果數(shù)據(jù)不一致,就可以得知數(shù)據(jù)要么被人為改動(dòng),或者要么程序代碼中存在bug。
-
盡管磁盤(pán)存儲(chǔ)量大,但是數(shù)據(jù)在查詢統(tǒng)計(jì)的時(shí)候,只需針對(duì)從表進(jìn)行搜索即可,無(wú)需關(guān)聯(lián)操作,可以加快檢索的速度。這就是數(shù)據(jù)庫(kù)模型設(shè)計(jì)中經(jīng)常提到的“以空間換時(shí)間”。
2. 從表只繼承主表的主鍵列
這種設(shè)計(jì)方式,從表只繼承了主表的主鍵列,這種方式的優(yōu)缺點(diǎn)與前面剛好相反。
優(yōu)點(diǎn):
-
數(shù)據(jù)冗余度小
-
一致性高
-
磁盤(pán)存儲(chǔ)量小
缺點(diǎn):
-
正因?yàn)樗娜哂喽刃 ⑺运讈G失數(shù)據(jù)。假設(shè)主表數(shù)據(jù)丟失、或者被誤操作刪改,就只能通過(guò)SQL Server數(shù)據(jù)庫(kù)級(jí)別的數(shù)據(jù)恢復(fù)操作來(lái)找回丟失的數(shù)據(jù)了。
-
正因?yàn)樗恢滦愿?#xff0c;所以無(wú)法進(jìn)行應(yīng)用程序級(jí)的數(shù)據(jù)驗(yàn)證。
-
由于采用了一致性設(shè)計(jì),磁盤(pán)存儲(chǔ)量較小,但是數(shù)據(jù)在查詢統(tǒng)計(jì)的時(shí)候,必須要對(duì)兩個(gè)表進(jìn)行內(nèi)連接(INNER JOIN)操作,才能搜索到相關(guān)數(shù)據(jù)。而內(nèi)連接操作時(shí)需要耗費(fèi)一定的時(shí)間的。這就是數(shù)據(jù)庫(kù)模型設(shè)計(jì)中經(jīng)常提到的“以時(shí)間換空間”。
當(dāng)然,在實(shí)際的數(shù)據(jù)庫(kù)模型設(shè)計(jì)過(guò)程中,還會(huì)有介于上述兩者之間的第3種情況出現(xiàn),那就是從表繼承了主表的主鍵列以及部分其他列。這就要求我們?cè)O(shè)計(jì)人員要依據(jù)實(shí)際的業(yè)務(wù)需求進(jìn)行綜合分析、權(quán)衡、折中,給出最符合業(yè)務(wù)需求的設(shè)計(jì)結(jié)果。
?
?
七)自聯(lián)結(jié)模式
自聯(lián)結(jié)模式,也可以看作是“主從模式”的一種特殊情況(或者說(shuō)是“變形”),它在一張表內(nèi)實(shí)現(xiàn)了“一對(duì)多關(guān)系”,并且可以根據(jù)業(yè)務(wù)需要實(shí)現(xiàn)“有限層”或者“無(wú)限層”的主從嵌套。
這種模式用得最多的情況就是實(shí)現(xiàn)“樹(shù)形結(jié)構(gòu)”數(shù)據(jù)的存儲(chǔ),比如各大網(wǎng)站上常見(jiàn)的細(xì)分類別、應(yīng)用系統(tǒng)的組織結(jié)構(gòu)、Web系統(tǒng)的菜單樹(shù)等都能用到這種模式。
自聯(lián)結(jié)模式有很多變體,且每種變體的優(yōu)缺點(diǎn)同樣鮮明。由于本連載的重點(diǎn)在于對(duì)跨行業(yè)通用數(shù)據(jù)庫(kù)模型設(shè)計(jì)進(jìn)行分析,所以對(duì)每種具體模式的細(xì)節(jié)方面的設(shè)計(jì)技巧不能作詳細(xì)論述,請(qǐng)大家原諒。這里僅舉兩個(gè)例子說(shuō)明:
1. ?簡(jiǎn)單自聯(lián)結(jié)
簡(jiǎn)單自聯(lián)結(jié),就是在一個(gè)表里設(shè)置當(dāng)前類ID、父類ID,同時(shí)規(guī)定最頂層類的父類ID為一個(gè)固定值(比如0),在生成樹(shù)的時(shí)候使用遞歸算法,記錄的前后順序通過(guò)“排序號(hào)”字段來(lái)確定。
這個(gè)表用來(lái)存儲(chǔ)菜單樹(shù)很方便。首先會(huì)有一個(gè)主菜單,主菜單下有子菜單,子菜單下面又有孫菜單……菜單的數(shù)量不確定、層級(jí)不確定,用戶可以在任意菜單下增加新的子菜單,或者刪除某個(gè)子菜單及其下的所有孫菜單……這種設(shè)計(jì)方式很多人都會(huì)用到,短小精悍、維護(hù)方便、且完全滿足用戶需求,而且樹(shù)的層次不限,擴(kuò)展起來(lái)非常容易。這些都是它的優(yōu)點(diǎn)。
它的缺點(diǎn)就是樹(shù)結(jié)構(gòu)的生成由于使用了遞歸算法,必然要對(duì)該表進(jìn)行多次讀取(讀取的次數(shù) = 表內(nèi)的記錄數(shù) – 最深層級(jí)的記錄數(shù)),多次讀取就來(lái)了比較低的運(yùn)行效率,當(dāng)表里的記錄很多的時(shí)候,這個(gè)缺點(diǎn)可以稱得上是致命的。
于是就有了下面的這種設(shè)計(jì)模式。
2. ?擴(kuò)展自聯(lián)結(jié)
擴(kuò)展自聯(lián)結(jié),與簡(jiǎn)單自聯(lián)結(jié)的最大區(qū)別就是通過(guò)附加冗余字段來(lái)避免遞歸運(yùn)算,所要實(shí)現(xiàn)的主要目標(biāo)就是一次讀取就能生成整個(gè)樹(shù),一次提高樹(shù)的生成效率。
但是,魚(yú)與熊掌不可兼得,凡事都有兩面性。
生成樹(shù)的效率提高了,增刪改表內(nèi)記錄的算法就會(huì)相應(yīng)復(fù)雜,并且樹(shù)的層數(shù)也變?yōu)橛邢薜牧恕?/p>
所以在此類設(shè)計(jì)的時(shí)候,大家還是要認(rèn)真分析業(yè)務(wù)需求,看看實(shí)際業(yè)務(wù)的重點(diǎn)在什么地方,然后再作具體設(shè)計(jì)。比如一些門(mén)戶網(wǎng)站在首頁(yè)顯示產(chǎn)品類別是業(yè)務(wù)重點(diǎn),那么我們?cè)谠O(shè)計(jì)的時(shí)候就要盡可能的提高生成樹(shù)的效率,采取擴(kuò)展自聯(lián)結(jié)模式;相反,一些基于Web的業(yè)務(wù)系統(tǒng),要求對(duì)菜單樹(shù)的增刪改維護(hù)操作盡量簡(jiǎn)單,由于菜單的數(shù)目不多,所以菜單樹(shù)的生成效率不是瓶頸,那么我們?cè)O(shè)計(jì)的時(shí)候就可以采取簡(jiǎn)單自聯(lián)結(jié)模式。
關(guān)于附加冗余字段實(shí)現(xiàn)擴(kuò)展自聯(lián)結(jié)的方法很多,網(wǎng)上也有很多這方面的帖子,大家可以到Google上搜一下。
在這里僅舉一個(gè)例子如下:
這個(gè)設(shè)計(jì)與前面的設(shè)計(jì)最大的區(qū)別就是排序字段,前面的簡(jiǎn)單自聯(lián)結(jié)用了一個(gè)整數(shù)型的字段來(lái)實(shí)現(xiàn)排序,這里用了一個(gè)Varchar20型的字段“層級(jí)代碼”來(lái)實(shí)現(xiàn)大排序。這個(gè)字段的取值兩位一組,代表一層,假定最深為5層,初始值為0000000000。
按照這樣的設(shè)計(jì),表內(nèi)的數(shù)據(jù)記錄可能就是這樣的:
ID ? ? ? ? ? ?TypeName ? ? ? ? ? ParentID ? ? ? ? ? ?TypeLevel
1 ? ? ? ? ? ? 根類別 ? ? ? ? ? ? ??0 ? ? ? ? ? ? ? ??000000
2 ? ? ? ? ? ? 類別1 ? ? ? ? ? ? ??1 ? ? ? ? ? ? ? ??010000
3 ? ? ? ? ? ? 類別1.1 ? ? ? ? ? ? ??2 ? ? ? ? ? ? ? ??010100
4 ? ? ? ? ? ? 類別1.2 ? ? ? ? ? ??2 ? ? ? ? ? ? ? ??010200
5 ? ? ? ? ? ? 類別2 ? ? ? ? ? ? ??1 ? ? ? ? ? ? ? ??020000
6 ? ? ? ? ? ? 類別2.1 ? ? ? ? ? ??5 ? ? ? ? ? ? ? ??020100
7 ? ? ? ? ? ? 類別3 ? ? ? ? ? ? ??1 ? ? ? ? ? ? ? ??030000
8 ? ? ? ? ? ? 類別3.1 ? ? ? ? ? ??7 ? ? ? ? ? ? ? ??030100
9 ? ? ? ? ? ? 類別3.2 ? ? ? ? ? ??7 ? ? ? ? ? ? ? ??030200
10 ? ? ? ? ? ?類別1.1.1 ? ? ? ? ??3 ? ? ? ? ? ? ? ??010101
……
現(xiàn)在按TypeLevel字段進(jìn)行排序,執(zhí)行如下SQL語(yǔ)句:SELECT * FROM TMP_Type ORDER BY TypeLevel
列出記錄集如下:
ID ? ? ? ? ? ?TypeName ? ? ? ? ? ?ParentID ? ? ? ? ? ? TypeLevel
1 ? ? ? ? ? ? 總類別 ? ? ? ? ? ? ??0 ? ? ? ? ? ? ? ? 000000
2 ? ? ? ? ? ? 類別1 ? ? ? ? ? ? ??1 ? ? ? ? ? ? ? ? 010000
3 ? ? ? ? ? ? 類別1.1 ? ? ? ? ? ??2 ? ? ? ? ? ? ? ? 010100
10 ? ? ? ? ? ?類別1.1.1 ? ? ? ? ??3 ? ? ? ? ? ? ? ? 010101
4 ? ? ? ? ? ? 類別1.2 ? ? ? ? ? ??2 ? ? ? ? ? ? ? ? 010200
5 ? ? ? ? ? ? 類別2 ? ? ? ? ? ? ??1 ? ? ? ? ? ? ? ? 020000
6 ? ? ? ? ? ? 類別2.1 ? ? ? ? ? ??5 ? ? ? ? ? ? ? ? 020100
7 ? ? ? ? ? ? 類別3 ? ? ? ? ? ? ??1 ? ? ? ? ? ? ? ? 030000
8 ? ? ? ? ? ? 類別3.1 ? ? ? ? ? ??7 ? ? ? ? ? ? ? ? 030100
9 ? ? ? ? ? ? ?類別3.2 ? ? ? ? ? ??7 ? ? ? ? ? ? ? ? 030200
……
在控制顯示類別的層次時(shí),只要對(duì)“層級(jí)代碼”字段中的數(shù)值進(jìn)行判斷,每2位一組,如大于0則向右移2個(gè)空格。
轉(zhuǎn)載于:https://www.cnblogs.com/echosong/p/3640104.html
總結(jié)
- 上一篇: 关于async与await的FAQ 转
- 下一篇: Domino下邮箱用户数据库限额自助释放