Nếu bạn có nhiều máy chủ web, với nhiều quy trình, thì thực sự không có thứ gì bạn có thể loại bỏ vì làm mất tính độc đáo.
Nếu bạn nhìn vào bản chất của ObjectId
:
- giá trị 4 byte đại diện cho số giây kể từ kỷ nguyên Unix,
- mã định danh máy 3 byte,
- một id quy trình 2 byte và
- bộ đếm 3 byte, bắt đầu bằng giá trị ngẫu nhiên.
Bạn sẽ thấy không có nhiều thứ ở đó mà bạn có thể xóa một cách an toàn. Vì 4 byte đầu tiên là thời gian, sẽ là một thách thức để triển khai một thuật toán loại bỏ các phần của dấu thời gian một cách rõ ràng và an toàn.
Định danh máy và định danh quy trình được sử dụng trong trường hợp có nhiều máy chủ và / hoặc quy trình hoạt động như máy khách đối với máy chủ cơ sở dữ liệu. Nếu bạn bỏ một trong hai thứ đó, bạn có thể gặp lại các bản sao. Giá trị ngẫu nhiên là 3 byte cuối cùng được sử dụng để đảm bảo rằng hai số nhận dạng, trên cùng một máy, trong cùng một quy trình là duy nhất, ngay cả khi được yêu cầu thường xuyên.
Nếu bạn đang sử dụng nó như một đơn đặt hàng id
và bạn muốn đảm bảo tính duy nhất, tôi sẽ không cắt bỏ bất kỳ thứ gì khỏi số 12 byte vì nó được thiết kế cẩn thận để cung cấp một cơ chế phân tán mạnh mẽ và hiệu quả để tạo các số duy nhất khi có nhiều máy khách cơ sở dữ liệu được kết nối.
Nếu bạn lấy 5 ký tự cuối cùng của ObjectId ... và trong một khoảng thời gian nhất định, xác suất xung đột là bao nhiêu?
- id quy trình
- bộ đếm
Khả năng xung đột là cao . Id quy trình có thể giữ nguyên trong toàn bộ khoảng thời gian và số khác chỉ là một số tăng dần sẽ lặp lại sau 4095 đơn đặt hàng. Nhưng, nếu quy trình tái chế, thì bạn cũng có khả năng xảy ra xung đột với các đơn đặt hàng cũ hơn, v.v. Và nếu bạn đang nói chuyện với nhiều máy khách cơ sở dữ liệu, cơ hội cũng tăng lên. Tôi sẽ không cố gắng cắt giảm số lượng. Thật không đáng khi những khách hàng không hài lòng cố gắng đặt hàng.
Ngay cả dấu thời gian và giá trị gốc ngẫu nhiên cũng không đủ khi có nhiều máy khách cơ sở dữ liệu tạo ObjectIds
. Khi bạn bắt đầu xem xét các phần khác nhau, đặc biệt là trong bối cảnh của một loạt các máy khách cơ sở dữ liệu, bạn sẽ thấy lý do tại sao các phần đó ở đó và tại sao việc loại bỏ chúng có thể dẫn đến sự cố trong ObjectId
thế hệ.
Tôi khuyên bạn nên triển khai một thuật toán để tạo một số duy nhất và lưu trữ nó trong cơ sở dữ liệu. Nó đủ đơn giản để làm. Nó có ảnh hưởng đến hiệu suất một chút, nhưng nó an toàn.
Tôi đã viết điều này
trả lời một lúc trước về những thách thức khi sử dụng ObjectId
trong một Url. Nó bao gồm một liên kết đến cách tạo một số tự động tăng dần duy nhất bằng cách sử dụng MongoDB.