簡體   English   中英

表只有一列或添加數字主鍵?

[英]Table with only one column or add a numeric primary key?

假設我需要一個帶有帳號ID的簡單表,而不需要其他信息。 有兩種方法可以做到:

id varchar(255) PRIMARY KEY

或者添加數字主鍵:

id int PRIMARY KEY
accountId varchar(255) UNIQUE NOT NULL

這兩種方法有哪些優點/缺點,您可以選擇哪種方法?為什么?

第一個解決方案對可維護性有什么影響(如果我們需要更改單行的id)和性能?

這歸結為數據庫世界中的替代關鍵自然關鍵爭論。 例如,請參見此處此處此處有關該主題的文本。 我認為這兩個選項都是有效的,但在這種情況下,我會選擇AccountID作為自然鍵(假設AccountID對於每個帳戶都是唯一的,不會為空,並且不會受到更改),因為這意味着更少的開銷。 在這種情況下,我沒有看到代理鍵的附加值。

自然鍵:

  • 對用戶有意義
  • 在需要時很難改變
  • 可能導致在查詢中需要較少的連接

代理鍵:

  • 對用戶沒有任何意義
  • 不受更改
  • 可能導致在查詢中需要更多聯接
  • 可能需要額外或更大的索引

區別在於PRIMARY KEY約束意味着/強制執行NOT NULL CONSTRAINT。 在第一個示例中, varchar(255)將被有效地提升為varchar(255) NOT NULL

DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;

CREATE TABLE pk
        ( id varchar(255) PRIMARY KEY
        );

CREATE TABLE uniq
        ( id int PRIMARY KEY
        , accountid varchar(255) UNIQUE
        );

INSERT INTO pk (id) VALUES(NULL);
INSERT INTO uniq (id, accountid) VALUES(1, NULL);

結果:

DROP SCHEMA
CREATE SCHEMA
SET
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "pk_pkey" for table "pk"
CREATE TABLE
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "uniq_pkey" for table "uniq"
NOTICE:  CREATE TABLE / UNIQUE will create implicit index "uniq_accountid_key" for table "uniq"
CREATE TABLE
ERROR:  null value in column "id" violates not-null constraint
INSERT 0 1

由於PK( - >> NOT NULL)約束,第一個插入失敗; 第二個成功。

如果該列的內容是唯一的(這似乎是ID的情況),則繼續使其成為主鍵,否則創建另一個數字列作為主鍵。

問候,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM