基于 pureXML 技術(shù)的數(shù)據(jù)庫(kù)表結(jié)構(gòu)擴(kuò)展
基于 pureXML 技術(shù)的數(shù)據(jù)庫(kù)表結(jié)構(gòu)擴(kuò)展
信息系統(tǒng)交付使用之初,數(shù)據(jù)庫(kù)表結(jié)構(gòu)的設(shè)計(jì)往往邏輯結(jié)構(gòu)清晰,管理使用方便,但是當(dāng)信息系統(tǒng)項(xiàng)目運(yùn)行一段時(shí)間,隨著業(yè)務(wù)的不斷變化和增加,處理流程不斷的變革,信息系統(tǒng)需要從前臺(tái)界面到后臺(tái)數(shù)據(jù)庫(kù)的完善和修改,勢(shì)必要對(duì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)必須要進(jìn)行擴(kuò)展。我們通常的數(shù)據(jù)庫(kù)擴(kuò)展往往采用增加備用字段、擴(kuò)展字段的內(nèi)涵、增加主從表和管理表的方式,這種數(shù)據(jù)庫(kù)表結(jié)構(gòu)的擴(kuò)展往往會(huì)帶來(lái)營(yíng)運(yùn)的中斷和操作的風(fēng)險(xiǎn),本文通過(guò)分析常見(jiàn)的數(shù)據(jù)庫(kù)庫(kù)表結(jié)構(gòu)的擴(kuò)展方法中的不足,提出了幾種基于 pureXML 方式的數(shù)據(jù)庫(kù)表結(jié)構(gòu)的擴(kuò)展模式,可以成功的結(jié)束數(shù)據(jù)庫(kù)擴(kuò)展的技術(shù)難題。
概述
信息系統(tǒng)的建設(shè)往往遵循業(yè)務(wù)調(diào)研、需求分析、再進(jìn)入到數(shù)據(jù)庫(kù)和軟件的概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、代碼編寫(xiě)等等階段,在這個(gè)過(guò)程中數(shù)據(jù)庫(kù)設(shè)計(jì)者往往根據(jù)已有的業(yè)務(wù)調(diào)研、需求分析的成果進(jìn)行數(shù)據(jù)庫(kù)表結(jié)構(gòu)的設(shè)計(jì),這時(shí)的數(shù)據(jù)庫(kù)的設(shè)計(jì)者是通盤(pán)考慮,全局謀劃所設(shè)計(jì)的數(shù)據(jù)庫(kù)結(jié)構(gòu),整個(gè)庫(kù)表結(jié)構(gòu)邏輯清晰,管理方便并且符合 3NF 的要求。信息系統(tǒng)項(xiàng)目運(yùn)行一段時(shí)間,隨著業(yè)務(wù)的不斷變化和增加,處理流程不斷的變革,這種業(yè)務(wù)需求的驅(qū)動(dòng)下,我們的軟件體系也需要不斷的修改和完善,這種修改和完善不僅是界面的調(diào)整和模塊的增加,而且必須對(duì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)進(jìn)行必要的調(diào)整和修改。
這種項(xiàng)目維護(hù)期間的數(shù)據(jù)庫(kù)調(diào)整和擴(kuò)展,必須對(duì)數(shù)據(jù)庫(kù)設(shè)計(jì)文檔進(jìn)行修改,對(duì)數(shù)據(jù)字典進(jìn)行調(diào)整,理想的情況是文檔齊備、資料完整,但實(shí)際工作中,由于設(shè)計(jì)和開(kāi)發(fā)人員的責(zé)任心和對(duì)文檔的輕視,每次對(duì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)的調(diào)整都會(huì)造成數(shù)據(jù)庫(kù)庫(kù)表結(jié)構(gòu)混亂,為今后的工作帶來(lái)系統(tǒng)管理、維護(hù)和軟件的再次修改和調(diào)整帶來(lái)隱患;其次,數(shù)據(jù)庫(kù)的擴(kuò)展和調(diào)整中,對(duì)數(shù)據(jù)庫(kù)設(shè)計(jì)者要求很高,很容易導(dǎo)致數(shù)據(jù)庫(kù)設(shè)計(jì)中范式設(shè)計(jì)的隱患,進(jìn)而造成數(shù)據(jù)庫(kù)性能的急劇下降;最值得注意的是,由于數(shù)據(jù)庫(kù)存儲(chǔ)有大量的業(yè)務(wù)數(shù)據(jù)庫(kù),每次對(duì)數(shù)據(jù)庫(kù)字段的修改和調(diào)整必須停機(jī)操作,從而帶來(lái)運(yùn)營(yíng)的中斷和操作的風(fēng)險(xiǎn)。特別是對(duì)于上線運(yùn)行的核心業(yè)務(wù)系統(tǒng),和若干 7×24 小時(shí)的業(yè)務(wù)系統(tǒng),每次的數(shù)據(jù)庫(kù)停機(jī)操作對(duì)營(yíng)運(yùn)的影響非常的巨大,而且還可能引來(lái)不良的社會(huì)影響。
為了對(duì)數(shù)據(jù)庫(kù)進(jìn)行有效的擴(kuò)展,實(shí)際工作中往往采用預(yù)留備用字段、字段內(nèi)涵擴(kuò)展、增加從表擴(kuò)展和增加關(guān)聯(lián)表的方式進(jìn)行擴(kuò)展,這種擴(kuò)展往往存在若干的問(wèn)題:
設(shè)計(jì)之初預(yù)留備用字段帶來(lái)的不足
為了減少對(duì)今后對(duì)數(shù)據(jù)庫(kù)表中的字段調(diào)整,某些設(shè)計(jì)者在設(shè)計(jì)之初,根據(jù)經(jīng)驗(yàn)對(duì)若干可能擴(kuò)展的表中預(yù)留部分備用字段。預(yù)留備用字段的方式在某些程度上可以增加擴(kuò)展的靈活性,但是確存在如下隱患:
預(yù)留字段的數(shù)量無(wú)法預(yù)測(cè) , 預(yù)留 N 個(gè)還是預(yù)留 N+1,由于無(wú)法預(yù)知需要預(yù)留的數(shù)量造成擴(kuò)展的不確定性;
預(yù)留字段的類(lèi)型無(wú)法預(yù)測(cè),預(yù)留字符型還是數(shù)值,無(wú)法去預(yù)測(cè)和評(píng)估;
常見(jiàn)在預(yù)留的擴(kuò)展字段中,這些預(yù)留的擴(kuò)展字段往往會(huì)破壞數(shù)據(jù)庫(kù)最基本的范式要求,數(shù)據(jù)庫(kù)的范式的最基本要求是原子性和性,而擴(kuò)展的字段本身的定義是不明確的,這是不未確定的,也是非原子的和非的。
表結(jié)構(gòu)的字段數(shù)據(jù)量不擴(kuò)展,擴(kuò)展若干字段的內(nèi)涵
數(shù)據(jù)庫(kù)的調(diào)整會(huì)帶來(lái)運(yùn)營(yíng)的風(fēng)險(xiǎn),部分?jǐn)?shù)據(jù)庫(kù)設(shè)計(jì)者為了應(yīng)付數(shù)據(jù)庫(kù)存儲(chǔ)的需要,不對(duì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)的字段的數(shù)量進(jìn)行增加,而是非!奥斆鳌钡膶⒛硞(gè)字段的內(nèi)涵進(jìn)行擴(kuò)展,使得某些字段中同時(shí)存入 2+ 以上含義,由程序分析存入該字段的值的屬性和內(nèi)容。例如:某字段原定義為 VARCHAR(4),如果存儲(chǔ)字母開(kāi)頭的值,如 A001 表示意思 XX;存儲(chǔ)數(shù)值開(kāi)頭的值,如 1000 表示意思 YY;還有一種方式是采用間隔符,對(duì)字段進(jìn)行擴(kuò)展,例如 A001+1000 等形式。我們的數(shù)據(jù)庫(kù)設(shè)計(jì)中,數(shù)據(jù)庫(kù)表中的每一個(gè)字段都是單一屬性,是不可再分的、原子性的,這個(gè)是數(shù)據(jù)庫(kù)設(shè)計(jì)的范式理論,任何的數(shù)據(jù)庫(kù)設(shè)計(jì)都應(yīng)該遵守范式。這種設(shè)計(jì)不僅違反的數(shù)據(jù)庫(kù)設(shè)計(jì)的范式理論,而且造成讀取數(shù)據(jù)時(shí)需要程序進(jìn)行“解碼”后才能進(jìn)行查詢(xún)、統(tǒng)計(jì)等等,使得數(shù)據(jù)庫(kù)的整體性能大大降低。
增加從表,但又不能確定從表的數(shù)量
當(dāng)對(duì)庫(kù)表進(jìn)行擴(kuò)展時(shí),往往遇到存在 1:N 的情況時(shí),這時(shí)必須增加從表來(lái)應(yīng)對(duì)數(shù)據(jù)庫(kù)的擴(kuò)展,但是由于每次增加數(shù)據(jù)庫(kù)從表時(shí),無(wú)法預(yù)測(cè)需要增加多少個(gè)從表,每次增加從表都會(huì)造成數(shù)據(jù)庫(kù)的修改和調(diào)整。
增加關(guān)聯(lián),但關(guān)聯(lián)表的字段無(wú)法預(yù)測(cè)
由于業(yè)務(wù)邏輯的改變,如果發(fā)現(xiàn)原表 T1,T2 存在 N:M 的關(guān)系時(shí),必須增加關(guān)聯(lián)表,但是關(guān)聯(lián)表的字段數(shù)量又無(wú)法預(yù)測(cè) , 每次對(duì)關(guān)聯(lián)表的調(diào)整又會(huì)造成對(duì)數(shù)據(jù)庫(kù)的影響。
通過(guò)對(duì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)中經(jīng)常采用表和字段擴(kuò)展的方式進(jìn)行分析,我們都會(huì)發(fā)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的修改,往往會(huì)造成諸多的不便,而且值得注意的是每次修改數(shù)據(jù)庫(kù)往往是業(yè)務(wù)需要非常緊迫,考慮到之前確保之前程序的穩(wěn)定性和可靠性,此時(shí)又不能對(duì)原有的數(shù)據(jù)庫(kù)進(jìn)行調(diào)整和重組,DBA 往往只能進(jìn)行部分?jǐn)?shù)據(jù)庫(kù)表結(jié)構(gòu)的字段,往往最終導(dǎo)致數(shù)據(jù)庫(kù)表結(jié)構(gòu)混亂,以及管理維護(hù)的失控。