Vài thứ về UUID
nodejs
72
Adonis
2
Mysql
44
UUID
1
White

ShinaBR2 viết ngày 21/07/2017

UUID ở thời điểm hiện tại không còn là cái gì quá mới mẻ, nhưng không phải ai cũng rành rọt về cái này và xài sao cho thuận tiện. Nay mình xin tóm gọn lại một số ý, gom góp từ một vài bài viết, trong đó có 2 bài có nói về UUID trên kipalog:

Pinterest đã thực hiện scaled MySQL của họ như thế nào
Lần đầu tham gia ISUCON và những kiến thức giúp website của bạn nhanh lên gấp N lần

Hai bài viết trên thực sự rất chất lượng, bạn nên nghía qua :D

Khái niệm

UUID là viết tắt của Universally Unique IDentifier, hiểu nôm na là một định danh duy nhất trong toàn thể vũ trụ (universal cơ mà) =)). Mục đích của UUID sinh ra là bởi vì:

  • Dữ liệu lớn, kiểu khóa chính auto imcrement cần nhiều byte để lưu hơn. Và khóa chính kiểu này không phù hợp khi mà hệ thống có nhiều server, nhiều client cùng lúc truy cập trên toàn thế giới.
  • Nếu dùng khóa chính kiểu auto imcrement, có thể dễ dàng truy ra được trong database có bao nhiêu record. Thường thấy ở đường dẫn kiểu "domain.com/user/12345".

Bởi vậy UUID ra đời nhằm khắc phục những yếu điểm trên. Vậy nếu bạn đủ sức xây dựng một hệ thống với nhiều server, phục vụ hàng tỉ tỉ user hoặc chỉ đơn giản là không muốn để lộ id ra ngoài, hãy nghĩ tới UUID.

Cách dùng

Đừng đơn giản để UUID làm khóa chính, nếu bạn đã đọc bài "Lần đầu tham gia ISUCON..." ở trên thì sẽ hiểu tại sao. Vậy làm sao để tận dụng được UUID, đó chính là thêm một cột để lưu UUID. Nhưng kiểu gì, CHAR hay VARCHAR hay BINARY(16)? Câu trả lời là BINARY(16), các bạn có thể tham khảo ở đây.
Một gợi ý nhỏ là những dấu gạch ngang trong chuỗi UUID hoàn toàn không có nghĩa và bạn có thể bỏ đi để tối ưu lưu trữ.
Như vậy, để khắc phục yếu điểm thứ hai ở trên, mình sẽ dùng một chuỗi dạng "ee92d492388c5847928dcd2ebcf821a8" để thay thế cho số "12345" ở ví dụ trên. Sau đó sẽ tìm user theo uuid đó và truy vấn theo id auto imcrement. Nguyên tắc là dùng UUID cho external và id auto imcrement cho internal query.

Vấn đề của UUID Binary(16) trong NodeJS

Khi mà lưu database với kiểu BINARY(16), có thể bạn sẽ gặp khó khăn khi truy xuất trong NodeJS, ví dụ như mình đang làm với AdonisJS, thì có thể bạn sẽ thích 2 câu lệnh này:

const binaryUUID = Buffer.from(uuid, 'hex');//convert string like "ee92d492388c5847928dcd2ebcf821a8" to binary(16)
const uuid = Buffer.from(binaryUUID, 'hex').toString('hex');//Convert binary(16) to string like "ee92d492388c5847928dcd2ebcf821a8"

:D Hết, hi vọng những kiến thức nhỏ này sẽ giúp ích các bạn trong quá trình phát triển ứng dụng của mình.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

ShinaBR2

10 bài viết.
92 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
57 16
Đây là một vấn đề kinh điển, và có rất nhiều bài viết về nó, tuy nhiên đa phần là dịch từ bản gốc ra và sao chép lại một vài câu lệnh, và câu hỏi t...
ShinaBR2 viết 1 năm trước
57 16
White
38 10
Vào một ngày đẹp trời, khi bạn nhận được yêu cầu phải thiết kế database cho một hệ thống, câu hỏi đầu tiên được đặt ra, quy trình làm ra nó sẽ cụ t...
ShinaBR2 viết 1 năm trước
38 10
White
32 10
Bàn về code thối Hãy tự đặt câu hỏi cho bạn, khi bắt đầu lập trình, bạn nghĩ tới điều gì? Đi phỏng vấn Điều đầu tiên tôi muốn nói về những câu hỏ...
ShinaBR2 viết 8 tháng trước
32 10
Bài viết liên quan
White
1 0
Lâu lâu không động vào nodejs không biết mấy ông tool tiếc này đi đâu về đâu rồi. Trước đây thì mình vẫn có thể dùng istanbul với mocha đơn giản th...
Hoàng Duy viết hơn 1 năm trước
1 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
10 bài viết.
92 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!