การเลือกใช้งาน UUID
UUID คืออะไร
ค่าที่ใช้เป็นรหัสอ้างอิงแทน resource ในระบบ โดยหลักในการออกแบบ UUID คือ การสร้างรหัสจะต้องไม่มีตัวกลางในการสร้าง (centralized) เพื่อลดต้นทุนการบริหารจัดการ โดยที่ยังคงไว้ด้วยความสามารถในการสร้างรหัสที่ไม่ซ้ำกันและเก็บไว้ใช้อ้างอิงต่อได้ ซึ่งในเวลาต่อมาก็ได้รับความนิยมนำไปใช้เป็น คียหลัก(PK)ของระบบฐานข้อมูล ตามความต้องการของฐานข้อมูลในปัจจุบันที่เน้นการกระจายศูนย์มากขึ้น
# ตัวอย่าง:
e5c01d00-0cc6-41a9-86ef-91dab8b92219
# 8 ตัว - 4 ตัว - 4 ตัว - 4 ตัว - 12 ตัว
# รวมทั้งหมด 32 ตัว = 128 bits
เวอร์ชันต่างๆ
Spec ของ UUID ในปัจจุบันมีระบุไว้แบบชัดเจนทั้ง 7 เวอร์ชันด้วยกัน โดยในซอฟต์แวร์ปัจจุบัน นิยมใช้เวอร์ชันที่ 4 (UUID 4) เริ่มต้น และใช้เวอร์ชันที่ 7 (UUID 7) ที่พัฒนามาเพื่อให้ทำงานร่วมกับระบบฐานข้อมูลได้ดีขึ้น
# ตัวอย่าง: UUID 4 ()
e07d07cb-afe4-4402-be35-dc431fc02764
# ตัวอย่าง: UUID 7
0193503d-d8d0-7ae0-beca-c005478f5650
# ตัวเลขหลักที่ 13 คือ เลขเวอร์ชัน
เลือกใช้ V4 หรือ V7
UUID 4 ที่ออกมาก่อน ถูกสร้างขึ้นมาโดยไม่ได้คิดเผื่อให้ใช้งานร่วมกับระบบฐานข้อมูล จึงมีปัญหาในเรื่องของการไม่สามารถเรียงตามลำดับก่อน-หลัง (sorting order) ทำให้ไม่สามารถใช้ร่วมกับการทำ index เพื่อค้นหาด้วยโครงสร้างข้อมูลแบบต้นไม้ (Tree) ตามแบบที่ระบบฐานข้อมูลส่วนมากใช้ได้
เวลาต่อมาจึงได้มีการทำ UUID 6 เพื่อปรับปรุงเรื่องของการทำงานร่วมกับระบบฐานข้อมูล แล้วก็ได้ UUID 7 ที่เป็นเวอร์ชันที่อ้างอิงการเรียงลำดับจากการนับเลขนาฬิกาของระบบ Unix (Epoch Time) เพื่อให้สามารถทำงานร่วมกับระบบฐานข้อมูลได้ดี
ก็คือถ้าขึ้นระบบใหม่ให้ใช้ UUID 7 เป็นค่าตั้งต้น
V8
UUID 8 คือ เวอร์ชันที่กำหนดไว้เป็นปลายเปิดให้สามารถเลือกประยุกต์ใช้การกำหนดค่า เพื่อเปิดทางให้สามารถกำหนดการใช้งานได้ยืดหยุ่นมากขึ้นและยังสามารถใช้งานร่วมกับ UUID อื่นได้
ยกตัวอย่าง เช่น รูปแบบ UUID 8 ของ Go library ที่ออกแบบมาให้รองรับการสร้างรหัสที่มีความละเอียดของเวลามากกว่า UUID 7 โดย UUID 7 ที่อ้างอิงการนับเวลาของ UNIX ที่มีความละเอียดระดับ 1 millisecond ให้มีความถี่สูงขึ้นเป็นระดับ 20 microsecond เพื่อให้สามารถสร้างรหัสได้จำนวนมากกว่า ภายในระยะเวลาที่เท่ากัน
ค่าว่างและคู่ตรงข้าม
หากอยากใส่ในระบบว่าข้อมูลนี้เป็น UUID ที่เป็นค่าว่าง ให้ใส่เลข 0 แทนเลขทุกตำแหน่ง
# ระบบฐานข้อมูลนิยมใส่ค่านี้ให้ หากเราเลือกประเภทข้อมูลเป็น UUID แต่ปล่อยว่าง
00000000-0000-0000-0000-000000000000
และหากต้องการมี placeholder เพื่อระบุว่าข้อมูลในส่วนนี้ต้องเป็น UUID ก็อาจจะเลือกใช้ ค่าสูงสุดที่อยู่ตรงข้ามกับค่าว่างแทน
# คู่ตรงข้ามหรือค่าสูงสุด ก็คือ F ที่เป็นค่าสูงสุดของเลขฐาน 16
FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF