在關係數據庫中使用數字主鍵有什麼好處?
關係數據庫系統中的許多表(以我公認的有限經驗)具有這種結構(Oracle 語法,因為那是我習慣的):
create table widgets ( widget_id number primary key, widget_name varchar2(20) not null, widget_colour varchar2(10) ); create unique index ix01_widgets on table widgets (widget_name);
所以有兩個索引:一個用於主鍵,
widget_id
一個用於widget_name
.誰能解釋使用數字主鍵而不是僅用
widget_name
作主鍵的優勢?後者的優點是使子表的內容更具可讀性,例如:create table widget_characteristics ( widget_name varchar2(20) not null, characteristic_name varchar2(20) not null, characteristic_value varchar2(100), constraint pk_widget_characteristics primary key (widget_name, characteristic_name), constraint fk01_widget_characteristics foreign key (widget_name) references widgets (widget_name) );
否則(如果使用生成的數字主鍵)我需要創建視圖來查看非規範化數據。
是關於數字與字元串的“可索引性”嗎?如果標識符(即)很長,我可以理解索引大小的問題
widget_name
,但如果它很短,那麼這仍然是一個問題嗎?對於具有多列主鍵的表,我可以理解生成數字 PK 的邏輯,但對於“簡單”表,我不清楚。鑑於數字主鍵無處不在,我認為這是有一個根本原因:我只是不確定它是什麼!
當然,尺寸是一個考慮因素。不僅要考慮表中索引的大小
widgets
,還要考慮主鍵在其他表中顯示為外鍵。在某些系統中,即使是短字元串也會比整數佔用更多空間(例如,MSSQL:VARCHAR 是每個字元一個字節加上 2 個字節,因此只有兩個字元就已經和整數一樣大了)。我見過的幾乎所有數字主鍵都是代理鍵,通過序列、序列、auto_increment、IDENTITY 或任何數據庫引擎的本機方法用於生成值本身來實現。我懷疑這是數字主鍵無處不在的主要原因。代理鍵的一個優點是它們沒有商業意義。由於業務含義會隨著時間而改變,因此使用沒有業務含義的鍵有助於確保主鍵是靜態的。
如果您的小元件具有某種行業標準標識符(例如汽車行業的 VIN、出版業的 ISBN、UPC 等),那麼這可能是您主鍵的最佳選擇。我在使用時擔心的
widget_name
是該屬性的不變性。它會改變嗎?你怎麼知道它永遠不會改變——銷售告訴你了嗎?:)整個替代與自然關鍵問題幾乎是一場宗教辯論,並且與您的問題有些相切。我會說,如果您有一個靜態、最小且唯一的自然鍵,請使用它。否則,請考慮使用代理鍵(可能是數字)。