Ý kiến ​​của bạn về việc sử dụng UUID làm mã định danh hàng cơ sở dữ liệu, đặc biệt là trong các ứng dụng web?


78

Tôi luôn thích sử dụng số nguyên dài làm khóa chính trong cơ sở dữ liệu, vì sự đơn giản và tốc độ (giả định). Nhưng khi sử dụng lược đồ URL giống REST hoặc Rails cho các trường hợp đối tượng, sau đó tôi sẽ kết thúc với các URL như sau:

http://example.com/user/783

Và sau đó, giả định là cũng có những người dùng có ID là 782, 781, ..., 2 và 1. Giả sử rằng ứng dụng web được đề cập là đủ an toàn để ngăn mọi người nhập các số khác để xem người dùng khác mà không được phép, a khóa đại diện đơn giản được gán tuần tự cũng "rò rỉ" tổng số phiên bản (cũ hơn phiên bản này), trong trường hợp này là người dùng, có thể là thông tin đặc quyền. (Ví dụ: tôi là người dùng # 726 trong stackoverflow.)

Một sẽ UUID / GUID là một giải pháp tốt hơn? Sau đó, tôi có thể thiết lập các URL như thế này:

http://example.com/user/035a46e0-6550-11dd-ad8b-0800200c9a66

Không chính xác ngắn gọn, nhưng có ít thông tin ngụ ý hơn về người dùng trên màn hình. Chắc chắn, nó có "bảo mật thông qua sự che giấu" không thể thay thế cho bảo mật thích hợp, nhưng ít nhất nó có vẻ an toàn hơn một chút.

Lợi ích đó có xứng đáng với chi phí và sự phức tạp của việc triển khai UUID cho các cá thể đối tượng có địa chỉ web không? Tôi nghĩ rằng tôi vẫn muốn sử dụng các cột số nguyên làm PK cơ sở dữ liệu chỉ để tăng tốc độ nối.

Ngoài ra còn có câu hỏi về biểu diễn trong cơ sở dữ liệu của UUID. Tôi biết MySQL lưu trữ chúng dưới dạng chuỗi 36 ký tự. Postgres dường như có một biểu diễn bên trong hiệu quả hơn (128 bit?) Nhưng tôi chưa tự mình thử. Ai có kinh nghiệm với cái này rồi nào?


Cập nhật: đối với những người đã hỏi về việc chỉ sử dụng tên người dùng trong URL (ví dụ: http://example.com/user/yukondude ), cách này hoạt động tốt đối với các trường hợp đối tượng có tên là duy nhất, nhưng đối với các trang web đối tượng ứng dụng thực sự chỉ có thể được xác định bằng số? Đơn đặt hàng, giao dịch, hóa đơn, tên hình ảnh trùng lặp, câu hỏi stackoverflow, ...

Câu trả lời:


34

Tôi không thể nói về mặt web của câu hỏi của bạn. Nhưng uuids rất tốt cho các ứng dụng n-tier. Việc tạo PK có thể được phân cấp: mỗi máy khách tạo pk của riêng mình mà không có rủi ro va chạm. Và sự khác biệt về tốc độ nói chung là nhỏ.

Đảm bảo rằng cơ sở dữ liệu của bạn hỗ trợ kiểu dữ liệu lưu trữ hiệu quả (16 byte, 128 bit). Ít nhất bạn có thể mã hóa chuỗi uuid trong base64 và sử dụng char (22).

Tôi đã sử dụng chúng rộng rãi với Firebird và khuyên bạn nên dùng.


18
căn64? Nếu bạn không có kiểu dữ liệu gốc cho UUID, hãy bỏ dấu gạch ngang và gắn vào byte (32). Điều đó có thể sẽ nhanh hơn mã hóa / giải mã đến / từ base64 khi bạn cần UUID.
CMircea

29

Đối với những gì nó đáng giá, tôi đã thấy một thủ tục được lưu trữ đang chạy dài (hơn 9 giây) giảm xuống chỉ còn vài trăm mili giây thời gian chạy chỉ bằng cách chuyển từ khóa chính GUID sang số nguyên. Điều đó không có nghĩa là hiển thị GUID là một ý tưởng tồi, nhưng như những người khác đã chỉ ra, việc kết hợp chúng và lập chỉ mục chúng, theo định nghĩa, sẽ không nhanh như với số nguyên.


1
Nếu bạn có thể cung cấp một số chi tiết cụ thể hơn về nơi bạn nhìn thấy điều này, điều đó sẽ hữu ích. Kích thước của DB / bảng? Chương trình phụ trợ DB? Mẫu truy cập (truy vấn trông như thế nào) ... vv?
Garen

12
Làm thế nào đây thậm chí là một câu trả lời.
davidahines

16
Đó là bằng chứng giai thoại ủng hộ lý thuyết toán học rằng việc nối và lập chỉ mục các số nguyên sẽ nhanh hơn các chuỗi dài (ish).
Adam Tuttle

23

Tôi có thể trả lời bạn rằng trong máy chủ SQL nếu bạn sử dụng kiểu dữ liệu mã định danh duy nhất (GUID) và sử dụng hàm NEWID () để tạo các giá trị, bạn sẽ nhận được sự phân mảnh khủng khiếp do tách trang. Nguyên nhân là do khi sử dụng NEWID () giá trị tạo ra không tuần tự. SQL 2005 đã thêm hàm NEWSEQUANTIAL () để khắc phục điều đó

Một cách để vẫn sử dụng GUID và int là có một hướng dẫn và một int trong một bảng để hướng dẫn ánh xạ tới int. hướng dẫn được sử dụng bên ngoài nhưng bên trong trong DB

ví dụ

457180FB-C2EA-48DF-8BEF-458573DA1C10    1
9A70FF3C-B7DA-4593-93AE-4A8945943C8A    2

1 và 2 sẽ được sử dụng trong các liên kết và guid trong ứng dụng web. Bảng này sẽ khá hẹp và phải truy vấn khá nhanh


10

Tại sao lại ghép khóa chính với URI của bạn?

Tại sao không để khóa URI của bạn có thể đọc được (hoặc không thể đọc được, tùy thuộc vào nhu cầu của bạn) và dựa trên số nguyên chỉ mục chính của bạn, theo cách đó bạn tận dụng tối đa cả hai thế giới. Rất nhiều phần mềm blog làm điều đó, trong đó id tiếp xúc của mục nhập được xác định bằng 'slug' và id số bị ẩn bên trong hệ thống.

Lợi ích bổ sung ở đây là bây giờ bạn có một cấu trúc URL thực sự đẹp, rất tốt cho SEO. Rõ ràng đối với một giao dịch thì đây không phải là một điều tốt, nhưng đối với một cái gì đó như stackoverflow, điều đó rất quan trọng (xem URL ở trên cùng ...). Có được sự độc đáo không khó lắm. Nếu bạn thực sự lo lắng, hãy lưu trữ một băm của slug bên trong bảng ở đâu đó và thực hiện tra cứu trước khi chèn.

chỉnh sửa: Stackoverflow không hoàn toàn sử dụng hệ thống mà tôi mô tả, hãy xem bình luận của Guy bên dưới.


8
Stack Overflow lập chỉ mục trên ID chứ không phải slug. Hãy thử thay đổi slug ở đầu trang và nhấn enter. Nó sẽ chuyển hướng 301 bạn đến URL chuẩn cho trang này dựa trên ID (5949) và bỏ qua slug. Trên máy chủ, nó so sánh slug với slug được lưu trữ / tạo. Nếu không giống nhau, nó trả về 301. Tuy nhiên, nó tìm thấy điều đó bằng cách tra cứu trên ID (5949).
Guy

4

Thay vì các URL như thế này:

http://example.com/user/783

Tại sao không có:

http://example.com/user/yukondude

Cái nào thân thiện hơn với con người và không làm rò rỉ những thông tin nhỏ nhoi đó?


nếu biệt hiệu không phải là duy nhất hoặc giả sử tên sách đã được sử dụng làm liên kết và thay đổi - điều đó không tốt cho seo và đánh dấu người dùng.
ZiiMakc

4

Bạn có thể sử dụng một số nguyên có liên quan đến số hàng nhưng không liên quan. Ví dụ: bạn có thể lấy 32 bit của ID tuần tự và sắp xếp lại chúng bằng một lược đồ cố định (ví dụ: bit 1 trở thành bit 6, bit 2 trở thành bit 15, v.v.).
Đây sẽ là mã hóa hai chiều và bạn sẽ chắc chắn rằng hai ID khác nhau sẽ luôn có các mã hóa khác nhau.
Rõ ràng là sẽ dễ dàng giải mã, nếu người ta dành thời gian để tạo đủ ID và lấy lược đồ, nhưng, nếu tôi hiểu đúng vấn đề của bạn, bạn chỉ muốn không cung cấp thông tin quá dễ dàng.


Tôi không nghĩ rằng mục đích của câu hỏi là có một cách an toàn để sử dụng UUID. Theo như tôi hiểu rằng chủ đề là những phân nhánh thực tế của quyết định đó. Và chương trình của bạn không có thêm tính bảo mật và lãng phí chu kỳ cpu!
Patrick Cornelissen

4

Chúng tôi sử dụng GUID làm khóa chính cho tất cả các bảng của chúng tôi vì nó tăng gấp đôi như RowGUID cho MS SQL Server Replication. Thật dễ dàng khi khách hàng đột nhiên mở văn phòng ở một nơi khác trên thế giới ...


3

Tôi không nghĩ rằng một GUID mang lại cho bạn nhiều lợi ích. Người dùng ghét URL dài, khó hiểu.

Tạo một ID ngắn hơn mà bạn có thể ánh xạ tới URL hoặc thực thi quy ước tên người dùng duy nhất ( http://example.com/user/brianly ). Những người ở 37Signals có thể sẽ chế nhạo bạn vì lo lắng về những thứ như thế này khi nói đến một ứng dụng web.

Tình cờ bạn có thể buộc cơ sở dữ liệu của mình bắt đầu tạo ID số nguyên từ một giá trị cơ sở.


Điều này là không thể áp dụng, bạn không cần hiển thị uuid trong url.
davidahines

3
@dah mà người hỏi đề cập đến việc sử dụng nó trong URL trong câu hỏi.
Brian Lyttle 21/12/13

3

Nó cũng phụ thuộc vào những gì bạn quan tâm cho ứng dụng của mình. Đối với ứng dụng n-tier, GUID / UUID dễ triển khai hơn và dễ dàng chuyển đổi giữa các cơ sở dữ liệu khác nhau. Để tạo ra các khóa Số nguyên, một số cơ sở dữ liệu hỗ trợ một đối tượng trình tự nguyên bản và một số yêu cầu xây dựng bảng tuần tự tùy chỉnh.

Các khóa số nguyên có lẽ (tôi không có số) mang lại lợi thế cho hiệu suất truy vấn và lập chỉ mục cũng như sử dụng không gian. Truy vấn DB trực tiếp cũng dễ dàng hơn nhiều bằng cách sử dụng các phím số, ít sao chép / dán hơn vì chúng dễ nhớ hơn.


2

Tôi làm việc với hệ thống quản lý sinh viên sử dụng UUID ở dạng số nguyên. Họ có một bảng chứa ID duy nhất tiếp theo.

Mặc dù đây có lẽ là một ý tưởng hay cho một quan điểm kiến ​​trúc, nhưng nó khiến việc làm việc hàng ngày trở nên khó khăn. Đôi khi cần thực hiện chèn hàng loạt và có UUID khiến việc này trở nên rất khó khăn, thường yêu cầu viết một con trỏ thay vì một câu lệnh SELECT INTO đơn giản.


2

Tôi đã thử cả hai trong các ứng dụng web thực.

Ý kiến ​​của tôi là tốt hơn là sử dụng số nguyên và có url ngắn, dễ hiểu.

Là một nhà phát triển, sẽ cảm thấy hơi kinh khủng khi nhìn thấy các số nguyên tuần tự và biết rằng một số thông tin về tổng số bản ghi đang bị rò rỉ, nhưng thành thật mà nói - hầu hết mọi người có thể không quan tâm và thông tin đó chưa bao giờ thực sự quan trọng đối với doanh nghiệp của tôi.

Có những url UUID dài xấu xí đối với tôi dường như khiến người dùng bình thường bị tắt nhiều hơn.


Cảm ơn vì ý kiến ​​này. Tôi đã nghiên cứu việc sử dụng UUID làm khóa chính với tất cả các nhược điểm có thể có của nó trong nhiều ngày cho đến khi tôi nhận ra rằng ưu điểm duy nhất (ẩn thông tin doanh nghiệp) không đáng có, trong trường hợp của tôi.
Tiến sĩ Jan-Philip Gehrcke

1

Tôi nghĩ rằng đây là một trong những vấn đề gây ra các cuộc tranh luận gần như tôn giáo, và nó gần như vô ích để nói về nó. Tôi chỉ muốn nói sử dụng những gì bạn thích. Trong 99% hệ thống, bất kể bạn sử dụng loại khóa nào, vì vậy những lợi ích (đã nêu trong các bài viết khác) của việc sử dụng loại này hơn loại khác sẽ không bao giờ là vấn đề.


1

Tôi nghĩ rằng sử dụng GUID sẽ là lựa chọn tốt hơn trong tình huống của bạn. Nó chiếm nhiều dung lượng hơn nhưng an toàn hơn.


1

Youtube sử dụng 11 ký tự với mã hóa base64 cung cấp 11 ^ 64 vị trí và chúng thường dễ quản lý để viết. Tôi tự hỏi liệu điều đó có mang lại hiệu suất tốt hơn so với một UUID đầy đủ hay không. UUID được chuyển đổi thành cơ sở 64 sẽ gấp đôi kích thước mà tôi tin tưởng.

Có thể tìm thêm thông tin tại đây: https://www.youtube.com/watch?v=gocwRvLhDf8


-1

Miễn là bạn sử dụng hệ thống DB với khả năng lưu trữ hiệu quả, thì ngày nay ổ cứng HDD vẫn rẻ ...

Tôi biết GUID có thể phù hợp để làm việc với một số thời điểm và đi kèm với một số chi phí truy vấn tuy nhiên từ góc độ bảo mật, chúng là một vị cứu tinh.

Suy nghĩ bảo mật bằng cách che khuất chúng rất phù hợp khi tạo các URI bị che khuất và xây dựng DB được chuẩn hóa với bảo mật được xác định bởi Bảng, Bản ghi và Cột mà bạn không thể làm sai với GUID, hãy thử làm điều đó với id dựa trên số nguyên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.