如何保證數據庫結構的合理性(一、調整字段)


 

    最近重溫了下《SQL查詢凡人入門》,對里面提到保證數據庫結構的合理性深有感觸,故總結如下,與大家分享。

(一)調整字段

    數據庫中字段是表的基本結構部分,所以在調整整個表之前必須使得字段都是處於最好狀態。很多情況下,字段的選擇確定會減少很多給定表的已有問題,也能避免一些潛在的問題的產生。

 

1)字段名稱的調整

    字段描述的是表所描述的物體的特征。如果給字段一個合適的名稱,就可以標識這個打算要描述的特征。一個有歧義的含糊不清的名稱是一個麻煩的征兆,暗含這個字段的代表含義還沒有真正明確下來。可以利用下面清單中的內容檢查每一個字段名稱。

1.對整個組織來說,這個名稱是否具有一定的說明意義?

    要確保對於訪問這個字段的每個人來說這個名稱都是有描述意義的。語義有時候是非規則的,如果字段所用的詞對於不同的人群來說語義不同,那就麻煩了。就好象在大部分地區,搖頭表示的是“No”,而在印度,搖頭則表示“Yes”。

2.這個字段是否清楚沒有歧義?

    比如PhoneNumber就很容易讓人誤會。描述的是哪種電話號碼?為了明確起見,如果需要記錄每一種電話號碼,那么應創建HomePhone、WorkPhone、CellPhone這樣的字段。

    另外還需要確保不會在不同的表中使用相同的字段名。如有必要,建議在相同的字段名稱前面加上一個短短的前綴。比如,Vendors表中用VendCity,Customers表中用CustCity,Employees表中用EmpCity這樣的名稱。

    總之,確保數據庫中的每一個字段都有唯一的名稱,在整個數據庫結構中僅出現一次。除非這一字段被用來建立兩個表之間的關聯關系。

3.是否使用首字母的縮寫或者其他縮寫形式作為字段名稱?

    如果有,請修改它!首字母的縮寫很難解釋,易被誤解。使用縮寫要非常謹慎,處理的時候也小心。如果對字段名稱有一個信息的正向補充增強作用的情況下才使用縮寫,縮寫不能損害字段本身所表示的意義。

4.是否使用了暗含或者明確標識多個特性的字段名稱?

    這種字段一般很容易發現,因為有類似於“and”或“or”這樣的代表性字詞。包含反斜線符號(\)、連字符(-)、與的記號(&)的字段同樣也屬於這一類型。如果發現這樣的字段,檢查所存儲的數據,看是否需要將它們拆開成為更小的單獨字段。

5.確保字段名稱的單數形式

    字段所描述的是表所代表的物體的單一的特征,所以字段名應該是單數。而另一方面,表的名稱之所以是復數,是因為它所描述的是同類對象或事件的集合。使用這一命名規則后,區分表的名稱和字段名稱就是一件很容易的事了。

 

2)消除粗糙的邊

    修正了字段名,現在就應該轉而注意字段本身的結構了。雖然對字段的合理性已經有了相當的把握,但還是有幾點需要繼續努力來使字段結構盡可能更加合理高效。

1.確保字段描述的是表所表示的物體某一特性。

    這一步可確定字段是否真的屬於這個表。如果它和這個表的關系並不密切,那就刪除它。這個規則也有一個例外情況:這個字段是用來建立這個表和數據庫中另一個表之間的關聯關系,或為了完成數據庫應用的某些任務而專門添加到表中。

2.確保字段中僅包含一個單一的值。

    一個字段可能會潛在地保存相同值的幾個具體實例,這稱為多值字段。同樣地,一個字段也可能潛在地保存兩個或多個各自不同的值,這稱為多型字段。多值字段和多型字段會給數據庫管理帶來混亂,尤其是在對這些數據進行編輯、刪除和排序時。當每一個字段存儲的是單一值時,會對保證數據完整性和信息正確性有很大的幫助。

3.確保字段所存儲的內容不是計算結果或者一連串事件的結果。

    一個設計良好的表中不允許出現計算列。主要原因是因為計算列的值本身。這里的字段,不像電子數據表格中的一個單元,不能保存一個具體的計算值。當計算表達式中的任何一部分改變,存儲在字段中的計算值不會隨之更新。唯一方式是手工修改或者編寫代碼年進行自動修改。然而,使用計算列的首選是在SELECT語句中結合使用。

4.確保在整個數據庫中一個字段僅出現一次。

    一個普遍錯誤是向數據庫中的好幾個表插入了相同的字段,那就會面臨數據不一致的問題。此時,改變了一個表中的這個字段而忘記了對其他表中的相同字段進行相同的修改,就會出現數據的不一致。避免這個問題的方法微十時毫 確保整個數據庫結構中一個字段僅出現一次。(此規則的例外情況是用某一個字段來建立兩個表之間的關聯關系。)

 

3)多型字段的處理

    識別多型字段可以先回答一個簡單問題:是否能將當前字段的值分解成更小的獨立的幾部分?如果回答“是”,那么這就是一個多型字段。

    比如Customers表中有這個一個字段StreetAddress,里面的記錄為“15127 NE 24th ,#383 ,Redmond ,WA 98052”。這個字段就可以拆分為CustAddress、CustCity、CustState和CustZipcode,分別存儲15127 NE 24th 、Redmond、WA和98052。

下面是書中調整前和調整后的表:

調整后:

    有時候可能識別一個多型字段是比較困難的,比如Instruments表中有這么一個字段IstrumentID,里面存儲了GUIT2201、MFX3349、AMP1001、AMP5590、SFX2227和AMP2766。乍看好象不是多型字段,仔細查看就會發現,此字段的值中包含了兩個不同的信息:設備所屬的類別——如AMP(amplifier,擴音器)、GUIT(guitar,吉他)和MFX(multieffects unit,音效組合)——以及這些設備的標識號碼。這兩個值應該分開保存在各自的字段中,以保證數據完整性。下圖是Instruments表:

 

4)多值字段的處理

    多值字段的處理比多型字段相對困難一些,但是值得慶幸的是,多值字段一眼就能識別出來。幾乎毫無例外的,這一類型字段存儲的值包含許多逗號,逗號用來分隔字段中值的不同部分。

    在對多值字段進行處理之前,要先明白最初想要賦予的多值字段和表之間的關系。多值字段的值和其父表中的記錄是M:M的關系:一個多值字段中的某一個確定的值和父表中的多個記錄相關,父表中的一個記錄和多值字段中的多個值相關聯。處理這種多對多關系和其他多對多關系的方法一樣——用一個關聯表。

    要創建關聯表,使用多值字段並復制原來表中的主關鍵字作為建立新表的基礎部分。給這個新的關聯表一個合適的名字,並指定這兩個字段為其組合主關鍵字。(這種情況下,組合兩個字段中的值就能惟一標識新表中的每一個記錄。)然后就可以在一對一的基礎上對新表中的兩個字段關聯了。

    比如現在有Pilots表,表中有三個字段PilotID、PilotName、Certifications,有兩個記錄分別為:25100、John、727,737,757,MD80;25101、David、737,747,757。很注意到Certifications是一個多值字段(存儲的值包含了逗號),先將Certifications從Pilots表中刪除,然后將根據Certifications的內容新建Certifications表,Certifications表中有如下字段CertificationID和TypeofAircraft,包含記錄如下:8102、Boeing 727;8103、Boeing 737;8104、Boeing 747;8105、 Boeing 757;8106、 McDonnell Douglas MD80。接着,在創建一關聯表,比如Pliot Certifications表,表中的字段分別為Pilots表的主鍵PilotID和Certifications表的主鍵CertificationID。根據原來的記錄,Pliot Certifications表中會有如下記錄:25100、8102;25100、8103;25100、8105;25100、8106;25100、8103;25100、8104;25101、8105。

    為了方便,上面的例子是我簡化過的,下面是書中的例子:

    調整前的表:

調整后的表:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM