ชนิดข้อมูลuuid
เป็นที่ที่ดีที่สุดที่เหมาะสำหรับงาน มีขนาด 16 ไบต์เท่านั้นเมื่อเทียบกับ RAM ขนาด 37 ไบต์สำหรับการเป็นตัวแทน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
- ที่เก้า Quintillion 223 quadrillion 372000000000000 สามสิบหกบางสิ่งบางอย่างพันล้าน ) billions of rows
ค่าแตกต่างกันสำหรับ อาจเป็นความคิดที่ดีในกรณีใด ๆ : 8แทน16ไบต์สำหรับคอลัมน์ FK และดัชนีหลายสิบรายการ!) หรือUUID แบบสุ่มสำหรับความสำคัญมากกว่าหรือระบบกระจาย คุณสามารถจัดเก็บ md5 ที่กล่าวไว้ (เช่นuuid
) เพิ่มเติมเพื่อค้นหาแถวในตารางหลักจากข้อความต้นฉบับได้อย่างรวดเร็ว ที่เกี่ยวข้อง:
สำหรับคำถามของคุณ:
หากต้องการระบุความคิดเห็นของ @ Daniel : หากคุณต้องการตัวแทนที่ไม่มีเครื่องหมายขีดคั่นให้ลบเครื่องหมายขีดคั่นเพื่อแสดง:
SELECT replace('90b7525e-84f6-4850-c2ef-b407fae3f271', '-', '')
แต่ฉันจะไม่รบกวน การเป็นตัวแทนเริ่มต้นนั้นใช้ได้ และปัญหาไม่ใช่การแสดงที่นี่จริง ๆ
หากฝ่ายอื่นควรมีแนวทางที่แตกต่างกันและโยนสายอักขระโดยไม่มีเครื่องหมายขีดคั่นในการผสมนั่นก็ไม่ใช่ปัญหาเช่นกัน Postgres ยอมรับหลายการแสดงข้อความที่เหมาะสมเป็น input uuid
สำหรับ เอกสารประกอบ :
PostgreSQL ยังยอมรับรูปแบบทางเลือกต่อไปนี้สำหรับการป้อนข้อมูล: ใช้ตัวเลขตัวพิมพ์ใหญ่, รูปแบบมาตรฐานที่ล้อมรอบด้วยเครื่องหมายวงเล็บ, ไม่ใส่เครื่องหมายยัติภังค์บางส่วนหรือทั้งหมด, เพิ่มเครื่องหมายขีดคั่นหลังจากกลุ่มสี่หลักใด ๆ ตัวอย่างคือ:
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
จะมีขนาด 20 ไบต์ใน RAM (และ 17 ไบต์บนดิสก์, 24 กับการเติมเต็ม ) เนื่องจากโอเวอร์เฮดภายในvarlena
ซึ่งไม่เอื้ออำนวยต่อขนาดและประสิทธิภาพของดัชนีอย่างง่าย
ทุกอย่างทำงานได้ดีuuid
ที่นี่