データ型uuid
はタスクに最適です。用RAMに37のバイトとは対照的に、それだけで16バイトを占有varchar
またはtext
表現。(またはディスク上で33バイトですが、奇数の場合、多くの場合、効果的に40バイトにするためにパディングが必要になります。)uuid
さらに、このタイプにはいくつかの利点があります。
例:
SELECT md5('Store hash for long string, maybe for index?')::uuid AS md5_hash
詳細および詳細説明:
md5の暗号化コンポーネントが不要な場合は、他の(より安価な)ハッシュ関数を検討するかもしれませんが、ユースケース(ほとんど読み取り専用)にはmd5を使用します。
警告の言葉:あなたの場合(immutable once written
)機能的に依存する(擬似自然)PKは問題ありません。しかし、更新が可能な場合には同じことが苦痛になりますtext
。タイプミスを修正することを考えてください:PKおよびすべての依存インデックス、FKカラム、dozens of other tables
および他の参照も変更する必要があります。テーブルとインデックスの膨張、ロックの問題、遅い更新、参照の喪失など
text
通常の操作で変更できる場合は、代理PKの方が適しています。私は、bigserial
列(範囲-9223372036854775808 to +9223372036854775807
-それは9五十二十二三十二三十七二十三兆三十六十六何か十億)の異なる値を提案しますbillions of rows
。どんな場合でも良いアイデアかもしれません:数十のFKカラムとインデックスに対して16バイトではなく8バイト!)または、はるかに大きなカーディナリティまたは分散システム用のランダムUUID。上記のmd5(as )をいつでも追加保存して、元のテキストからメインテーブル内の行をすばやく見つけることができます。関連:uuid
あなたのクエリに関して:
@Danielのコメントに対処するには:ハイフンなしの表現が必要な場合は、表示のためにハイフンを削除します。
SELECT replace('90b7525e-84f6-4850-c2ef-b407fae3f271', '-', '')
しかし、私は気にしません。デフォルトの表現は問題ありません。そして、問題はここの表現ではありません。
他の関係者が異なるアプローチを持ち、ハイフンなしの文字列をミックスにスローする必要がある場合、それも問題ではありません。Postgresは、の入力としていくつかの妥当なテキスト表現を受け入れますuuid
。ドキュメント:
PostgreSQLは、入力に次の代替形式も受け入れます。大文字の数字の使用、中括弧で囲まれた標準形式、一部またはすべてのハイフンの省略、4桁のグループの後にハイフンの追加。例は次のとおりです。
A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}
a0eebc999c0b4ef8bb6d6bb9bd380a11
a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}
さらに、 md5()
関数が戻るとtext
、あなたが使用するdecode()
に変換bytea
し、デフォルトの表現、それは次のとおりです。
SELECT decode(md5('Store hash for long string, maybe for index?'), 'hex')
\220\267R^\204\366HP\302\357\264\007\372\343\362q
encode()
元のテキスト表現を取得するには、もう一度する必要があります。
SELECT encode(my_md5_as_bytea, 'hex');
さらに、内部オーバーヘッドのために、bytea
RAMに20バイト(およびディスクに17バイト、パディングで24バイト)を占有するように格納されている値は、単純なインデックスのサイズとパフォーマンスに特に好ましくありません。varlena
すべてがuuid
ここに有利に働きます。