UUID là gì? Vì sao bạn nên quan tâm
UUID là chuẩn định dạng mã định danh duy nhất được sử dụng phổ biến trong khoa học máy tính, đặc biệt là trong các hệ thống phân tán. Bài viết này Bizfly Cloud sẽ giải thích UUID là gì, cách thức hoạt động và lý do tại sao bạn nên sử dụng chúng.
UUID trong Cơ sở dữ liệu
Khi làm việc với cơ sở dữ liệu, việc sử dụng một số loại trường id để cung cấp mã định danh duy nhất cho mỗi hàng trong bảng là điều phổ biến.
Hãy tưởng tượng, ví dụ: một bảng khách hàng. Chúng ta sẽ không muốn sử dụng các trường như tên hoặc địa chỉ làm mã định danh duy nhất, bởi vì có thể nhiều khách hàng có cùng tên hoặc địa chỉ.
Thay vào đó, nên gán cho mỗi hàng một số loại mã định danh duy nhất. Một lựa chọn chúng ta có là sử dụng UUID.
UUID - viết tắt của Universally Unique IDentifier (Mã định danh Duy nhất Toàn cầu) - là một chuỗi chữ và số gồm 36 ký tự có thể được sử dụng để xác định thông tin (chẳng hạn như một hàng trong bảng).
Dưới đây là một ví dụ về UUID: acde070d-8c4c-4f0d-9d8a-162843c10333.
UUID được sử dụng rộng rãi một phần vì chúng có khả năng duy nhất trên toàn cầu rất cao, nghĩa là UUID của hàng không chỉ là duy nhất trong bảng cơ sở dữ liệu của chúng ta mà có thể là hàng duy nhất có UUID đó trong bất kỳ hệ thống nào ở bất kỳ đâu.
(Về mặt kỹ thuật, không phải là không thể xảy ra trường hợp UUID mà chúng ta tạo ra có thể được sử dụng ở nơi khác, nhưng với 340.282.366.920.938.463.463.374.607.431.768.211.456 UUID có thể có, khả năng này là rất nhỏ).
Tại Sao UUID Tồn Tại?
Để trả lời câu hỏi này, hãy tưởng tượng chúng ta đang điều hành một hiệu sách thương mại điện tử. Khi đơn đặt hàng đến, chúng ta muốn gán cho chúng một số id và lưu chúng vào bảng đơn hàng bằng cách sử dụng số đó.
Chúng ta có thể thiết lập ID tuần tự sao cho đơn hàng đầu tiên đến là 1, đơn hàng thứ hai là 2, v.v., như sau:
Và cách tiếp cận này có thể hoạt động tốt, ít nhất là trong một thời gian, nếu quy mô của chúng ta nhỏ. Tuy nhiên, nó có một số nhược điểm chính:
Thứ nhất, nó có thể dễ dàng tạo ra sự nhầm lẫn khi chúng ta thực hiện những việc như nối bảng hoặc nhập dữ liệu mới, bởi vì các giá trị id ở trên không phải là duy nhất. Điều này có thể tạo ra vấn đề ngay cả trong nội bộ nếu chúng ta sử dụng cùng một hệ thống ID cho nhiều bảng, nhưng nó thực sự trở nên lộn xộn khi chúng ta bắt đầu làm việc với bất kỳ loại dữ liệu bên ngoài nào.
Hãy tưởng tượng, ví dụ: hiệu sách nhỏ của chúng ta phát triển và chúng ta mua lại một hiệu sách trực tuyến khác. Khi chúng ta tích hợp các bảng đơn hàng của mình, chúng ta thấy rằng họ đã sử dụng cùng một hệ thống. Giờ đây, chúng ta có hai đơn hàng 1, hai đơn hàng 2, v.v., và để giải quyết vấn đề, chúng ta sẽ phải cập nhật mọi ID trong ít nhất một trong hai cơ sở dữ liệu mà chúng ta đang tích hợp. Ngay cả trong trường hợp tốt nhất, đó sẽ là một rắc rối lớn.
Thứ hai, cách tiếp cận tuần tự không hoạt động tốt trong bất kỳ loại hệ thống phân tán nào, bởi vì nó có nghĩa là các lệnh INSERT phải được thực hiện từng cái một. Hạn chế này có thể gây ra các vấn đề về hiệu suất lớn ở quy mô lớn. Ngay cả khi ứng dụng của bạn yêu cầu thứ tự ID nghiêm ngặt, việc sử dụng một tính năng có thể cho phép bạn đáp ứng các yêu cầu đó trong khi vẫn sử dụng UUID và không bị ảnh hưởng đến hiệu suất đi kèm với ID được sắp xếp tuần tự.
Các phương pháp tiếp cận truyền thống khác đối với ID duy nhất, chẳng hạn như tạo ID ngẫu nhiên bằng SERIAL, cũng có thể dẫn đến điểm nóng trong các hệ thống phân tán vì các giá trị được tạo ra trong cùng một khoảng thời gian có các giá trị tương tự và do đó nằm gần nhau trong bộ nhớ của bảng.
UUID giải quyết tất cả những vấn đề này bởi vì:
Chúng là duy nhất trên toàn cầu, vì vậy khả năng gặp phải ID trùng lặp ngay cả trong dữ liệu bên ngoài là rất, rất nhỏ. Chúng có thể được tạo ra mà không cần kiểm tra với nút trung tâm, vì vậy trong một hệ thống phân tán, mỗi nút có thể tạo UUID một cách tự động mà không sợ bị trùng lặp hoặc các vấn đề về tính nhất quán.
Lý do số 1 là một lý do chính đáng để sử dụng UUID trong hầu hết mọi hệ thống cơ sở dữ liệu. Là một doanh nghiệp mong muốn hoạt động ở quy mô lớn, lý do số 2 cũng rất phù hợp với hiệu sách của chúng ta, bởi vì cơ sở dữ liệu phân tán mang lại khả năng mở rộng và khả năng phục hồi tốt nhất.
Nhược điểm của UUID
Nhược điểm đáng kể duy nhất của UUID là chúng chiếm 128 bit trong bộ nhớ (và thường nhiều hơn một chút khi chúng ta bao gồm siêu dữ liệu). Nếu việc giảm thiểu dung lượng lưu trữ là cực kỳ quan trọng, thì rõ ràng việc lưu trữ ID tuần tự (có thể sẽ nằm trong khoảng từ 1-10 ký tự số) sẽ hiệu quả hơn so với việc lưu trữ một chuỗi chữ và số gồm 36 ký tự.
Tuy nhiên, trong hầu hết các trường hợp, nhược điểm của việc sử dụng một cái gì đó giống như mã định danh tuần tự lớn hơn đáng kể so với việc tăng chi phí lưu trữ tối thiểu khi sử dụng UUID. UUID cực kỳ phổ biến và được sử dụng rộng rãi cho nhiều mục đích nhận dạng khác nhau. Chúng tôi đã tập trung vào các ví dụ về cơ sở dữ liệu trong bài viết này vì UUID cũng được sử dụng trong các hệ thống phân tích, ứng dụng web và ứng dụng di động, v.v.
Các loại UUID
Có một số loại UUID khác nhau:
Phiên bản 1 và phiên bản 2. Đôi khi được gọi là UUID dựa trên thời gian, các ID này được tạo bằng cách kết hợp các giá trị ngày giờ (phản ánh thời gian UUID đang được tạo), một giá trị ngẫu nhiên và một phần địa chỉ MAC của thiết bị tạo ra UUID.
Đây là cách nó được chia nhỏ một cách trực quan:
Việc tạo UUID theo cách này khiến cho việc có các UUID giống hệt nhau gần như là không thể - chúng sẽ phải được tạo bởi cùng một thiết bị tại cùng một thời điểm và tạo ra chính xác cùng một chuỗi 16 bit ngẫu nhiên.
Vì chúng chứa một phần địa chỉ MAC của thiết bị tạo, ID UUID v1 và UUID v2 có thể được sử dụng để xác định (ví dụ) nút cơ sở dữ liệu nào đã tạo ID. Điều này thường không phải là vấn đề và trong các hệ thống phân tán, nó có thể là một lợi thế.
(Sự khác biệt giữa UUID v1 và v2 là UUID v2 cũng chứa một đoạn của số miền cục bộ. Vì một số lý do, điều này khiến chúng ít tối ưu hơn cho hầu hết các ứng dụng, vì vậy UUID v2 không được sử dụng rộng rãi.)
Phiên bản 3 và phiên bản 5. Hai phiên bản UUID này được tạo bằng cách băm một mã định danh không gian tên và tên. Chúng tương tự như UUID dựa trên thời gian ở chỗ chúng được tạo bằng cách sử dụng dữ liệu hiện có thay vì hoàn toàn ngẫu nhiên, nhưng thay vì sử dụng dữ liệu ngày giờ và địa chỉ MAC của thiết bị, chúng sử dụng dữ liệu không gian tên và dữ liệu tên.
Dữ liệu không gian tên tự nó là một UUID và dữ liệu tên thực sự có thể là bất kỳ chuỗi tùy ý nào, mặc dù trên thực tế, nó thường liên quan đến cách UUID sẽ được sử dụng - ví dụ: nó có thể là tên tài khoản hoặc ID sản phẩm. Nhưng cho dù hai giá trị được sử dụng là gì, chúng được băm để tạo ra một chuỗi chữ và số gồm 36 ký tự là UUID cuối cùng.
UUID phiên bản 3 và 5 khác nhau chủ yếu ở chỗ chúng sử dụng các thuật toán băm khác nhau. UUID v3 sử dụng MD5 và UUID v5 sử dụng SHA-1.
Phiên bản 4. Các UUID này chỉ đơn giản là các chuỗi 36 ký tự được tạo ngẫu nhiên. Ngoài một chữ số 4 duy nhất để biểu thị rằng chúng là UUID v4, mỗi ký tự chỉ đơn giản là một ký tự ngẫu nhiên từ a-z hoặc số nguyên từ 0-9.
Vì việc tạo là hoàn toàn ngẫu nhiên, nên chúng rất có khả năng là duy nhất. Chúng cũng không chứa thông tin nhận dạng như ngày giờ, địa chỉ MAC hoặc dữ liệu tên (có thể là một lợi thế hoặc nhược điểm tùy thuộc vào trường hợp sử dụng cụ thể).
Phiên bản 6, 7 và 8. Tại thời điểm viết bài này, không có phiên bản nào trong số này tồn tại, nhưng chúng đã được đề xuất và có thể được thêm vào các tiêu chuẩn UUID trong những năm tới. Bạn có thể đọc thêm về các UUID mới được đề xuất này tại đây.