国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

關于關系數據庫主鍵的討論

2024-07-21 02:36:57
字體:
來源:轉載
供稿:網友

  從定義上講,一個關系數據庫必須包含規則化的表,并且每一表都包含一個主鍵。數據庫開發人員通常都不贊同使用無意義的數值作為一個表的主鍵。在技術上而言,這沒有對與錯之分——這只是一種意見。然而,我們卻強烈建議從無意義的數值建立主鍵,即我們使之作為代理鍵。 在本文中,我們將討論代理鍵的強大功能和自然鍵的固有缺欠。
  
  主鍵的定義
   
  
  在討論之前,我們將定義一下主鍵(PRimary key)一詞。一個主鍵是唯一識別一個表的每一記錄,但這只是其作用的一部分,主鍵的主要作用是將記錄和存放在其他表中的數據進行關聯。在這一點上,主鍵是不同表中各記錄之間的簡單指針。所以,主鍵的值對用戶而言是沒有什么意義,并且和它要賦予的值也沒有什么非凡的聯系。
  
  當從每一表中選擇一個主鍵時,開發人員必須遵循以下的幾條規則:
  
  主鍵必須唯一的識別每一記錄。
  一個記錄的主鍵不能為空。
  當生成記錄時,主鍵的值必須存在。
  主鍵必須保持穩定——你不能更改主鍵的域。
  主鍵必須簡潔,不要包含過分的屬性。
  主鍵的值不能改變。
  請注重到,以上列表中的“必須”不是“可能”或者“絕大多數情況下” ——“必須”是絕對的,但這并不意味著你不能打破這一規則。假如你要打破這一規則,只是意味著你的程序不能和關系數據庫進行連接。對于關系數據庫模型、主鍵、標準化等方面的更多的信息,請訪問以下的網站:
  
  Database Normalization – Definitions(關系數據庫標準化——定義)
  The University of Texas at Austin
  自然鍵違反了規則
  現在讓我們看看自然鍵如何違反以上的規則。為了執行關系數據庫規則,一個表不能包含多個記錄,這就意味著一個屬性必須也只能唯一的識別一個記錄。假設一個表存放職工信息,包括職工的名字,出生日期,社會保險號,以及雇用的日期。對于每一個職工都只有一個記錄與之對應。
  
  最初的,職工名字是自然主鍵最合適的候選,但是讓我們作深入的研究。在開始建立數據庫時,你不能等到知道職工名字才建立一個記錄,因為自然主鍵不能為空。所以,只有知道職工的正確名字后,你才能輸入職工的所有信息。
  
  主鍵答應包含多個域,所以單獨的存儲姓和名都不是問題。然而,一個公司的職工名字可能有相同的,這一方法即不成立。只要公司里有相同名字,主鍵就會擴展為至少有三個域,這樣你會發覺違反了規則。
  
  糾正錯誤
  現在讓我們把以上的例子復雜化。假設你輸入的名字有錯誤。起初,這看起來并不是一個很重要的錯誤,你只要修改錯誤的值就可以了。但是請注重,你是不答應修改主鍵的值。而且這樣做也通常會破壞程序的完整性。可以這樣,可以更新主鍵的值,數據引擎即會自動的更新相關的值,但這一方法對于一個新手顯然是不合適的。
  
  在我們的范例中,修正一個拼寫錯誤的名字也不會有太多的反應。但假如主鍵與一個購買順序號相關聯,當主鍵的輸入值有錯誤時,相關聯的購買順序號的值也會出現混亂,這對程序的完整性有很大的影響。
  代理鍵能遵循規則
   
  
  顯然,使用自然鍵作為主鍵會產生很多問題。現在將一個遞增的值作為職工表的主鍵,然后看看結果會是怎么樣。最重要的是,遞增值必須是唯一的。由于系統能夠自動生成這一遞增值,可以避免了數據的輸入錯誤。除此之外,當記錄有輸入時遞增值一定會存在,所以主鍵一定不會為空。
  
  一個代理鍵是不會改變的,而且只依靠于一個域,所以它非凡的簡潔。自動遞增的域提供了一個唯一的,穩定的,簡潔的主鍵。
  
  其他的爭論
  很多數據庫開發系統把唯一的索引應用到主鍵,這就消除了多個記錄——因為系統不能接受多個記錄。然而,你可以人為的使用一個唯一的索引,而不需要將一個主鍵作為一個索引。人為處理會消耗更多的資源。
  
  一些開發人員認為主鍵應該識別相關的記錄,也就是說,用戶應該識別值為“Jane Smith”的主鍵與職工Jane Smith的記錄相關聯。假如值為“Jane Smith”的主鍵沒有什么意義,比如只是一個遞增的值,這就與職工Jane Smith的信息毫無關系。事實是這樣的,沒有什么規則確保主鍵值與記錄有什么關聯。
  
  在一個設計合理的數據庫中,用戶是無法看到主鍵的值。實際上,用戶也不需要知道主鍵是否存在,有時候主鍵對用戶沒有什么用處。代理鍵運行得很好,因為數值與記錄之間存在isno的關系。
  
  自然鍵與代理鍵的比較
  當把這兩種主鍵一一作比較,自然主鍵將會處于劣勢,如表A所示。數據還是數據,數據不會成為系統的指針,因為這些選項不能受開發人員所控制,在程序中或系統自生成的鍵都是穩定的,它們也不能為空值。
  
  表 A
  關于關系數據庫主鍵的討論
  對于數據庫開發人員來說最重要的是在于良好的設計。為了避免出現程序開發之后的錯誤和過多的修補,我們建議采用代理鍵。這一簡單的方法將為你在程序開發中提供堅固的,穩定的,靈活的基礎。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 花垣县| 黑龙江省| 彭阳县| 天水市| 台南县| 云梦县| 石首市| 抚松县| 宜章县| 金塔县| 繁昌县| 福鼎市| 辉南县| 唐山市| 尼勒克县| 鄂州市| 庆云县| 乌兰察布市| 涪陵区| 建阳市| 红河县| 高淳县| 黄龙县| 安义县| 三亚市| 鸡西市| 五莲县| 贵州省| 龙井市| 四子王旗| 获嘉县| 凤阳县| 南城县| 城步| 普定县| 东乌珠穆沁旗| 南投市| 额敏县| 思南县| 寿光市| 金山区|