Veri türü uuid
olan mükemmel görev için uygundur. RAM'de temsil varchar
veya text
temsil için 37 byte'a karşılık yalnızca 16 byte kaplar . (Veya diskte 33 bayt, ancak tek sayı, etkili bir şekilde 40 bayt yapmak için çoğu durumda doldurmayı gerektirir .) Ve uuid
türün biraz daha avantajları vardır.
Örnek:
SELECT md5('Store hash for long string, maybe for index?')::uuid AS md5_hash
Ayrıntılar ve daha fazla açıklama:
Eğer md5'in kriptografik bileşenine ihtiyacınız yoksa, diğer (daha ucuz) karma fonksiyonları düşünebilirsiniz, ancak kullanım durumunuz için md5 ile giderdim (çoğunlukla salt okunur).
Bir uyarı : Davanız için ( immutable once written
) işlevsel olarak bağımlı (sözde doğal) bir PK iyidir. Ancak aynı şey güncellemelerin mümkün olduğu bir acı olacaktır text
. Bir yazım hatası düzeltmeyi düşünün: PK ve tüm bağımlı dizinler, FK sütunları dozens of other tables
ve diğer referanslar da değişmek zorunda kalacak. Tablo ve dizin şişirme, kilitleme sorunları, yavaş güncellemeler, kaybedilen referanslar, ...
Eğer text
normal çalışma içinde değiştirebilir, bir vekil PK daha iyi bir seçim olacaktır. Ben bir bigserial
sütun (aralık -9223372036854775808 to +9223372036854775807
- bu dokuz beş milyon iki yüz yirmi üç katrilyon üç yüz yetmiş iki trilyon otuz altı şey milyar bir ) öneririm billions of rows
. Her durumda iyi bir fikir olabilir : düzinelerce FK sütun ve dizin için 16 bayt yerine 8 !). Veya çok daha büyük kardinaliteler veya dağıtılmış sistemler için rastgele bir UUID . Ana tablodaki satırları orijinal metinden hızlı bir şekilde bulmak için her zaman sözü edilen md5'i (as ) da ek olarak saklayabilirsiniz . İlgili:uuid
Sorgunuz gelince :
@ Daniel'ın yorumuna hitap etmek için : Tiresiz bir temsili tercih ederseniz, ekran için tireleri kaldırın:
SELECT replace('90b7525e-84f6-4850-c2ef-b407fae3f271', '-', '')
Ama canını sıkmazdım. Varsayılan gösterim gayet iyi. Ve sorun gerçekten burada temsil değil.
Diğer tarafların farklı bir yaklaşıma sahip olmaları ve karışıma tire koymadan dizeleri atmaları gerekiyorsa, bu da sorun olmaz. Postgres'ler, a için girdi olarak birkaç makul metin gösterimini kabul eder uuid
. Belgeler :
PostgreSQL ayrıca girdi için aşağıdaki alternatif formları da kabul eder: büyük harfli rakamların kullanılması, parantezlerle çevrili standart format, kısa veya küçük tire, ihmal, dört basamaklı herhangi bir gruptan sonra tire eklemek. Örnekler:
A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}
a0eebc999c0b4ef8bb6d6bb9bd380a11
a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}
Dahası, md5()
fonksiyon döner text
şunları kullanırsınız decode()
dönüştürmek bytea
ve varsayılan gösterimi şu geçerli:
SELECT decode(md5('Store hash for long string, maybe for index?'), 'hex')
\220\267R^\204\366HP\302\357\264\007\372\343\362q
encode()
Orijinal metin sunumunu almak için tekrar yapmanız gerekir :
SELECT encode(my_md5_as_bytea, 'hex');
Baştan sona , özellikle basit indekslerin boyut ve performansı için elverişsiz olan iç yük nedeniyle bytea
RAM'de 20 bayt (ve diskte 17 bayt, dolgulu 24 bayt) kaplayacak şekilde depolanır .varlena
Her şeyuuid
burada bir lehine çalışıyor .