麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數(shù)據(jù)庫 > 文庫 > 正文

數(shù)據(jù)庫設(shè)計(jì)指南之設(shè)計(jì)表和字段

2024-09-07 22:12:26
字體:
供稿:網(wǎng)友

我們?cè)谥谱鞲鞣N應(yīng)用程序時(shí),很難再離開數(shù)據(jù)庫,而在設(shè)計(jì)數(shù)據(jù)庫中的表和字段中,我們可能熟知很多技巧和經(jīng)驗(yàn),但有可能有些經(jīng)驗(yàn)和技巧你還不曾知道,本文從24個(gè)方面講解了在設(shè)計(jì)書庫表和字段時(shí)的技巧、經(jīng)驗(yàn)和應(yīng)該注意的問題。

第二部分 設(shè)計(jì)表和字段

1. 檢查各種變化

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

2. 采用有意義的字段名

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

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

3. 采用前綴命名

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

4.采用時(shí)效性數(shù)據(jù)

時(shí)效性數(shù)據(jù)應(yīng)包括“最近更新日期/時(shí)間”字段。時(shí)間標(biāo)記對(duì)查找數(shù)據(jù)問題的原因、按日期重新處理/重載數(shù)據(jù)和清除舊數(shù)據(jù)特別有用。

5. 標(biāo)準(zhǔn)化和數(shù)據(jù)驅(qū)動(dòng)

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

6. 標(biāo)準(zhǔn)化不能過頭

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

(1)表內(nèi)的每一個(gè)值都只能被表達(dá)一次。

(2)表內(nèi)的每一行都應(yīng)該被唯一的標(biāo)識(shí)(有唯一鍵)。

(3)表內(nèi)不應(yīng)該存儲(chǔ)依賴于其他鍵的非鍵信息。

遵守3NF 標(biāo)準(zhǔn)的數(shù)據(jù)庫具有以下特點(diǎn):有一組表專門存放通過鍵連接起來的關(guān)聯(lián)數(shù)據(jù)。比方說,某個(gè)存放客戶及其有關(guān)定單的3NF 數(shù)據(jù)庫就可能有兩個(gè)表:Customer 和Order。Order 表不包含定單關(guān)聯(lián)客戶的任何信息,但表內(nèi)會(huì)存放一個(gè)鍵值,該鍵指向Customer 表里包含該客戶信息的那一行。

更高層次的標(biāo)準(zhǔn)化也有,但更標(biāo)準(zhǔn)是否就一定更好呢?答案是不一定。事實(shí)上,對(duì)某些項(xiàng)目來說,甚至就連3NF 都可能給數(shù)據(jù)庫引入太高的復(fù)雜性。

為了效率的緣故,對(duì)表不進(jìn)行標(biāo)準(zhǔn)化有時(shí)也是必要的,這樣的例子很多。曾經(jīng)有個(gè)開發(fā)財(cái)務(wù)分析軟件的活就是用非標(biāo)準(zhǔn)化表把查詢時(shí)間從平均40 秒降低到了兩秒左右。雖然我不得不這么做,但我絕不把數(shù)據(jù)表的非標(biāo)準(zhǔn)化當(dāng)作當(dāng)然的設(shè)計(jì)理念。而具體的操作不過是一種派生。所以如果表出了問題重新產(chǎn)生非標(biāo)準(zhǔn)化的表是完全可能的。

7. Microsoft Access 報(bào)表技巧

如果你正在使用Microsoft Access,你可以用對(duì)用戶友好的字段名來代替編號(hào)的名稱:比如用Customer Name 代替txtCNaM。這樣,當(dāng)你用向?qū)С绦騽?chuàng)建表單和報(bào)表時(shí),其名字會(huì)讓那些不是程序員的人更容易閱讀。

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

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

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

在需要對(duì)屬于特定類別或者具有特定角色的事物做定義時(shí),可以用角色實(shí)體來創(chuàng)建特定的時(shí)間關(guān)聯(lián)關(guān)系,從而可以實(shí)現(xiàn)自我文檔化。

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

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

10. 采用常用實(shí)體命名機(jī)構(gòu)數(shù)據(jù)

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

有了這些抽象表示,你就可以在第2 級(jí)標(biāo)識(shí)中采用自己的特殊名稱,比如,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ù)語來標(biāo)識(shí)“事物”的類別可以讓你在關(guān)聯(lián)數(shù)據(jù)以滿足業(yè)務(wù)要求方面獲得巨大的靈活性,同時(shí)這樣做還可以顯著降低數(shù)據(jù)存儲(chǔ)所需的冗余量。

11. 用戶來自世界各地

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

12. 數(shù)據(jù)重復(fù)需要采用分立的數(shù)據(jù)表

如果你發(fā)現(xiàn)自己在重復(fù)輸入數(shù)據(jù),請(qǐng)創(chuàng)建新表和新的關(guān)系。

查看后12個(gè)技巧與經(jīng)驗(yàn),請(qǐng)點(diǎn)擊下一頁。

13. 每個(gè)表中都應(yīng)該添加的3 個(gè)有用的字段

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

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

(3) nRecordVersion,記錄的版本標(biāo)記;有助于準(zhǔn)確說明記錄中出現(xiàn)null 數(shù)據(jù)或者丟失數(shù)據(jù)的原因。

14. 對(duì)地址和電話采用多個(gè)字段

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

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

15. 使用多個(gè)名稱字段

我覺得很吃驚,許多人在數(shù)據(jù)庫里就給name 留一個(gè)字段。我覺得只有剛?cè)腴T的開發(fā)人員才會(huì)這么做,但實(shí)際上網(wǎng)上這種做法非常普遍。我建議應(yīng)該把姓氏和名字當(dāng)作兩個(gè)字段來處理,然后在查詢的時(shí)候再把他們組合起來。

要把這種情況變得對(duì)用戶更為友好有好些方法。我最常用的是在同一表中創(chuàng)建一個(gè)計(jì)算列,通過它可以自動(dòng)地連接標(biāo)準(zhǔn)化后的字段,這樣數(shù)據(jù)變動(dòng)的時(shí)候它也跟著變。不過,這樣做在采用建模軟件時(shí)得很機(jī)靈才行。總之,采用連接字段的方式可以有效的隔離用戶應(yīng)用和開發(fā)人員界面。

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

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

17. 小心保留詞

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

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

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

19. 仔細(xì)選擇數(shù)字類型

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

20. 刪除標(biāo)記

在表中包含一個(gè)“刪除標(biāo)記”字段,這樣就可以把行標(biāo)記為刪除。在關(guān)系數(shù)據(jù)庫里不要單獨(dú)刪除某一行;最好采用清除數(shù)據(jù)程序而且要仔細(xì)維護(hù)索引整體性。

21. 避免使用觸發(fā)器

觸發(fā)器的功能通常可以用其他方式實(shí)現(xiàn)。在調(diào)試程序時(shí)觸發(fā)器可能成為干擾。假如你確實(shí)需要采用觸發(fā)器,你最好集中對(duì)它文檔化。

22. 包含版本機(jī)制

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

23. 給文本字段留足余量

ID 類型的文本字段,比如客戶ID 或定單號(hào)等等都應(yīng)該設(shè)置得比一般想象更大,因?yàn)闀r(shí)間不長你多半就會(huì)因?yàn)橐砑宇~外的字符而難堪不已。比方說,假設(shè)你的客戶ID 為10 位數(shù)長。那你應(yīng)該把數(shù)據(jù)庫表字段的長度設(shè)為12 或者13 個(gè)字符長。這算浪費(fèi)空間嗎?是有一點(diǎn),但也沒你想象的那么多:一個(gè)字段加長3 個(gè)字符在有1 百萬條記錄,再加上一點(diǎn)索引的情況下才不過讓整個(gè)數(shù)據(jù)庫多占據(jù)3MB 的空間。但這額外占據(jù)的空間卻無需將來重構(gòu)整個(gè)數(shù)據(jù)庫就可以實(shí)現(xiàn)數(shù)據(jù)庫規(guī)模的增長了。

24. 列命名技巧

我們發(fā)現(xiàn),假如你給每個(gè)表的列名都采用統(tǒng)一的前綴,那么在編寫SQL 表達(dá)式的時(shí)候會(huì)得到大大的簡化。這樣做也確實(shí)有缺點(diǎn),比如破壞了自動(dòng)表連接工具的作用,后者把公共列名同某些數(shù)據(jù)庫聯(lián)系起來,不過就連這些工具有時(shí)不也連接錯(cuò)誤嘛。舉個(gè)簡單的例子,假設(shè)有兩個(gè)表:

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

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

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

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

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

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

第一部分 數(shù)據(jù)庫設(shè)計(jì)之前      第三部分 選擇鍵和索引

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 免费观看一区二区三区 | 免费一级毛片免费播放 | 中国国语毛片免费观看视频 | 国产精品美女久久久久久不卡 | 国产精品久久久久久久av三级 | 久久久久久高清 | 视频一区二区三区在线播放 | 久久精品国产精品亚洲 | av在线播放亚洲 | 久久综合久久综合久久 | 成年免费大片黄在线观看岛国 | 欧美黑人伦理 | 亚洲成人综合网站 | 久久久tv | 日韩欧美精品电影 | 高颜值美女啪啪 | 91精品国产91久久久久久吃药 | 精品91av | 逼特逼视频在线观看 | 久久国产精品免费视频 | 久久精品国产一区二区 | 国内精品久久久久久影视8 嫩草影院在线观看网站成人 | 农村少妇吞精夜夜爽视频 | 免费国产a| 欧美综合在线观看 | 午夜精品小视频 | 黄片毛片一级 | 噜噜噜躁狠狠躁狠狠精品视频 | 一级做a爰性色毛片免费1 | 日韩中文字幕一区二区三区 | 毛片视频大全 | 色偷偷欧美 | 日韩视频一区二区三区在线观看 | 成人性视频欧美一区二区三区 | 亚洲视频成人 | 鲁人人人鲁人人鲁精品 | 日韩黄a | 国产成人高清在线 | 免费观看黄色影片 | 精品亚洲福利一区二区 | 国产91九色视频 |