Understanding UUID

Published on January 25, 2026
Understanding UUID

UUID นั้นต้องเรียกได้ว่ามีข้อถกเถียงกันมานานมา ในการใช้ในการเขียนโปรแกรมและการออกแบบดาต้าเบส วันนี้เราจะไปศึกษาว่ามันคืออะไร และ ในการออกแบบฐานข้อมูลมันเข้ามามีบทบาทอย่างไร

UUID คืออะไร

UUID ย่อมาจาก Universally Unique Identifier อาจจะแปลเป็นไทยได้ว่า ตัวระบุที่ไม่ซ้ำกันเลยในแต่ละชุดข้อมูล หรืออาจจะเรียกได้อีกอย่างหนึ่งว่า ชุดข้อมูลที่สามารถใช้ระบุตัวตนแบบครอบจักรวาลก็ได้เช่นกัน
เพราะมันคือ ชุดตัวเลขและตัวอักษรยาว ๆ ประมาณ 36 ตัว (รวมขีด) ที่ถูกออกแบบมาให้ แทบเป็นไปไม่ได้เลยที่จะซ้ำกัน กับใครหรือระบบในโลกนี้ แม้จะมีคอมพิวเตอร์หลายพันล้านเครื่องสร้างพร้อมกันก็ตาม
ตัวอย่างที่เราเห็นบ่อย ๆ จะหน้าตาแบบนี้:
019bea4b-6dde-7750-8194-2b38e0cc0a1f

แนวคิดหลักคือ
สร้าง ID โดยไม่ต้องถามใครหรือไม่ต้องอิงจากระบบอื่นใด ไม่ต้องเช็กซ้ำ ทั้งในฐานข้อมูลและในระดับการโปรแกรม และผลลัพธ์ของการสร้าง แทบเป็นไปไม่ได้ที่ชุดข้อมูลดังกล่าวจะชนกัน UUID ถูกใช้แทน auto-increment ID ในหลายระบบสมัยใหม่ไม่เพียงแต่ในระบบฐานข้อมูล

ตัวอย่างการใช้งาน:

  •  user_id
  • order_id
  • booking_id
  • transaction_id
  • event_id (ใน event-driven system)

2. UUID สำคัญกับระบบ Programming สมัยใหม่อย่างไร

2.1 แก้ปัญหา ใน ระบบกระจาย (Distributed System)

ในระบบสมัยใหม่ เช่น:

  • Microservices ซึ่งเป็นที่นิยมมากในทุกวันนี้
  • Multiple database สำหรับระบบฐานข้อมูลแบบหลายระบบหรือหลายผู้ผลิต
  • Multi-region การทำงานหลายภูมิภาคหรือในระดับโลก
  • Offline เช่นการ sync online หรือระบบ Edge Computing

ถ้าใช้ INT AUTO_INCREMENT เช่นที่เคยทำกันมาก่อนหน้านี้หลายสิบปี เราจะพบว่ามันมีปัญหาคือ

  • ต้องมีศูนย์กลาง ที่คอยจัดลำดับ
  • merge ข้อมูลยาก
  • เกิดการชนของ ID ได้

UUID เกิดมาเพื่อแก้ปัญหาทั้งหมดที่กล่าวมาข้างต้น

  • แต่ละ service สร้าง ID เองได้
  • ไม่ต้อง round-trip ไป DB เพื่อขอ ID
  •  sync ข้อมูลจากหลายที่ได้เลย

2.2 ปลอดภัยกว่า (Security / Obfuscation)

เช่นการทำ Auto-increment:

/orders/1001
/orders/1002
จากรูปแบบดังกล่าว มันจะทำให้เรา เดาได้เลยว่าต่อไปคืออะไร

UUID:

/orders/019bea4b-6dde-7750-8194-2b38e0cc0a1f

  • เดาไม่ได้
  • ลดปัญหา IDOR (Insecure Direct Object Reference)
  • เหมาะกับ Public API

2.3 ทำงานดีกับ Event / Log / Audit

UUID ทำให้:

  • trace event ข้าม service ได้
  • correlate log ได้ง่าย
  • เหมาะกับ Kafka, RabbitMQ, Event Store

2.4 ใช้ได้ข้ามภาษา และอิสระต่อการทำงานข้าม DB

UUID เป็นมาตรฐาน และได้รับการสนับสนุนจากการโปรแกรมชั้นนำเกือบทุกภาษาการโปรแกรมในทุกวันนี้:

  • Go, Java, .NET, Python
  • PostgreSQL, MySQL, SQL Server
  • NoSQL (MongoDB, Cassandra)

การใช้งาน UUID v7 ใน MS SQL

ก่อนหน้า UUID v7 นั้นต้องบอกว่ามีข้อถกเถียงในสังคมนักพัฒนาอย่างมาก สำหรับการใช้งาน integer และ UUID โดยก่อนหน้านั้น Microsoft แนะนำว่า ควรใช้ NEWSEQUENTIALID() เป็นตัวเลือกที่ดีที่สุดใน SQL Server ถ้าต้องการ GUID ที่ sequential เพราะมันถูกออกแบบมาให้เพิ่มขึ้นแบบ monotonically increasing ภายในเครื่องเดียวกัน Microsoft ยังคง document และ promote ฟังก์ชันนี้มาตั้งแต่ SQL Server 2005 จนถึงเวอร์ชันล่าสุด (2025+) แต่อย่างไรก็ตามเนื่องจากมัน ไม่ใช่ UUID มาตรฐาน RFC 9562 (เป็น UUID v1 ที่ sequential แบบ Microsoft เฉพาะ) และไม่ unique ข้ามเครื่องถ้าไม่มี network card กทำให้เกิด  fragmentation สูง ใน clustered index (page split เยอะ, index rebuild บ่อย, I/O สูง)

UUID v7 (RFC 9562)
– .NET 9+ มี Guid.CreateVersion7() ซึ่ง Microsoft implement เองตาม RFC
– แต่  SQL Server เองยังไม่มีฟังก์ชัน native สร้าง v7 (ยังคงมีแค่ NEWID / NEWSEQUENTIALID) เพราะฉะนั้นเราจะต้องสร้างในระดับการโปรแกรม
– Microsoft ไม่ได้ ห้าม หรือ ห้ามใช้ v7 แต่ก็ไม่ได้ promote ให้ใช้แทน NEWSEQUENTIALID โดยตรง
– ในทางปฏิบัติ คนส่วนใหญ่ที่ใช้ v7 จะ generate ฝั่ง application (.NET, Node.js, etc.) แล้ว insert เข้า SQL Server เป็น uniqueidentifier ปกติ

UUID Version ล่าสุด v7 ดีอย่างไร

ก่อนหน้านี้ปัญหา UUID classic (v4) คือ:

  • random ล้วน
  • index ใน DB กระจัดกระจาย (index fragmentation) และการทำ index ไม่มีประสิทธิภาพ
  • ORDER BY id แทบไม่มีประโยชน์
  • Time-ordered UUID

โครงสร้างหลักของ UUID v7:

  • Timestamp (millisecond) อยู่ข้างหน้า
  • Random อยู่ข้างหลัง
  • ยังคง uniqueness ระดับโลก หรือสามารถใช้ในการจัดเรียงได้ดี

ตัวอย่าง (เรียงตามเวลาได้):

019bea4b-6dde-7750-8194-2b38e0cc0a1f
019bea4b-6dde-7751-a1c2-1c9e3d4f1abc

 

ข้อถกเถียง / ข้อโต้แย้งหลัก ๆ เกี่ยวกับ UUID v7 (ก่อนและหลัง RFC 9562 ออก)

คนที่ ไม่เห็นด้วยกับการใช้ v7 เป็น PK ใน RDBMS (โดยเฉพาะ SQL Server) มักยกประเด็นดังต่อไปนี้

1. ความ random น้อยลง ความปลอดภัย / collision ลดลง เพราะว่ามีเวลาเข้ามาเกี่ยวข้องสำหรับการเรียงลำดับ
– v7 เหลือ random bits แค่ 74 bits (เทียบ v4 ที่ 122 bits)
– บางคนกลัว collision ในระบบใหญ่ ๆ ที่ insert มหาศาล (แม้โอกาสจะยังต่ำมากก็ตามในทางทฤษฎี)

2. Endianness และ byte order ไม่ตรงกันระหว่างระบบ
– RFC 9562 กำหนดให้ใช้  big-endian สำหรับ binary storage และ comparison
– แต่  SQL Server จัดเก็บและเปรียบเทียบ uniqueidentifier แบบ little-endian (Microsoft เฉพาะ ไม่ใช่ network byte order)
– .NET Guid.CreateVersion7() ในช่วงแรก ๆ (และบางเวอร์ชัน) สร้างมาแบบไม่สอดคล้อง ทำให้เมื่อ insert เข้า SQL แล้ว เรียงลำดับผิด (ไม่ sequential จริง) และทำให้เกิด index fragmentation ยังเกิดอยู่

*** มี GitHub discussion และ gist เตือนว่า อย่าใช้ Guid.CreateVersion7 ใน .NET ถ้าเอาไปใช้กับ SQL Server  จนกว่าจะแก้ endian ให้ถูก อย่างไรก็ตามมันเป็นแค่คำแนะนำจากบางผู้พัฒนาเท่านั้น

3. NEWSEQUENTIALID() ของ Microsoft ดีกว่า v7 อยู่แล้วใน SQL Server หากเราพูดถึงเอกสารที่ออกจาก Microsoft
– มัน sequential จริง 100% ภายในเครื่อง (ไม่ต้องกังวล byte order)
– ไม่เสีย random bits ไปให้ timestamp
– หลายคนบอกว่า ทำไมต้องไปใช้ v7 ในเมื่อ Microsoft มี solution ที่ optimize สำหรับ SQL Server อยู่แล้ว?

4. ยังมี page split อยู่ดี (ไม่ perfect sequential)
– v7 มี timestamp หน่วย 1 ms + random counter
– ถ้า insert เยอะมากใน 1 ms เดียวกัน (เช่น high throughput system) จะยัง random ภายใน ms นั้น ยัง split บ้าง (ดีกว่า v4 แต่ไม่ดีเท่า sequential จริง ๆ)

5. Overhead และความซับซ้อน
– ต้อง generate ฝั่ง app ต้องจัดการ clock sync, collision ใน counter
– ถ้าใช้ ULID หรือ KSUID หรือ Snowflake ID บางคนบอกว่าดีกว่า v7 เพราะออกแบบมาเพื่อ DB โดยเฉพาะ (sortable หรือจัดเรียงได้และ มีความหมายมากกว่า)

สรุปแบบสั้น ๆ สำหรับคนใช้ MS SQL Server

– Microsoft แนะนำ NEWSEQUENTIALID() สำหรับ clustered PK (performance ดีสุด ไม่ fragmentation)
– ถ้าต้องการ decentralized + sort ได้ตามเวลา UUID v7 เป็นตัวเลือกที่ดี (ดีกว่า v4 ชัดเจน) แต่ต้องระวังเรื่อง endianness ใน .NET  ก่อนส่งไปยัง SQL Server
– คนไม่เห็นด้วยส่วนใหญ่กลัวว่า v7 ยังไม่ perfect และ  NEWSEQUENTIALID ดีพอแล้วใน ecosystem ของ Microsoft

ถ้าคุณใช้ .NET + SQL Server อยู่ตอนนี้ (2026) หลายคนแนะนำดังนี้:
– ใช้ NEWSEQUENTIALID() ถ้า generate จาก DB ได้
– หรือใช้ v7 แต่ generate แล้ว reverse byte order ก่อน insert (หรือรอ patch จาก Microsoft/.NET)

แล้วถ้าเป็น PostgreSQL ล่ะจะเกิดอะไรขึ้น

สำหรับ PostgreSQL v18 นั้นออกมาเพื่อสนับสนุน UUID v7 โดยตรง และ แนะนำให้นักพัฒนาสามารถใช้งานได้เลย และ เป็นที่แนะนำอย่างยิ่ง ทั้งการ generate จากระบบฐานข้อมูลเอง หรือว่าจะระดับ programming

เว็บสำหรับการสร้าง UUID ทุก version https://uuid-generator.avesta.top/

และเราขอแถม Web สำหรับการสร้าง Barcode ในทุกรูปแบบทั้ง 1D & 2D

เว็บสำหรับการสร้าง Barcode ทุกรูปแบบ https://barcode-generator.avesta.top/

Understanding UUID

UUID นั้นต้องเรียกได้ว่ามีข้อถกเถียงกันมานานมา ในการใช้ในการเขียนโปรแกรมและการออกแบบดาต้าเบส วันนี้เราจะไปศึกษาว่ามันคืออะไร และ ในการออกแบบฐานข้อมูลมันเข้ามามีบทบาทอย่างไร UUID คืออะไร UUID ย่อมาจาก...

Read more »

วันสิ้นสุด License Perpetual ของ VMware มาถึงแล้ว รีบย้ายไป Proxmox VE กันเถอะ

ตอนที่ VMware ประกาศว่าจะออก ESXi 9 มานั้น ทุกคนในวงการก็คิดว่า มันน่าจะมาพร้อมการอัพเดทบางส่วนเหมือนทุกๆ ครั้งที่ผ่านมาเช่น การเพิ่มการสนับสนุนฮาร์ดแวร์...

Read more »

Garage ทางเลือกในการแทนที่ MinIO

MinIO นั้นเป็นซอฟต์แวร์ที่จะทำให้เราสามารถเก็บข้อมูลในลักษณะที่เป็น Object ได้ และ เรียกว่าเป็นตัวเลือกที่มีอยู่ไม่มากนักในท้องตลาดหากท่านต้องการจะสร้าง Object Storage Server เพื่อใช้ภายในองค์กร...

Read more »

Time Range Booking System

Time Range Booking คืออะไร และทำไมธุรกิจยุคใหม่จำเป็นต้องใช้ ในยุคที่ลูกค้าคาดหวัง ความรวดเร็วและความแม่นยำ มากขึ้น ระบบจองแบบเดิมที่เลือกแค่วันที่หรือรอบเวลา (slot...

Read more »

เพิ่มขีดความสามารถของ WordPress ด้วยการเชื่อมต่อ External API

WordPress คืออะไร WordPress คือระบบ CMS (Content Management System) แบบโอเพนซอร์ส ที่ใช้สำหรับสร้างเว็บไซต์โดยไม่จำเป็นต้องเขียนโค้ดเองเลย...

Read more »

Private Branding Hotel/Property Reservation System

ประเทศไทยนั้นมีจุดเด่นเรื่องสถานที่ท่องเที่ยวที่สวยงาม มีวัฒนธรรมอันยาวนาน และ ศิลปะท้องถิ่นที่มีเอกลักษณ์ รวมถึงอาหารที่ได้รับรางวัลระดับโลกมากมาย รวมถึงผู้คนที่มีจิตใจโอบอ้อมอารี และ สิ่งเหล่านั้นเองเป็นสิ่งที่ดึงดูดนักท่องเที่ยวทั่วโลกมายังประเทศไทย และมีการเติบโตของธุรกิจโรงแรมอย่างมากมายทุกประเภทไม่ว่าจะเป็น โรงแรม...

Read more »