Postgresql

將整數主鍵轉換為等效字元串是否重要?

  • January 4, 2021

在 PostgreSQL 數據庫中,我有一個可排序的bigint主鍵,這在可讀性方面有點冗長。

我想將其編碼為 base36 或 base64,例如使用char(n). 理論上字節數應該和以前一樣,所以不會佔用更多空間。那是對的嗎?

還有其他顧慮嗎?例如排序,整理?

每個DBA.StackExchange答案存在潛在的性能差異和排序差異(取決於排序規則),並且它是連結的答案,例如這個。我強烈建議通讀該答案中引用的所有資訊。

上述連結文章的這些部分特別相關:

這三種類型之間沒有性能差異

$$ char, varchar, text $$…

簡短回答:整數在各個方面都比 varchar 或 text 快。

因此,整數(和 BIGINT)在數據類型中的性能更高,即使是相同的數據長度。

您可以保留bigintPK,但出於與使用者互動相關的目的(如果這就是您想要減少值長度的原因),您可以引入一個生成的列,該列將返回一個字元串,該字元串以所需的形式表示您的 PK 值。

ALTER TABLE
 YourTable
ADD
 MyBigintIDInBaseN text
 GENERATED ALWAYS AS MyDecimalToBaseNConversionFunction(MyBigintID) STORED
;

轉換函式需要是一個自定義函式(因為我不相信 PostgreSQL 會為此任務提供內置函式),標記為IMMUTABLE以便可以在生成的列表達式中使用它。

這樣,您將繼續在bigint內部使用 PK,包括在必要時作為排序標準以及作為其他表的 FK 的參考目標。但是,出於顯示目的,您將使用計算列。

如果您的 PK 自定義表示也需要用作查詢參數,那麼最好在計算列上創建索引以提高性能。

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