Postgresql

電子郵件地址是唯一的還是主鍵?

  • April 12, 2017

我是數據庫的新手。我四處閱讀,發現使用電子郵件地址作為主鍵可能不是一個好主意,因為字元串比較速度較慢,這會影響複雜連接中的性能,如果電子郵件發生更改,我必須更改所有需要大量的外鍵的努力。

但是,如果我的 users 表要求每個使用者都有一個電子郵件地址,並且每個電子郵件地址都應該是唯一的,那麼在電子郵件列上添加唯一索引就足夠了嗎?因為 afaik 唯一欄位允許空值,而我要求每個使用者都有一個電子郵件地址,不允許空值。我在這裡缺少什麼嗎?或者我想使電子郵件列唯一,並確保在伺服器上的數據驗證期間使用者確實輸入了一個電子郵件地址,以便每個使用者都有一個?

讓我們首先區分鍵和索引,鍵是邏輯模型的一部分,並且通常使用唯一索引來實現。但是,您可以在不創建鍵的情況下創建唯一索引,但不能由外鍵引用。

候選鍵是唯一標識表中一行的東西,在 SQL 中,一個候選鍵通常用作主鍵(我從來沒有真正理解為什麼其中一個 ck 被認為比其他的“更好”,但這是另一個story),剩下的 ck 成為唯一約束。

可以像使用主鍵一樣使用唯一約束。考慮:

create table A ( x ... not null
              , y ... not null
              , z ... not null
              ,     unique (x)
              ,     primary key (y,z) );

create table B ( x ...
              ,   ...
              ,     foreign key (x) references A (x) );

create table C ( y ...
              , z ...
              ,   ...
              ,     foreign key (y, z) references A (y, z) );  

B 引用唯一約束,C 引用主鍵約束。

NOT NULL 是另一種約束。在您的情況下,您可以對電子郵件強制執行此操作,而無需聲明它是唯一的。

您文章的下一個方面涉及密鑰的穩定性,密鑰應該是穩定的(但這並不意味著它永遠不會改變,它不必是不可變的)。一些 DBMS 實現了 ON UPDATE CASCADE 可以對此類操作有所幫助,但如果密鑰分佈在您的模型周圍,那麼更新它將會很痛苦。

在您的情況下,我可能會選擇另一個候選鍵作為主鍵,並將電子郵件聲明為 NOT NULL 和 UNIQUE。

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