Postgresql
將整數主鍵轉換為等效字元串是否重要?
在 PostgreSQL 數據庫中,我有一個可排序的
bigint
主鍵,這在可讀性方面有點冗長。我想將其編碼為 base36 或 base64,例如使用
char(n)
. 理論上字節數應該和以前一樣,所以不會佔用更多空間。那是對的嗎?還有其他顧慮嗎?例如排序,整理?
每個DBA.StackExchange答案存在潛在的性能差異和排序差異(取決於排序規則),並且它是連結的答案,例如這個。我強烈建議通讀該答案中引用的所有資訊。
上述連結文章的這些部分特別相關:
這三種類型之間沒有性能差異
$$ char, varchar, text $$…
簡短回答:整數在各個方面都比 varchar 或 text 快。
因此,整數(和 BIGINT)在數據類型中的性能更高,即使是相同的數據長度。
您可以保留
bigint
PK,但出於與使用者互動相關的目的(如果這就是您想要減少值長度的原因),您可以引入一個生成的列,該列將返回一個字元串,該字元串以所需的形式表示您的 PK 值。ALTER TABLE YourTable ADD MyBigintIDInBaseN text GENERATED ALWAYS AS MyDecimalToBaseNConversionFunction(MyBigintID) STORED ;
轉換函式需要是一個自定義函式(因為我不相信 PostgreSQL 會為此任務提供內置函式),標記為
IMMUTABLE
以便可以在生成的列表達式中使用它。這樣,您將繼續在
bigint
內部使用 PK,包括在必要時作為排序標準以及作為其他表的 FK 的參考目標。但是,出於顯示目的,您將使用計算列。如果您的 PK 自定義表示也需要用作查詢參數,那麼最好在計算列上創建索引以提高性能。