Postgresql
PostgreSQL:字元串列上的外鍵
我目前正在重新設計遺留數據庫。其中一個表的主鍵是 a
varchar(254)
。我需要創建一個與之相關的表。例如:
create table "Item" ( "Name" VARCHAR(254) PRIMARY KEY ); CREATE TABLE "Uses" --new table ( id SERIAL PRIMARY KEY NOT NULL, "itemName" VARCHAR(254) NOT NULL, FOREIGN KEY ("itemName") REFERENCES "Item" ("Name") );
我想知道,如果每行Uses都會有對Item表列的引用(記憶體地址) - 這樣就不會複製值。
還是它確實會複製該值,從而導致多餘的空間損失。
還想對使用 VARCHAR 作為主鍵和外鍵有一般意見。也許應該更好地改變舊數據庫以給它一個正確的ID?
非常感謝。
varchar
鑰匙沒問題,但他們確實有一些問題:
varchar``int
s 比s使用更多的空間- 您更有可能必須更新一個
varchar
值而不是一個int
值,從而導致級聯更新- 可能不適用於國際化應用程序(即不同語言的不同值)
要回答您的特定問題,不會有指向該值的指針,實際值將被儲存。
我很少
varchar
在關鍵列中使用 s。char
為了方便起見,有時我會使用 ISO 國家程式碼之類的短列。此外,您可以只使用
text
PostgreSQL 中的類型,作為內部varchar
使用text
。另外,我建議使用不帶引號的蛇案例列名。
如果您的 varchar 的值非常大,並且同時它在“使用”表中大量重複,那麼您的性能將不如使用生成的 int、long 甚至 GUID 類型的鍵的方法。
以下適用:
- 由於 uses 複製了 Item 的主鍵,如果這個鍵很大,則需要更多的磁碟空間。
- 索引建立在用途和項目上,複製大列的值。
- 如果使用另一個鍵,仍然需要項目名稱的索引,以強制唯一性。
- 每個查詢都會執行更多的 IO 來檢索數據。截至 2017 年,這是一個比實際磁碟使用量更大的問題。