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

?

數(shù)據(jù)庫主鍵設(shè)置探討

2013-06-25 08:45劉敏
關(guān)鍵詞:數(shù)據(jù)庫

劉敏

【摘 要】數(shù)據(jù)庫應(yīng)用程序涉及到計算機軟件應(yīng)用的方方面面,很多人在開發(fā)數(shù)據(jù)庫應(yīng)用程序時受到數(shù)據(jù)庫表主鍵設(shè)置的影響,導(dǎo)致開發(fā)過程遇到不少的麻煩,本文就關(guān)系型數(shù)據(jù)庫的表主鍵設(shè)置的必要性、類型、策略等方面作出探討。

【關(guān)鍵詞】數(shù)據(jù)庫 主鍵 主鍵設(shè)置策略

【中圖分類號】TP3 【文獻標(biāo)識碼】A 【文章編號】1672-5158(2013)03-0122-02

“工欲善其事,必先利其器”這句話表明工具的重要性,其實也反映了在一個工程項目中基礎(chǔ)工作的重要性。同樣,在關(guān)系型數(shù)據(jù)庫應(yīng)用程序開發(fā)中,我們首先要解決的問題就是數(shù)據(jù)庫的設(shè)計,而其中表主鍵設(shè)置的好壞更是決定著程序設(shè)計的方便性及效率性,它是一個繞不開的問題。

一、主鍵的必要性

有些人在設(shè)計數(shù)據(jù)庫時糾結(jié)要不要設(shè)置主鍵,那就先讓我們理清以下兩點:

1.什么是主鍵

主鍵,又稱主碼。數(shù)據(jù)庫表中對儲存數(shù)據(jù)對象予以唯一和完整標(biāo)識的數(shù)據(jù)列或?qū)傩缘慕M合。一個數(shù)據(jù)列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。

2.主鍵的必要性

從主鍵的定義可以看出,主鍵可以唯一標(biāo)識一行記錄,所以可以確保執(zhí)行數(shù)據(jù)更新、刪除的時候不會出現(xiàn)重復(fù)及張冠李戴的錯誤。另外主鍵的值不能為空,主鍵往往與外鍵共同作用,用以保證數(shù)據(jù)表信息的完整性。而且這些限制可以通過數(shù)據(jù)庫系統(tǒng)做到,不需要另外編寫程序來完成,所以為表設(shè)置相應(yīng)的主鍵是必要的。

二、自然鍵還是代理鍵好

有些人會告訴你,你應(yīng)該使用自然鍵來作主鍵,也有人說你應(yīng)該總是使用代理鍵作主鍵,所以首先要確定用自然鍵還是用代理鍵來作主鍵的問題?,F(xiàn)實的情況是,自然鍵和代理鍵有各自的優(yōu)點和缺點,并且沒有哪一種是完美的,換句話說,你要根據(jù)你自己在軟件設(shè)計中的需求來選擇。

1.自然鍵

自然鍵也叫業(yè)務(wù)主鍵。在數(shù)據(jù)庫表中把具有業(yè)務(wù)邏輯含義的字段作為主鍵,稱為“自然主鍵(Natural Key)”。自然鍵,這是一個主鍵的屬性,它也往往是實體的一個現(xiàn)實中存在的屬性,它的好處是,它們已經(jīng)存在,你并不需要另外引入一個新的“非自然”值到你的數(shù)據(jù)架構(gòu)中,而且這種主鍵見名識義;另外用戶通常都是對業(yè)務(wù)相關(guān)的字段進行查找(比如員工的工號,書本的 ISBN No. ),自然鍵能夠?qū)崿F(xiàn)聚集存放,對于索引及查找的效率是比較高的。

它的缺點也是來自它的業(yè)務(wù)含義,這種主鍵信息能有效地耦合到數(shù)據(jù)庫中,業(yè)務(wù)主鍵一旦改變則系統(tǒng)中關(guān)聯(lián)該主鍵的部分的修改將會是不可避免的,并且引用越多改動越大,例如:學(xué)生退學(xué),記錄刪除,學(xué)生又回來復(fù)讀,要用回以前的學(xué)號;又如原來學(xué)號是數(shù)字型的,現(xiàn)決定改為字符型,你首先必需修改學(xué)生基本信息表中“學(xué)號”的數(shù)據(jù)類型,然后還要修改所有關(guān)聯(lián)表中的外鍵數(shù)據(jù)類型,所以對于以后可能要變動的屬性作為主鍵,對于眾多關(guān)聯(lián)表來說維護起來十分麻,畢競沒有任何一個業(yè)務(wù)是永遠不變的。

2.代理鍵

代理鍵也叫邏輯主鍵。在數(shù)據(jù)庫表中采用一個與當(dāng)前表中邏輯信息無關(guān)的字段作為其主鍵,稱為“代理主鍵”。它是引入一個新的數(shù)據(jù)項作為主鍵,這是一個沒有業(yè)務(wù)含義的主鍵。例如在學(xué)生基本情況表中,我們新增一數(shù)據(jù)項studentID,它不是學(xué)生的學(xué)號,在這種情況下,學(xué)生學(xué)號已經(jīng)成為一項非鍵列。

代理鍵強調(diào)主鍵不應(yīng)該具有實際的意義,它剛好與自然鍵是的定義相反,例如訂單表中的“訂單編號”字段,而這個字段符合自然鍵的定義,它在訂單信息表中具有唯一性,能夠唯一標(biāo)識記錄,但是不建議用“訂單編號”字段作為主鍵的,因為具有實際意義的字段,具有“意義更改”的可能性?,F(xiàn)實情況是,原先輸入某一訂單,后來因某一原因該訂單作廢,并重新生成訂單,而且訂單號要保持原訂單號一致,這樣原來的主鍵就面臨危險了。代理鍵的好處是對于數(shù)據(jù)表的維護處理方便,當(dāng)要增加記錄時,生成代理鍵的值是一個新的鍵值,與原有數(shù)據(jù)不存在沖突問題。當(dāng)然,缺點是,這種主鍵在一定程度增加了表的復(fù)雜度。

相比代理鍵而言,使用業(yè)務(wù)主鍵的主要原因或好處是,增加邏輯主鍵就是增加了一個業(yè)務(wù)無關(guān)的字段,而用戶通常都是對于業(yè)務(wù)相關(guān)的字段進行查找(比如員工的工號,書本的 ISBN No. ),這樣我們除了為邏輯主鍵加索引,還必須為這些業(yè)務(wù)字段加索引,這樣數(shù)據(jù)庫的性能就會下降,而且也增加了存儲空間的開銷。所以對于業(yè)務(wù)上確實不常改變的基礎(chǔ)數(shù)據(jù)而言,使用業(yè)務(wù)主鍵不失是一個比較好的選擇。

因此,使用自然鍵還是代理鍵,主要取決于系統(tǒng)規(guī)模的大小及日后的變動性,對于小項目,以后擴展不會很大的話,也允許用實際唯一的字段作主鍵的,否則,使用代理鍵更利于適應(yīng)未來不確定的變化。

三、采用單列鍵還是復(fù)合鍵作為主鍵

所謂復(fù)合主鍵即聯(lián)合主鍵,是通過兩個或者多個字段的組合作為主鍵。

使用復(fù)合主鍵的主要原因和使用業(yè)務(wù)主鍵是相關(guān)的,在業(yè)務(wù)主鍵只使用一個字段不能解決問題情況下,那就只能使用多個字段了。例如在學(xué)生成績管理系統(tǒng)中,有幾個表分別是學(xué)生(學(xué)號,姓名,…)、課程(課程編號,課程名稱,…),學(xué)生成績(學(xué)號,課程編號,學(xué)期號,…),在學(xué)生成績表中使用學(xué)號不夠用了,要加上課程號,另外還要加上學(xué)期號(可能存在同一課程兩個學(xué)期開設(shè)情況)。這種使用復(fù)合主鍵方式存著在幾點弊端:

1.數(shù)據(jù)存儲冗余:隨著這種主從關(guān)系的延伸,必然導(dǎo)致數(shù)據(jù)庫中需要重復(fù)存儲的數(shù)據(jù)變大,當(dāng)主表本身就是復(fù)合主鍵時,關(guān)聯(lián)的從表中要重新存儲該主鍵字段一次,存在多級關(guān)聯(lián)時就更明顯。原因是:復(fù)合主鍵導(dǎo)致不良的外鍵。

2.SQL命令復(fù)雜化及效率降低:當(dāng)存在復(fù)合主鍵時,SQL語句長度增加;同時,聯(lián)合主鍵自動生成聯(lián)合索引,需要將主表的多個字段與子表的多個字段關(guān)聯(lián)以獲取滿足某些條件的所有詳細情況記錄。

3.程序復(fù)雜度增加:需要設(shè)置及傳遞多個參數(shù)。

使用復(fù)合鍵的人通常有兩個理由為自己開脫,而這兩個理由都是錯誤的。其一是主鍵應(yīng)當(dāng)具有實際意義,然而,讓主鍵具有意義只不過是給人為地破壞數(shù)據(jù)庫提供了方便。其二是利用這種方法可以在描述多對多關(guān)系的連接表中使用兩個外部鍵來作為主鍵。

由此可見,單列主鍵還是比較簡單的,特別是對于提高連接和篩選操作的效率而言有優(yōu)勢。

四、幾種主鍵策略的選擇

主鍵設(shè)置存在多種策略可以選擇,我們可以對比下幾種常用策略的優(yōu)缺點,以利于我們做出選擇。

1.編號作主鍵

此方法就是采用實際業(yè)務(wù)中的唯一字段的“編號”作為主鍵設(shè)計,也就是自然鍵方式,在各種實體信息中都存在相應(yīng)編號,如學(xué)生編號,公民身份證編號,員工編號等,在小型的項目中是推薦這樣做的,因為可以使項目比較簡單化,但在使用中隱含一些麻煩,它的缺點存在兩個方面:

—當(dāng)業(yè)務(wù)要求編號可以重復(fù)時造成存儲不了的情況

對涉及編號數(shù)據(jù)定義改變時需要大量修改關(guān)聯(lián)表引用的外鍵的定義這個問題在上面自然鍵中已作出說明。

2.自動編號主鍵

這種方法就是新建一個ID字段,自動增長,眾多數(shù)據(jù)庫系統(tǒng)都可以定義自動增長型主鍵,方便且滿足主鍵的原則。優(yōu)缺點如下:(下轉(zhuǎn)59頁)

■系統(tǒng)集成問題

由于主鍵生成脫離了系統(tǒng)中的自動生成方法,在與其他系統(tǒng)集成時,很難保證自制表中的最大值與導(dǎo)入后的保持一致。在導(dǎo)入時,為了區(qū)分新老數(shù)據(jù),可能會在老數(shù)據(jù)主鍵前統(tǒng)一加一個“o”(old)來表示這是老數(shù)據(jù),但又會遇到數(shù)字型問題。解決辦法是,在“自制加一”中把主鍵設(shè)為字符型的,字符型主鍵可以應(yīng)付很多我們意想不到的情況。

五、GUID主鍵

采用GUID主鍵,優(yōu)點是:主鍵值可以自動生成,也可以程序生成,GUID具有唯一性,在任何情況下,可以產(chǎn)生全球唯一的值。當(dāng)要求從另一個系統(tǒng)中導(dǎo)入數(shù)據(jù),鍵值不可能重復(fù),可以解決系統(tǒng)集成問題。缺點是:GUID值太復(fù)雜,不易記憶,而且數(shù)據(jù)太長,影響數(shù)據(jù)庫效率及增加存儲空間。

小結(jié):

由此可見,主鍵的設(shè)置沒有固定方式,選擇什么樣的主鍵原則還是要根據(jù)項目的情況:項目的大小,項目的擴展情況,項目的數(shù)據(jù)系統(tǒng)的合并或變更情況,主要原則是考慮數(shù)據(jù)處理的方便性及效率性。

猜你喜歡
數(shù)據(jù)庫
Designer測試大數(shù)據(jù)預(yù)定義均衡配置
MemSQL獲3000萬美元D輪融
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
SQL語言在電信業(yè)務(wù)數(shù)據(jù)庫數(shù)據(jù)查詢中的應(yīng)用
數(shù)據(jù)庫
武川县| 桃源县| 明星| 齐河县| 于都县| 米脂县| 册亨县| 井冈山市| 洮南市| 布尔津县| 许昌市| 泾阳县| 清河县| 长春市| 来宾市| 靖州| 民和| 辽宁省| 宁海县| 金山区| 嘉定区| 林口县| 海林市| 洪洞县| 伊金霍洛旗| 正定县| 崇州市| 法库县| 遂溪县| 锡林浩特市| 新平| 上饶县| 雅江县| 乐平市| 石屏县| 桂平市| 龙胜| 定襄县| 邢台县| 托克托县| 灵石县|