Postgresql

我是否應該呼叫我的 UUID 主鍵列 ID?

  • April 26, 2022

我正在研究一個廣泛使用UUIDs的數據庫設計PRIMARY KEY。然而,這讓我面臨一個非常重要的選擇。如何命名這些列?我會稱它們為uuid,除了UUID作為標識符,我必須在任何地方引用欄位名稱:

CREATE TABLE thingie (
 "uuid" UUID PRIMARY KEY DEFAULT public.gen_random.uuid(),
 foo VARCHAR,
 bar VARCHAR,
);

一個直接的替代方法似乎是改為呼叫這些列id

CREATE TABLE thingie (
 id UUID PRIMARY KEY DEFAULT public.gen_random.uuid(),
 foo VARCHAR,
 bar VARCHAR,
);

這樣一來,我就沒有列名,從語義上我可以爭辯說 UUID 確實是一種 ID;在維恩圖中,UUID 圓圈將完全放在 ID 圓圈中。

然而,我(我相信還有很多其他人)已經習慣於id與自動遞增INTEGER列關聯,以至於我害怕通過呼叫這些 ID 來打破某種潛規則id

如果你能用一些堅實的自行車脫落來消除我的困惑,我將非常感激。事實上,我的問題是:你會如何呼叫你的UUID-typed 代理鍵,為什麼?

除了代理鍵是每一行的唯一標識符這一事實之外,您不應將其賦予意義,因為從架構設計的角度來看,它採用何種格式並不重要。那時你應該關心的是它是一個標識某物的值,所以我堅持稱它們為ID⁰。

事實上,你擁有 UUID 的東西,除非你有一個大腦放屁並將它們儲存為字元串¹,否則實際上一個大整數。您無法對其進行算術運算³,但引擎認為它與BIGINT用作密鑰的更大的沒有任何不同。

另一個普遍的事情是我盡量避免任何可能是關鍵字的名稱(對於列、表、函式、過程……),因此需要轉義。uuid如果打電話給他們的主要觀點id還不夠,這是反對打電話給他們的觀點。當然這不可能是完美的,我會避免uuid,因為我知道它是 Postgres 中的類型名稱,但到目前為止只使用過 SQL Server 的開發人員可能不知道,因為它不是保留字(甚至一個類型名稱)在那裡,我很可能會使用在其他地方不可移植的詞。

如果由於與使用其他系統的其他系統集成而有效地儲存了多個代理鍵,那麼您的內部標識符就是id. 就您的系統而言,其他數據是有意義的真實數據,而不是真正的代理鍵,並且應該以描述其內容或用途的方式命名。現實世界的範例包括 ISBN、StaffReferenceNumber/SRN、IRN、PPN ……,但您也可能有一些不太通用的東西,例如 SalesForceId 或 JoesPartStoreId。即使您在這些情況下沒有定義代理鍵⁴,也要保留有意義的名稱,而不是id讓您的規則很明顯可能無法控制它們的生成和使用。

$$ 0 $$或 id 或 Id,與您在其他地方遵循的大小寫規則保持一致,以防您的內容最終以區分大小寫的方式解釋。

$$ 1 $$我仍然維護著一個在二十年前犯過這個錯誤的遺留系統,比我早一點。這一切都有效,但當然存在儲存大小和性能“注意事項”,有趣的錯誤²會導致無效的 UUID 值,例如出現空字元串。

$$ 2 $$我還把過去的壞同事,包括多年前幾次搞砸的年輕大衛斯皮萊特,算作業務中的錯誤!

$$ 3 $$好吧,如果你足夠努力的話,你可以,但不是使用任何內置函式。

$$ 4 $$無論如何,在這些情況下,我總是有一個代理鍵。這意味著只有您的錯誤可能會導致重複鍵或需要影響許多外鍵的昂貴的主鍵值更改等問題,而不是感激處理其他系統的錯誤。

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