亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > 文庫 > 正文

數據庫設計指南之設計表和字段

2024-09-07 22:12:26
字體:
來源:轉載
供稿:網友

我們在制作各種應用程序時,很難再離開數據庫,而在設計數據庫中的表和字段中,我們可能熟知很多技巧和經驗,但有可能有些經驗和技巧你還不曾知道,本文從24個方面講解了在設計書庫表和字段時的技巧、經驗和應該注意的問題。

第二部分 設計表和字段

1. 檢查各種變化

我在設計數據庫的時候會考慮到哪些數據字段將來可能會發生變更。比方說,姓氏就是如此(注意是西方人的姓氏,比如女性結婚后從夫姓等)。所以,在建立系統存儲客戶信息時,我傾向于在單獨的一個數據表里存儲姓氏字段,而且還附加起始日和終止日等字段,這樣就可以跟蹤這一數據條目的變化。

2. 采用有意義的字段名

有一回我參加開發過一個項目,其中有從其他程序員那里繼承的程序,那個程序員喜歡用屏幕上顯示數據指示用語命名字段,這也不賴,但不幸的是,她還喜歡用一些奇怪的命名法,其命名采用了匈牙利命名和控制序號的組合形式,比如cbo1、txt2、txt2_b 等等。

除非你在使用只面向你的縮寫字段名的系統,否則請盡可能地把字段描述的清楚些。當然,也別做過頭了,比如Customer_Shipping_Address_Street_Line_1 I 雖然很富有說明性,但沒人愿意鍵入這么長的名字,具體尺度就在你的把握中。

3. 采用前綴命名

如果多個表里有好多同一類型的字段(比如FirstName),你不妨用特定表的前綴(比如CusLastName)來幫助你標識字段。

4.采用時效性數據

時效性數據應包括“最近更新日期/時間”字段。時間標記對查找數據問題的原因、按日期重新處理/重載數據和清除舊數據特別有用。

5. 標準化和數據驅動

數據的標準化不僅方便了自己而且也方便了其他人。比方說,假如你的用戶界面要訪問外部數據源(文件、XML 文檔、其他數據庫等),你不妨把相應的連接和路徑信息存儲在用戶界面支持表里。還有,如果用戶界面執行工作流之類的任務(發送郵件、打印信箋、修改記錄狀態等),那么產生工作流的數據也可以存放在數據庫里。預先安排總需要付出努力,但如果這些過程采用數據驅動而非硬編碼的方式,那么策略變更和維護都會方便得多。事實上,如果過程是數據驅動的,你就可以把相當大的責任推給用戶,由用戶來維護自己的工作流過程。

6. 標準化不能過頭

對那些不熟悉標準化一詞(normalization )的人而言,標準化可以保證表內的字段都是最基礎的要素,而這一措施有助于消除數據庫中的數據冗余。標準化有好幾種形式,但Third Normal Form(3NF)通常被認為在性能、擴展性和數據完整性方面達到了最好平衡。簡單來說,3NF 規定:

(1)表內的每一個值都只能被表達一次。

(2)表內的每一行都應該被唯一的標識(有唯一鍵)。

(3)表內不應該存儲依賴于其他鍵的非鍵信息。

遵守3NF 標準的數據庫具有以下特點:有一組表專門存放通過鍵連接起來的關聯數據。比方說,某個存放客戶及其有關定單的3NF 數據庫就可能有兩個表:Customer 和Order。Order 表不包含定單關聯客戶的任何信息,但表內會存放一個鍵值,該鍵指向Customer 表里包含該客戶信息的那一行。

更高層次的標準化也有,但更標準是否就一定更好呢?答案是不一定。事實上,對某些項目來說,甚至就連3NF 都可能給數據庫引入太高的復雜性。

為了效率的緣故,對表不進行標準化有時也是必要的,這樣的例子很多。曾經有個開發財務分析軟件的活就是用非標準化表把查詢時間從平均40 秒降低到了兩秒左右。雖然我不得不這么做,但我絕不把數據表的非標準化當作當然的設計理念。而具體的操作不過是一種派生。所以如果表出了問題重新產生非標準化的表是完全可能的。

7. Microsoft Access 報表技巧

如果你正在使用Microsoft Access,你可以用對用戶友好的字段名來代替編號的名稱:比如用Customer Name 代替txtCNaM。這樣,當你用向導程序創建表單和報表時,其名字會讓那些不是程序員的人更容易閱讀。

8. 不活躍或者不采用的指示符

增加一個字段表示所在記錄是否在業務中不再活躍挺有用的。不管是客戶、員工還是其他什么人,這樣做都能有助于再運行查詢的時候過濾活躍或者不活躍狀態。同時還消除了新用戶在采用數據時所面臨的一些問題,比如,某些記錄可能不再為他們所用,再刪除的時候可以起到一定的防范作用。

9. 使用角色實體定義屬于某類別的列

在需要對屬于特定類別或者具有特定角色的事物做定義時,可以用角色實體來創建特定的時間關聯關系,從而可以實現自我文檔化。

這里的含義不是讓PERSON 實體帶有Title 字段,而是說,為什么不用PERSON 實體和PERSON_TYPE 實體來描述人員呢?然后,比方說,當John Smith, Engineer 提升為John Smith, Director 乃至最后爬到John Smith, CIO 的高位,而所有鬩齙牟還歉謀淞礁霰鞵ERSON 和PERSON_TYPE 之間關系的鍵值,同時增加一個日期/時間字段來知道變化是何時發生的。這樣,你的PERSON_TYPE 表就包含了所有PERSON 的可能類型,比如Associate、Engineer、Director、CIO 或者CEO 等。

還有個替代辦法就是改變PERSON 記錄來反映新頭銜的變化,不過這樣一來在時間上無法跟蹤個人所處位置的具體時間。

10. 采用常用實體命名機構數據

組織數據的最簡單辦法就是采用常用名字,比如:PERSON、ORGANIZATION、ADDRESS 和PHONE 等等。當你把這些常用的一般名字組合起來或者創建特定的相應副實體時,你就得到了自己用的特殊版本。開始的時候采用一般術語的主要原因在于所有的具體用戶都能對抽象事物具體化。

有了這些抽象表示,你就可以在第2 級標識中采用自己的特殊名稱,比如,PERSON 可能是Employee、Spouse、Patient、Client、Customer、Vendor 或者Teacher 等。同樣的,ORGANIZATION 也可能是MyCompany、MyDepartment、Competitor、Hospital、Warehouse、Government 等。最后ADDRESS 可以具體為Site、Location、Home、Work、Client、Vendor、Corporate 和FieldOffice 等。

采用一般抽象術語來標識“事物”的類別可以讓你在關聯數據以滿足業務要求方面獲得巨大的靈活性,同時這樣做還可以顯著降低數據存儲所需的冗余量。

11. 用戶來自世界各地

在設計用到網絡或者具有其他國際特性的數據庫時,一定要記住大多數國家都有不同的字段格式,比如郵政編碼等,有些國家,比如新西蘭就沒有郵政編碼一說。

12. 數據重復需要采用分立的數據表

如果你發現自己在重復輸入數據,請創建新表和新的關系。

查看后12個技巧與經驗,請點擊下一頁。

13. 每個表中都應該添加的3 個有用的字段

(1)dRecordCreationDate,在VB 下默認是Now(),而在SQL Server 下默認為GETDATE()

(2) sRecordCreator,在SQL Server 下默認為NOT NULL DEFAULT USER

(3) nRecordVersion,記錄的版本標記;有助于準確說明記錄中出現null 數據或者丟失數據的原因。

14. 對地址和電話采用多個字段

描述街道地址就短短一行記錄是不夠的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的靈活性。還有,電話號碼和郵件地址最好擁有自己的數據表,其間具有自身的類型和標記類別。

過分標準化可要小心,這樣做可能會導致性能上出現問題。雖然地址和電話表分離通常可以達到最佳狀態,但是如果需要經常訪問這類信息,或許在其父表中存放“首選”信息(比如Customer 等)更為妥當些。非標準化和加速訪問之間的妥協是有一定意義的。

15. 使用多個名稱字段

我覺得很吃驚,許多人在數據庫里就給name 留一個字段。我覺得只有剛入門的開發人員才會這么做,但實際上網上這種做法非常普遍。我建議應該把姓氏和名字當作兩個字段來處理,然后在查詢的時候再把他們組合起來。

要把這種情況變得對用戶更為友好有好些方法。我最常用的是在同一表中創建一個計算列,通過它可以自動地連接標準化后的字段,這樣數據變動的時候它也跟著變。不過,這樣做在采用建模軟件時得很機靈才行??傊?,采用連接字段的方式可以有效的隔離用戶應用和開發人員界面。

16. 提防大小寫混用的對象名和特殊字符

過去最令我惱火的事情之一就是數據庫里有大小寫混用的對象名,比如CustomerData。這一問題從Access 到Oracle 數據庫都存在。我不喜歡采用這種大小寫混用的對象命名方法,結果還不得不手工修改名字。想想看,這種數據庫/應用程序能混到采用更強大數據庫的那一天嗎?采用全部大寫而且包含下劃符的名字具有更好的可讀性(CUSTOMER_DATA),絕對不要在對象名的字符之間留空ge。

17. 小心保留詞

要保證你的字段名沒有和保留詞、數據庫系統或者常用訪問方法沖突,比如,最近我編寫的一個ODBC 連接程序里有個表,其中就用了DESC 作為說明字段名。后果可想而知!DESC 是DESCENDING 縮寫后的保留詞。表里的一個SELECT *語句倒是能用,但我得到的卻是一大堆毫無用處的信息。

18. 保持字段名和類型的一致性

在命名字段并為其指定數據類型的時候一定要保證一致性。假如字段在某個表中叫做“agreement_number”,你就別在另一個表里把名字改成“ref1”。假如數據類型在一個表里是整數,那在另一個表里可就別變成字符型了。記住,你干完自己的活了,其他人還要用你的數據庫呢。

19. 仔細選擇數字類型

在SQL 中使用smallint 和tinyint 類型要特別小心,比如,假如你想看看月銷售總額,你的總額字段類型是smallint,那么,如果總額超過了$32,767 你就不能進行計算操作了。

20. 刪除標記

在表中包含一個“刪除標記”字段,這樣就可以把行標記為刪除。在關系數據庫里不要單獨刪除某一行;最好采用清除數據程序而且要仔細維護索引整體性。

21. 避免使用觸發器

觸發器的功能通??梢杂闷渌绞綄崿F。在調試程序時觸發器可能成為干擾。假如你確實需要采用觸發器,你最好集中對它文檔化。

22. 包含版本機制

建議你在數據庫中引入版本控制機制來確定使用中的數據庫的版本。無論如何你都要實現這一要求。時間一長,用戶的需求總是會改變的。最終可能會要求修改數據庫結構。雖然你可以通過檢查新字段或者索引來確定數據庫結構的版本,但我發現把版本信息直接存放到數據庫中不更為方便嗎?。

23. 給文本字段留足余量

ID 類型的文本字段,比如客戶ID 或定單號等等都應該設置得比一般想象更大,因為時間不長你多半就會因為要添加額外的字符而難堪不已。比方說,假設你的客戶ID 為10 位數長。那你應該把數據庫表字段的長度設為12 或者13 個字符長。這算浪費空間嗎?是有一點,但也沒你想象的那么多:一個字段加長3 個字符在有1 百萬條記錄,再加上一點索引的情況下才不過讓整個數據庫多占據3MB 的空間。但這額外占據的空間卻無需將來重構整個數據庫就可以實現數據庫規模的增長了。

24. 列命名技巧

我們發現,假如你給每個表的列名都采用統一的前綴,那么在編寫SQL 表達式的時候會得到大大的簡化。這樣做也確實有缺點,比如破壞了自動表連接工具的作用,后者把公共列名同某些數據庫聯系起來,不過就連這些工具有時不也連接錯誤嘛。舉個簡單的例子,假設有兩個表:

Customer 和Order。Customer 表的前綴是cu_,所以該表內的子段名如下:cu_name_id、cu_surname、cu_initials 和cu_address 等。Order 表的前綴是or_,所以子段名是:or_order_id、or_cust_name_id、or_quantity 和or_description 等。

這樣從數據庫中選出全部數據的SQL 語句可以寫成如下所示:

Select * from Customer, Order
  Where cu_surname = "MYNAME"
  and cu_name_id = or_cust_name_id
  and or_quantity = 1;

在沒有這些前綴的情況下則寫成這個樣子:

Select * from Customer, Order
  Where Customer.surname = "MYNAME"
  and Customer.name_id = Order.cust_name_id
  and Order.quantity = 1

第1 個SQL 語句沒少鍵入多少字符。但如果查詢涉及到5 個表乃至更多的列你就知道這個技巧多有用了。

第一部分 數據庫設計之前      第三部分 選擇鍵和索引

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久免费精品视频| 国产日韩精品入口| 久久视频中文字幕| 国产精品电影在线观看| 国产欧美在线观看| 欧美亚洲成人xxx| 国产精品露脸自拍| 国产一区二区三区毛片| 久久在线免费观看视频| 97福利一区二区| 亚洲视频欧美视频| 亚洲精品日韩欧美| 日韩在线视频观看正片免费网站| 欧美成人激情视频免费观看| 亚洲国产精品免费| 国产在线不卡精品| 久久亚洲一区二区三区四区五区高| 亚洲理论电影网| 色樱桃影院亚洲精品影院| 国产视频在线观看一区二区| 亚洲黄色在线观看| 久久五月天综合| 久久久精品免费视频| 欧美在线免费观看| 欧美专区日韩视频| 日韩美女激情视频| 日韩福利视频在线观看| 国产欧美日韩免费看aⅴ视频| 日韩欧美中文在线| 久久久久久久网站| 精品久久久久久国产| 九九热精品在线| 久久韩国免费视频| 色偷偷偷亚洲综合网另类| 国产精品夜间视频香蕉| 中文字幕精品影院| 国产在线高清精品| 国产精品大陆在线观看| 国产一区二区三区在线观看视频| 亚洲欧美日韩精品久久奇米色影视| 欧美大尺度激情区在线播放| 国产色婷婷国产综合在线理论片a| 日韩av手机在线看| 欧美片一区二区三区| 久久夜精品va视频免费观看| 91国内揄拍国内精品对白| 97视频免费看| 国产精品福利在线| 欧美亚洲激情视频| 亚洲伊人成综合成人网| 欧美亚洲日本网站| 国产亚洲精品久久| 日韩av免费看网站| 日韩成人免费视频| 亚洲女人被黑人巨大进入| 日韩欧美有码在线| 97在线免费观看| 日韩欧美亚洲一二三区| 亚洲精品少妇网址| 久久精品色欧美aⅴ一区二区| 久久九九有精品国产23| 日韩有码在线观看| 亚洲欧美一区二区三区四区| 亚洲一区二区中文字幕| 欧美又大又硬又粗bbbbb| 九九久久久久久久久激情| 国产亚洲日本欧美韩国| 国产亚洲精品91在线| 久久免费视频观看| 欧美成人黑人xx视频免费观看| 国产精品午夜一区二区欲梦| 欧美激情视频一区二区三区不卡| 精品福利在线视频| 97精品国产97久久久久久| 日韩一区二区在线视频| 亚洲精品久久久久久下一站| 国产精品激情自拍| 国产精品99久久99久久久二8| 91在线观看免费观看| 一区二区三区天堂av| 国内精品久久久久伊人av| 超碰97人人做人人爱少妇| 91精品久久久久久久久久入口| 国产精品欧美久久久| 91九色精品视频| 91九色蝌蚪国产| 亚洲欧美国产精品久久久久久久| 欧美黑人又粗大| 久久久久久国产精品美女| 亚州精品天堂中文字幕| 91九色单男在线观看| 国产精品黄色影片导航在线观看| 日韩精品在线观看网站| 4438全国成人免费| 国产精品影院在线观看| 国产一区私人高清影院| 性日韩欧美在线视频| 久久香蕉频线观| 欧美影院成年免费版| 国产精品极品美女粉嫩高清在线| 欧美—级a级欧美特级ar全黄| 国产精品视频网站| 日韩成人在线观看| 欧美日韩一区二区在线播放| 亚洲精品第一页| 国产精品福利久久久| 国产精品久久网| 91亚洲永久免费精品| 国产精品久久久久久久久久尿| 成年无码av片在线| 亚洲国产天堂久久综合网| 大伊人狠狠躁夜夜躁av一区| 日韩精品在线免费观看视频| 亚洲精品一区中文字幕乱码| 亚洲第一精品夜夜躁人人躁| 亚洲aa中文字幕| 精品高清一区二区三区| 国产欧美精品一区二区三区-老狼| 亚洲美女福利视频网站| 国产亚洲精品久久久久久777| 国产一区二区三区欧美| 91精品国产91久久久久久吃药| 91麻豆国产精品| 国产精品主播视频| 亚洲乱码一区二区| 91高清免费视频| 中文字幕亚洲一区在线观看| 亚洲网站在线播放| 亚洲色图激情小说| 国产欧美久久久久久| 久久久视频在线| 色先锋资源久久综合5566| 亚洲精品一区二区在线| 精品国产鲁一鲁一区二区张丽| 姬川优奈aav一区二区| 日av在线播放中文不卡| 日韩欧美国产骚| 日韩精品免费观看| 亚洲天堂色网站| 最新亚洲国产精品| 日韩在线观看免费全集电视剧网站| 亚洲理论片在线观看| 一区二区三区四区精品| 国产精品视频在线观看| 日韩精品在线观| 欧美综合一区第一页| xxxx欧美18另类的高清| 狠狠躁天天躁日日躁欧美| 国产亚洲精品激情久久| 欧美日韩国产一区在线| 国产精品久久久久久婷婷天堂| 青青久久av北条麻妃黑人| 精品国产一区二区三区四区在线观看| 91久久久久久久久| 中文字幕在线看视频国产欧美在线看完整| 国产精品美女在线观看| 亚洲国产另类久久精品| 国产精品尤物福利片在线观看| 日韩69视频在线观看| 亚洲欧美一区二区三区情侣bbw| 国产精品久久久久久久美男| 亚洲午夜久久久久久久| 黄色91在线观看| 欧美猛交ⅹxxx乱大交视频|