สิ่งหนึ่งที่น่าสนใจของการพัฒนาระบบงานคือ
เรื่องของ Unique Id หรือ id ของ object ต่าง ๆ ที่ไม่ซ้ำ
เพื่อระบุถึง object นั้น ๆ ในระบบงาน
ยกตัวอย่างเช่น

  • user id
  • transaction id
  • order id
  • short url

คำถามคือ เรามีวิธีการสร้าง unique id กันอย่างไรบ้าง
ดังนั้นลองจดสรุปสิ่งที่เคยทำมาบ้างไว้นิดหน่อย
มาเริ่มกันเลย

วิธีที่ง่ายที่สุด คือ ใช้ id จาก table ของ database ไปเลย

เช่น

  • sequence, auto increment จาก RDBMD (อย่าดึงมาแล้วเอามาบวก 1 ใน code ละครับ เดี๋ยวชน)
  • UUID หรือ Object Id ของ document ใน MongoDB

ต่อมามีความต้องการเพิ่มเติมว่า unique id นั้นต้อง readable
หรืออ่านแล้วตีความได้ง่าย
เพื่อนำไปใช้งานต่อไปทางด้าน operation

เช่น order id
ต้องการให้รู้ว่า order สร้างวันไหน เวลาอะไร ดังนั้นต้องเป็น timestamp หรือ date ที่มี format
แต่อาจจะเกิดการซ้ำได้ ถ้ามีคนเข้ามาสร้าง order พร้อม ๆ กัน
ดังนั้นต้องเพิ่ม sequence id และ random number เข้ามาอีก !!
น่าคิดว่า ถ้า scale เครื่องเยอะ ๆ performance จะเป็นอย่างไร ?
และแนวทางที่เลือกจะมีโอกาสซ้ำไหม ?
ถ้าซ้ำแล้วจะทำ หรือ จัดการอย่างไร ?
เพื่อให้ระบบงานทำงานต่อได้

อาจจะต้องเพิ่ม prefix เข้ามาใน id ของแต่ละเครื่อง
สำหรับการ id ที่ generate ออกมา ถ้าใช้ sequence

ลองไปอ่านเกี่ยวกับ UUID หรือ GUID เพิ่มเติม พบว่า

มี UUID หลาย version มาก ๆ เช่น

  • Version 1 Time-based MAC ใช้ mac address และ current time ของเครื่องนั้น ๆ
  • Version 2 DCE Security เหมือนกับ type 1 แต่เพิ่ม POSIX UID หรือ GID เข้ามา
  • Version 3 Name-based md5 เพิ่ม string เข้ามา แล้วผ่าน md5
  • Version 4 Randomness เพิ่ม random data เข้ามา
  • Version 5 Name-based SHA1 เปลี่ยนจาก md5 มาเป็น SHA1
  • Version 5 Reordered Time
  • Version 7 Unix Epoch Time ซึ่งมีตัว TypeID ที่ implement ตาม v7
  • Version 8 Custom

พออ่าน UUID แล้วไปเจอว่าสามารถ convert ไปใช้ ULID ได้อีก
ULID (Universally Unique Lexicographically Sortable Identifier)
ซึ่งเรียงลำดับให้เลย แถมสั้นลง ไม่ค่อยซ้ำ ตรงนี้ต้องทดสอบ
เยอะไปไหน !!

ซึ่งเท่าที่เห็นจะใช้ UUID กันเยอะ ไม่ค่อยซ้ำ เพราะว่า ยาวตั้ง 128 bit
แต่ยากต่อการจดจำ และ ไม่สามารถเรียงลำดับได้

ตัวอื่น ๆ ที่เห็นมา เช่น

จะเห็นได้ว่า มีหลากหลายวิธีมาก ๆ
เรื่องจากมาจากความต้องการที่แตกต่างกัน
ดังนั้น น่าจะต้องเริ่มก่อนว่า ระบบงานของเราเป็นอย่างไร
ต้องการอะไร หรือ ต้องการแก้ไขปัญหาอะไร นั่นเอง

Reference Websites