精選了其中的 60 個(gè)技巧,并把這些技巧編寫(xiě)成了本文,為了方便索引其內(nèi)容劃分為 5 個(gè)部分:
上一部分介紹了設(shè)計(jì)數(shù)據(jù)庫(kù)之前12個(gè)基本技巧,包括命名規(guī)范和明確業(yè)務(wù)需求等( 數(shù)據(jù)庫(kù)設(shè)計(jì)經(jīng)驗(yàn)談[1])。本次第二部分介紹設(shè)計(jì)數(shù)據(jù)庫(kù)表24個(gè)指南性技巧,涵蓋表內(nèi)字段設(shè)計(jì)以及應(yīng)該避免的常見(jiàn)問(wèn)題等。
第 2 部分 - 設(shè)計(jì)表和字段
檢查各種變化
我在設(shè)計(jì)數(shù)據(jù)庫(kù)的時(shí)候會(huì)考慮到哪些數(shù)據(jù)字段將來(lái)可能會(huì)發(fā)生變更。比方說(shuō),姓氏就是如此(注意是西方人的姓氏,比如女性結(jié)婚后從夫姓等)。所以,在建立系統(tǒng)存儲(chǔ)客戶(hù)信息時(shí),我傾向于在單獨(dú)的一個(gè)數(shù)據(jù)表里存儲(chǔ)姓氏字段,而且還附加起始日和終止日等字段,這樣就可以跟蹤這一數(shù)據(jù)條目的變化。
采用有意義的字段名
有一回我參加開(kāi)發(fā)過(guò)一個(gè)項(xiàng)目,其中有從其他程序員那里繼承的程序,那個(gè)程序員喜歡用屏幕上顯示數(shù)據(jù)指示用語(yǔ)命名字段,這也不賴(lài),但不幸的是,她還喜歡用一些奇怪的命名法,其命名采用了匈牙利命名和控制序號(hào)的組合形式,比如 cbo1、txt2、txt2_b 等等。
除非你在使用只面向你的縮寫(xiě)字段名的系統(tǒng),否則請(qǐng)盡可能地把字段描述的清楚些。當(dāng)然,也別做過(guò)頭了,比如 Customer_Shipping_Address_Street_Line_1,雖然很富有說(shuō)明性,但沒(méi)人愿意鍵入這么長(zhǎng)的名字,具體尺度就在你的把握中。
采用前綴命名
如果多個(gè)表里有好多同一類(lèi)型的字段(比如 FirstName),你不妨用特定表的前綴(比如 CusLastName)來(lái)幫助你標(biāo)識(shí)字段。
時(shí)效性數(shù)據(jù)應(yīng)包括“最近更新日期/時(shí)間”字段。時(shí)間標(biāo)記對(duì)查找數(shù)據(jù)問(wèn)題的原因、按日期重新處理/重載數(shù)據(jù)和清除舊數(shù)據(jù)特別有用。
標(biāo)準(zhǔn)化和數(shù)據(jù)驅(qū)動(dòng)
數(shù)據(jù)的標(biāo)準(zhǔn)化不僅方便了自己而且也方便了其他人。比方說(shuō),假如你的用戶(hù)界面要訪問(wèn)外部數(shù)據(jù)源(文件、XML 文檔、其他數(shù)據(jù)庫(kù)等),你不妨把相應(yīng)的連接和路徑信息存儲(chǔ)在用戶(hù)界面支持表里。還有,如果用戶(hù)界面執(zhí)行工作流之類(lèi)的任務(wù)(發(fā)送郵件、打印信箋、修改記錄狀態(tài)等),那么產(chǎn)生工作流的數(shù)據(jù)也可以存放在數(shù)據(jù)庫(kù)里。預(yù)先安排總需要付出努力,但如果這些過(guò)程采用數(shù)據(jù)驅(qū)動(dòng)而非硬編碼的方式,那么策略變更和維護(hù)都會(huì)方便得多。事實(shí)上,如果過(guò)程是數(shù)據(jù)驅(qū)動(dòng)的,你就可以把相當(dāng)大的責(zé)任推給用戶(hù),由用戶(hù)來(lái)維護(hù)自己的工作流過(guò)程。
標(biāo)準(zhǔn)化不能過(guò)頭
對(duì)那些不熟悉標(biāo)準(zhǔn)化一詞(normalization)的人而言,標(biāo)準(zhǔn)化可以保證表內(nèi)的字段都是最基礎(chǔ)的要素,而這一措施有助于消除數(shù)據(jù)庫(kù)中的數(shù)據(jù)冗余。標(biāo)準(zhǔn)化有好幾種形式,但 Third Normal Form(3NF)通常被認(rèn)為在性能、擴(kuò)展性和數(shù)據(jù)完整性方面達(dá)到了平衡。簡(jiǎn)單來(lái)說(shuō),3NF 規(guī)定:
* 表內(nèi)的每一個(gè)值都只能被表達(dá)一次。
* 表內(nèi)的每一行都應(yīng)該被的標(biāo)識(shí)(有鍵)。
* 表內(nèi)不應(yīng)該存儲(chǔ)依賴(lài)于其他鍵的非鍵信息。
遵守 3NF 標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)具有以下特點(diǎn):有一組表專(zhuān)門(mén)存放通過(guò)鍵連接起來(lái)的關(guān)聯(lián)數(shù)據(jù)。比方說(shuō),某個(gè)存放客戶(hù)及其有關(guān)定單的 3NF 數(shù)據(jù)庫(kù)就可能有兩個(gè)表:Customer 和 Order。Order 表不包含定單關(guān)聯(lián)客戶(hù)的任何信息,但表內(nèi)會(huì)存放一個(gè)鍵值,該鍵指向 Customer 表里包含該客戶(hù)信息的那一行。
更高層次的標(biāo)準(zhǔn)化也有,但更標(biāo)準(zhǔn)是否就一定更好呢?答案是不一定。事實(shí)上,對(duì)某些項(xiàng)目來(lái)說(shuō),甚至就連 3NF 都可能給數(shù)據(jù)庫(kù)引入太高的復(fù)雜性。
為了效率的緣故,對(duì)表不進(jìn)行標(biāo)準(zhǔn)化有時(shí)也是必要的,這樣的例子很多。曾經(jīng)有個(gè)開(kāi)發(fā)餐飲分析軟件的活就是用非標(biāo)準(zhǔn)化表把查詢(xún)時(shí)間從平均 40 秒降低到了兩秒左右。雖然我不得不這么做,但我絕不把數(shù)據(jù)表的非標(biāo)準(zhǔn)化當(dāng)作當(dāng)然的設(shè)計(jì)理念。而具體的操作不過(guò)是一種派生。所以如果表出了問(wèn)題重新產(chǎn)生非標(biāo)準(zhǔn)化的表是完全可能的。
Microsoft Visual FoxPro 報(bào)表技巧
如果你正在使用 Microsoft Visual FoxPro,你可以用對(duì)用戶(hù)友好的字段名來(lái)代替編號(hào)的名稱(chēng):比如用 Customer Name 代替 txtCNaM。這樣,當(dāng)你用向?qū)С绦?[Wizards,臺(tái)灣人稱(chēng)為‘精靈’] 創(chuàng)建表單和報(bào)表時(shí),其名字會(huì)讓那些不是程序員的人更容易閱讀。
不活躍或者不采用的指示符
增加一個(gè)字段表示所在記錄是否在業(yè)務(wù)中不再活躍挺有用的。不管是客戶(hù)、員工還是其他什么人,這樣做都能有助于再運(yùn)行查詢(xún)的時(shí)候過(guò)濾活躍或者不活躍狀態(tài)。同時(shí)還消除了新用戶(hù)在采用數(shù)據(jù)時(shí)所面臨的一些問(wèn)題,比如,某些記錄可能不再為他們所用,再刪除的時(shí)候可以起到一定的防范作用。
使用角色實(shí)體定義屬于某類(lèi)別的列[字段]
在需要對(duì)屬于特定類(lèi)別或者具有特定角色的事物做定義時(shí),可以用角色實(shí)體來(lái)創(chuàng)建特定的時(shí)間關(guān)聯(lián)關(guān)系,從而可以實(shí)現(xiàn)自我文檔化。
這里的含義不是讓 PERSON 實(shí)體帶有 Title 字段,而是說(shuō),為什么不用 PERSON 實(shí)體和 PERSON_TYPE 實(shí)體來(lái)描述人員呢?比方說(shuō),當(dāng) John Smith, Engineer 提升為 John Smith, Director 乃至最后爬到 John Smith, CIO 的高位,而所有你要做的不過(guò)是改變兩個(gè)表 PERSON 和 PERSON_TYPE 之間關(guān)系的鍵值,同時(shí)增加一個(gè)日期/時(shí)間字段來(lái)知道變化是何時(shí)發(fā)生的。這樣,你的 PERSON_TYPE 表就包含了所有 PERSON 的可能類(lèi)型,比如 Associate、Engineer、Director、CIO 或者 CEO 等。
還有個(gè)替代辦法就是改變 PERSON 記錄來(lái)反映新頭銜的變化,不過(guò)這樣一來(lái)在時(shí)間上無(wú)法跟蹤個(gè)人所處位置的具體時(shí)間。
采用常用實(shí)體命名機(jī)構(gòu)數(shù)據(jù)
組織數(shù)據(jù)的最簡(jiǎn)單辦法就是采用常用名字,比如:PERSON、ORGANIZATION、ADDRESS 和 PHONE 等等。當(dāng)你把這些常用的一般名字組合起來(lái)或者創(chuàng)建特定的相應(yīng)副實(shí)體時(shí),你就得到了自己用的特殊版本。開(kāi)始的時(shí)候采用一般術(shù)語(yǔ)的主要原因在于所有的具體用戶(hù)都能對(duì)抽象事物具體化。
有了這些抽象表示,你就可以在第 2 級(jí)標(biāo)識(shí)中采用自己的特殊名稱(chēng),比如,PERSON 可能是 Employee、Spouse、Patient、Client、Customer、Vendor 或者 Teacher 等。同樣的,ORGANIZATION 也可能是 MyCompany、MyDepartment、Competitor、Hospital、Warehouse、Government 等。最后 ADDRESS 可以具體為 Site、Location、Home、Work、Client、Vendor、Corporate 和 FieldOffice 等。
采用一般抽象術(shù)語(yǔ)來(lái)標(biāo)識(shí)“事物”的類(lèi)別可以讓你在關(guān)聯(lián)數(shù)據(jù)以滿(mǎn)足業(yè)務(wù)要求方面獲得巨大的靈活性,同時(shí)這樣做還可以顯著降低數(shù)據(jù)存儲(chǔ)所需的冗余量。
用戶(hù)來(lái)自世界各地
在設(shè)計(jì)用到網(wǎng)絡(luò)或者具有其他國(guó)際特性的數(shù)據(jù)庫(kù)時(shí),一定要記住大多數(shù)國(guó)家都有不同的字段格式,比如郵政編碼等,有些國(guó)家,比如新西蘭就沒(méi)有郵政編碼一說(shuō)。