Database-Design

在關係數據庫中使用數字主鍵有什麼好處?

  • May 31, 2014

關係數據庫系統中的許多表(以我公認的有限經驗)具有這種結構(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是該屬性的不變性。它會改變嗎?你怎麼知道它永遠不會改變——銷售告訴你了嗎?:)

整個替代與自然關鍵問題幾乎是一場宗教辯論,並且與您的問題有些相切。我會說,如果您有一個靜態、最小且唯一的自然鍵,請使用它。否則,請考慮使用代理鍵(可能是數字)。

引用自:https://dba.stackexchange.com/questions/66318