Postgresql

PostgreSQL:字元串列上的外鍵

  • December 16, 2017

我目前正在重新設計遺留數據庫。其中一個表的主鍵是 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鑰匙沒問題,但他們確實有一些問題:

  1. varchar``ints 比s使用更多的空間
  2. 您更有可能必須更新一個varchar值而不是一個int值,從而導致級聯更新
  3. 可能不適用於國際化應用程序(即不同語言的不同值)

要回答您的特定問題,不會有指向該值的指針,實際值將被儲存。

我很少varchar在關鍵列中使用 s。char為了方便起見,有時我會使用 ISO 國家程式碼之類的短列。

此外,您可以只使用textPostgreSQL 中的類型,作為內部varchar使用text。另外,我建議使用不帶引號的蛇案例列名。

如果您的 varchar 的值非常大,並且同時它在“使用”表中大量重複,那麼您的性能將不如使用生成的 int、long 甚至 GUID 類型的鍵的方法。

以下適用:

  • 由於 uses 複製了 Item 的主鍵,如果這個鍵很大,則需要更多的磁碟空間。
  • 索引建立在用途和項目上,複製大列的值。
  • 如果使用另一個鍵,仍然需要項目名稱的索引,以強制唯一性。
  • 每個查詢都會執行更多的 IO 來檢索數據。截至 2017 年,這是一個比實際磁碟使用量更大的問題。

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