国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

淺談數(shù)據(jù)庫主鍵設(shè)計的原則

2009-09-30 01:40:58常玉慧
電腦知識與技術(shù) 2009年36期
關(guān)鍵詞:主鍵字段訂單

常玉慧

摘要:主鍵在數(shù)據(jù)庫中具有重要地位,其設(shè)計直接影響到數(shù)據(jù)庫系統(tǒng)的應(yīng)用和效能。該文從主鍵概念出發(fā),對現(xiàn)在常用的數(shù)據(jù)庫主鍵設(shè)計方法進行了比較,提出了主鍵設(shè)計的相關(guān)原則。

關(guān)鍵詞:關(guān)系數(shù)據(jù)庫;主鍵設(shè)計

中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2009)36-10176-02

Discussion on Principles for Database Primary Key Design

CHANG Yu-hui

(Jiangsu Technical Teachers College, Computer Engineering, Changzhou 203001, China)

Abstract: Primary keys are very important in databases, and .their design directly affects the application and performance of database systems. Starting from the concept of the primary key, the paper compares the commonly used design methods of the primary key, and proposes the relevant principles for primary key design.

Key words: Database; primary key

1 主鍵的概念及其設(shè)計主鍵的必要性

在我們進行數(shù)據(jù)庫設(shè)計中,不可逃避的就是要定義數(shù)據(jù)庫表的主鍵,主鍵的設(shè)計對整個數(shù)據(jù)庫的設(shè)計影響很大,因此我們不得不要重視起來。那么我們首先來看看什么是數(shù)據(jù)庫的主鍵和與它密切相關(guān)的外鍵。

1.1 主鍵

能夠唯一表示數(shù)據(jù)表中的每個記錄的字段或者字段的組合就稱為主鍵(主碼)。一旦確定為主鍵則該字段不可為空也不可以重復(fù)。一個主鍵是唯一識別一個表的每一記錄,但這只是其作用的一部分。主鍵的主要作用是將記錄和存放在其他表中的數(shù)據(jù)進行關(guān)聯(lián)。在這一點上主鍵是不同表中各記錄之間的簡單指針。所以主鍵的值對用戶而言是沒有什么意義并且和它要賦予的值也沒有什么特別的聯(lián)系。比如學(xué)生表中的學(xué)號就可以定義成該表的主鍵。

1.2 外鍵

外鍵的定義是相對于主鍵而言的若有兩個表A、B,key是A的主鍵而B中也有key字段則key就是表B的外鍵。比如另有一張成績表表中也出現(xiàn)了學(xué)生表中的對應(yīng)學(xué)號字段則相對于學(xué)生表學(xué)號就是成績表的外鍵。

1.3 設(shè)計主鍵的必要性

有些朋友可能不提倡數(shù)據(jù)庫表必須要主鍵,但在我的思考中,覺得每個表都應(yīng)該具有主鍵,不管是單主鍵還是雙主鍵,主鍵的存在就代表著表結(jié)構(gòu)的完整性,表的記錄必須得有唯一區(qū)分的字段,主鍵主要是用于其他表的外鍵關(guān)聯(lián),本記錄的修改與刪除,當(dāng)我們沒有主鍵時,這些操作會變的非常麻煩。主鍵除了上述作用外常常與外鍵構(gòu)成參照完整性約束防止出現(xiàn)數(shù)據(jù)不一致。所以數(shù)據(jù)庫在設(shè)計時主鍵起到了很重要的作用。

2 主鍵設(shè)計的原則

大家都設(shè)計過數(shù)據(jù)庫,也為表定義過主鍵,我想闡述的是,應(yīng)該如何正確的設(shè)計一個主鍵,在以往的一些資料中,都只是提了主鍵設(shè)計的方法而沒有提及到主鍵設(shè)計的原則。針對于此,我對幾種常用的設(shè)計主鍵的方法做了如下總結(jié):

2.1 是否要采用自動遞增的方式

對于以前談到的主鍵,要求唯一性,因此大家都用自動遞增的方式。這樣的方式是非常不可取的??赡苁菫榱朔奖悴迦胗涗洉r,不必去人為創(chuàng)建主鍵值。以為這樣會方便,其實不是的。帶來的麻煩要遠(yuǎn)遠(yuǎn)勝于這種所謂的"方便"。第一,數(shù)據(jù)導(dǎo)入不方便,經(jīng)常會有從另一系統(tǒng)導(dǎo)入數(shù)據(jù)進來,自動遞增的主鍵,將不允許原表中的ID被導(dǎo)入進來。這會導(dǎo)致主鍵丟失。第二,對于象訂單這樣的有主外鍵的表來說,如果訂單的"主檔表"主鍵是自動生成的,那么在保存一個訂單時,會要求對主檔表與明細(xì)表同進行事務(wù)保存,而此時,先要生成一條訂單,然后取出這個訂單自動生成的主鍵,然后再把此作為明細(xì)表的一個外鍵,進行明細(xì)的保存。這過程中,將變的復(fù)雜而且不可行,事務(wù)將如何處理呢?訂單主檔表插入記錄后,要是明細(xì)保存時遇到錯誤,主檔表記錄還要進行刪除。繁瑣。插入成功以后,還要取出產(chǎn)生的最大值。這將是一個嚴(yán)重的浪費。記錄多的話會影響速度,而且會存在并行插入。導(dǎo)致獲取的記錄可能是不正確的。因此在以上的嚴(yán)重問題下,請不要采用自動遞增方式。

2.2 是否要采用int型作為主鍵

以前大家都采用int型作為主鍵,導(dǎo)致主鍵的值都是數(shù)字。其實我們也明白。并不是只是數(shù)字的東西就是數(shù)字型的,比如電話號碼等。因此對于主鍵采用int型的優(yōu)勢是速度快插入查詢時都可能會比其他的方式快。但我這種快的效果也未必有多明顯比如以varchar(15)為例物理主鍵排序的數(shù)據(jù)會自動以主鍵進行物理數(shù)據(jù)排序。因此就算是字符型的數(shù)據(jù)在插入時也會插入到相應(yīng)的物理位置上也就是說在插入時可能會影響一些速度。但在以后的查詢中速度影響不會太明顯。而我要說的不采用int型作為主鍵不是說里面不存數(shù)據(jù)。我還是建議大家在主鍵中存放數(shù)字這樣的排序比較要比夾雜字母的排序來的快之所以要采用字符型也是為以后的數(shù)據(jù)導(dǎo)入作準(zhǔn)備有一天會要求從其他表導(dǎo)入數(shù)據(jù)時可以在導(dǎo)入數(shù)據(jù)的主鍵上加一個特定字母來避免與原主鍵沖突。比如在導(dǎo)入數(shù)據(jù)的主鍵前加一個“N”字母。這也就不用擔(dān)心要求導(dǎo)入數(shù)據(jù)表中的主鍵是數(shù)字型還是字符型了。

2.3 是否采用編號來定義主鍵

主鍵設(shè)計有個原則就是主鍵不應(yīng)具有任何實際意義,這條其實是非常重要的。有人就是覺得編號本身是唯一的可以作為主鍵用但可能會為以后帶來麻煩。因為帶有實際意義的字段還是存在被修改的可能性,而對于主鍵最大的忌諱就是修改主鍵,這可能會導(dǎo)致非常嚴(yán)重的不可估計的后果。比如學(xué)生編號平時以為永遠(yuǎn)不會修改但修改的可能還是會存在。

還有一種表面上是唯一的但實際上應(yīng)該是允許重復(fù)的。舉個例子,訂單編號應(yīng)該是唯一吧。邏輯上是的,可是會存在這樣的情況一張原來的訂單是因為某個原因要求訂單作廢。那好給訂單的狀態(tài)標(biāo)識為"cancel"。然后允許再次錄入同樣編號的訂單。因此。對于這樣的情況下在雖然有效的訂單編號只有一個但在數(shù)據(jù)庫角度會允許編號重復(fù)。所以不管如何還是建議大家為表都建一個沒有任何意義的主鍵如ID。

2.4 是否要采用GUID作為主鍵

很多項目是多級建庫的,經(jīng)常需要數(shù)據(jù)導(dǎo)入、導(dǎo)出、合并很需要一套產(chǎn)生全局唯一主鍵的機制。一種方法是自己設(shè)計一套編碼規(guī)范(類似于身份證、信用卡)最好有一個統(tǒng)一編碼服務(wù)器;第二種方法也是自己產(chǎn)生主鍵為每一個獨立的數(shù)據(jù)庫分配一個NameSpace產(chǎn)生主鍵時前面加上這個NameSpace;最后一種方法就是UUID我想重點討論一下后者。

UUID(Universally Unique Identifier)是通用惟一標(biāo)識符,是128位比特的數(shù)字,用來惟一地標(biāo)識因特網(wǎng)上的某些對象或者實體。UUID是是由開放軟件基金會(OSF)作為分布式計算環(huán)境(DCE)的一部分而制定的標(biāo)準(zhǔn)。UUIDs的目的就是使分布式系統(tǒng)可以不需要重要的中央調(diào)合系統(tǒng)而能唯一地標(biāo)識信息。這樣,任何人能創(chuàng)造一個UUID和使用它來標(biāo)識一些東西,而且,你有足夠的信心來確定這個標(biāo)識是永遠(yuǎn)不會被任何人無意地使用在任何東西上。因此,信息加上了UUID標(biāo)簽就能合并到單個數(shù)據(jù)庫中而不用去解決命名沖突的問題。這個標(biāo)準(zhǔn)的廣泛應(yīng)用在微軟的全球唯一標(biāo)識符(GUIDs)上,GUID實現(xiàn)了這個標(biāo)準(zhǔn)。

用GUID作主鍵有它的優(yōu)勢與不足。優(yōu)勢是GUID具有唯一性,在任何情況下,可以產(chǎn)生全球唯一的值。這是GUID最大的優(yōu)勢,也方便數(shù)據(jù)導(dǎo)入,比如要求從另一個系統(tǒng)中把數(shù)據(jù)導(dǎo)入進來,那么不用擔(dān)心導(dǎo)入時,會導(dǎo)致主鍵沖突。不足是GUID值太復(fù)雜、不易記憶,因為有時難免我們會用記錄的方式來進行記錄判斷。而且數(shù)據(jù)太長,影響數(shù)據(jù)庫效率。GUID的產(chǎn)生不是以一定的次序產(chǎn)生,對于按主鍵物理排序的數(shù)據(jù)庫來說,如果在記錄的前部插入一條記錄,可能會導(dǎo)致后面N次方的數(shù)據(jù)條數(shù)后移。這將導(dǎo)致數(shù)據(jù)插入效率。而且這個值是隨機、無順序的。GUID的值有16個字節(jié),與其它那些諸如4字節(jié)的整數(shù)相比要相對大一些。這意味著如果在數(shù)據(jù)庫中使用unique identifier鍵,可能會帶來兩方面的消極影響,一是存儲空間增大,二是索引時間較慢。因此GUID的采用應(yīng)該要慎重。

3 結(jié)束語

數(shù)據(jù)庫主鍵在數(shù)據(jù)庫中具有重要的地位。主鍵的設(shè)計直接影響到數(shù)據(jù)庫系統(tǒng)的應(yīng)用和效能。數(shù)據(jù)庫主鍵的設(shè)計并沒有定論,因此,我們在設(shè)計主鍵時,因根據(jù)具體應(yīng)用的需要,綜合考慮各方面的因素,考慮數(shù)據(jù)庫的規(guī)模,以及插入、刪除、檢索等操作的頻繁來選擇合適而快捷的數(shù)據(jù)庫主鍵設(shè)計方法,從而達(dá)到優(yōu)化數(shù)據(jù)庫主鍵的目的。

參考文獻(xiàn):

[1] 張云濤.商業(yè)智能的設(shè)計部署與實現(xiàn)[M].北京:電子工業(yè)出版社,2004.

[2] Lou Agosta.The Essential Guide to Data Warehouse [M].北京:人民郵電出版社,2000.11.

[3] 龔小勇.關(guān)系數(shù)據(jù)庫[M].北京:機械工業(yè)出版社,2004.

[4] 薩師煊,王珊.數(shù)據(jù)庫系統(tǒng)概述[M].北京:高等教育出版社,2002.

猜你喜歡
主鍵字段訂單
春節(jié)期間“訂單蔬菜”走俏
基于Go 實現(xiàn)的分布式主鍵系統(tǒng)研究
圖書館中文圖書編目外包數(shù)據(jù)質(zhì)量控制分析
新產(chǎn)品訂單紛至沓來
基于外鍵的E-R圖繪制方法研究
“最確切”的幸福觀感——我們的致富訂單
數(shù)據(jù)庫中表設(shè)計原則分析
怎樣做到日訂單10萬?
CNMARC304字段和314字段責(zé)任附注方式解析
無正題名文獻(xiàn)著錄方法評述
金寨县| 从化市| 门头沟区| 吴江市| 乌拉特前旗| 江阴市| 凤山市| 民勤县| 姜堰市| 昭觉县| 襄垣县| 上饶市| 天全县| 四川省| 清原| 博客| 平遥县| 白山市| 东阳市| 育儿| 图木舒克市| 江山市| 喀喇沁旗| 黄大仙区| 酒泉市| 固始县| 科技| 乐山市| 页游| 枣阳市| 达拉特旗| 甘德县| 莱芜市| 安新县| 合肥市| 西昌市| 张家口市| 龙江县| 普兰店市| 绥芬河市| 定远县|