Tôi đang làm việc để tạo hệ thống Quản lý quan hệ khách hàng. Tôi cần tạo một ID duy nhất gồm tám chữ số cho một khách hàng cụ thể. Làm cách nào để đạt được điều đó trong Javascript với Mongodb?
- stackoverflow. comghi bàn. 0
Trước hết, bạn cần biết rằng khả năng đụng độ chỉ với 8 số là hơi cao, vì vậy bạn cần cẩn thận với điều đó nếu không muốn trùng id
nhưng bạn có thể sử dụng cái này
Math.floor[10000000 + Math.random[] * 90000000]
Tôi khuyên bạn nên sử dụng UUID, nhưng bạn biết nhiều hơn về dự án của mình
ghi bàn. 1
Thật khó hoặc không thể trả lời câu hỏi này nếu không có thêm thông tin về các trường hợp sử dụng
Nói một cách đơn giản, bạn có thể sử dụng số tăng tự động và điều đó sẽ cung cấp cho bạn một id duy nhất lên tới 99.999.999
Nhưng nếu bạn muốn đi xa hơn, bạn có thể lưu trữ nó dưới dạng cấu trúc 26 bit lên tới 67108863 trong cơ số 10
Từ đó bạn phải xác định ý nghĩa của định danh của bạn
Giả sử bạn dự định có 4 máy chủ có thể nhận dạng
Bạn có thể đặt 2 bit đầu tiên thành id máy chủ. vì vậy máy chủ 1 sẽ đặt 00 và máy chủ 4 sẽ đặt 11
Điều này để lại cho bạn 24 bit để xác định
Vì vậy, bây giờ bạn có thể muốn thiết lập một số chi tiết. Giống như đặt năm ở định dạng YY vì bạn có thể không mong đợi ứng dụng này tồn tại qua năm 2100
6 bit sẽ cho phép chúng tôi tạo một số lên tới 64 để chúng tôi có thể sử dụng thêm một bit để đếm tới 128
Vậy năm 2020 sẽ là "001 0100"
Chúng tôi chỉ có 12 tháng một năm nên nó phù hợp với 4 bit
Tháng mười là tháng thứ mười nên số 9 hoặc "1001" trong hệ nhị phân
Chúng tôi có tối đa 31 ngày mỗi tháng nên 5 bit sẽ đủ tốt
Hôm nay là ngày 15 của tháng nên số 14 trong hệ nhị phân là "01110"
Cho đến nay, chúng tôi đã sử dụng 18 bit để tạo 1 id mỗi ngày và điều đó khiến chúng tôi có thêm 8 bit
server id | year | month | day
2 bits | 7 bits | 4 bits | 5 bits
Với 9 bit còn lại, bạn có thể tạo tối đa 256 id mỗi ngày trên 4 máy chủ khác nhau mà không gặp rủi ro khi tạo xung đột
Vì vậy, nếu bạn sử dụng số lượng id tối đa, mỗi ngày bạn có thể tạo tối đa 1024 id mỗi ngày. Nó không nhiều nhưng nó có thể đủ tốt tùy theo nhu cầu
Sử dụng phương pháp đó, id đầu tiên trên máy chủ 0 cho ngày hôm nay có thể trông như thế này
00 | 001 0100 | 1001 | 0 1110 | 0 0000 0001
Hoặc trong cơ sở 10. "0539 7505"
Vì vậy, nếu không biết các yêu cầu của bạn, thì không thể tìm ra một mã định danh tốt hơn có ý nghĩa nào đó. Rõ ràng là các phương pháp dựa trên thời gian làm giảm đáng kể số lượng bit có thể được sử dụng. Bởi vì những ngày trong quá khứ là những id không thể được sử dụng và thật không may với 4 bit dữ liệu cho các tháng, các số 13,14,15 không bao giờ được sử dụng và không có ý nghĩa và chỉ đơn giản là danh sách mãi mãi
Trong trường hợp của năm, chúng tôi thậm chí có thể tiết kiệm một chút và nói rằng thay vì 7 bit, chúng tôi sẽ sử dụng 6 bit cho đến 64 và số chỉ là 2020 + number
nên năm 2020 sẽ là "00 0000" Vì vậy, bạn chỉ cần lấy current year - 2020
để tìm
Thay vì sử dụng ngày tháng, bạn có thể sử dụng bất kỳ thứ gì có ý nghĩa để tạo mã định danh duy nhất. Nếu bạn sử dụng các số ngẫu nhiên, không những id không có ý nghĩa mà còn có nguy cơ tạo xung đột
Cuối cùng, tại sao không sử dụng đơn giản là sử dụng một ObjectId được tạo bởi mongodb?
Trong MongoDB, khá dễ dàng và hiệu quả để tương tác với các tài liệu bằng cách sử dụng các ID duy nhất. Phương thức find[] của MongoDB chứa một danh sách mở rộng các toán tử và lệnh được hỗ trợ giúp truy xuất tài liệu ở dạng tinh chỉnh. ID duy nhất có thể được sử dụng với phương thức find[] để lấy tài liệu dựa trên ID của chúng. Bằng cách làm theo hướng dẫn này, người dùng Mongo có thể lấy tài liệu bằng cách sử dụng id của những tài liệu đó trong phương thức find[]. Ngoài ra, để hiểu rõ hơn, một vài ví dụ được cung cấp cho thấy cách sử dụng phương thức “find[] by id” trong MongoDB
MongoDB là một cơ sở dữ liệu NoSQL hoạt động với các bộ sưu tập và tài liệu. Mỗi tài liệu được tạo trên MongoDB có một thuộc tính ID đối tượng duy nhất. Vì vậy, khi tạo tài liệu mà không cần nhập ID, tài liệu sẽ được tạo bằng ID được tạo tự động
Ai tạo ID?
Khi điền thuộc tính của tài liệu, chúng ta không nhất thiết phải nhập ID đối tượng. Nhưng khi chúng ta tham khảo MongoDB sau khi tạo một tài liệu, nó sẽ có ID đối tượng giống như thế này
{
“_id”: “5f1819229fdf8a0c7c2d8c36”
}
Điều này giúp chúng tôi tạo tài liệu trong MongoDB dễ dàng hơn nhiều và tiết kiệm rất nhiều thời gian. ID đối tượng trong các tài liệu trong MongoDB được tạo bởi trình điều khiển MongoDB, nói chuyện với MongoDB. Vì vậy, điều này mang lại rất nhiều lợi thế
- Bạn không cần đợi MongoDB tạo mã định danh duy nhất mới
- Các ứng dụng của MongoDB có khả năng mở rộng cao
- Bạn có thể tạo một số phiên bản của MongoDB
- Không cần phải nói chuyện với một nơi trung tâm để có được một mã định danh duy nhất
Thuộc tính của ID đối tượng
ID đối tượng dài 24 ký tự với hai ký tự chiếm tối đa một byte, do đó chứa tổng cộng 12 byte. Đây là những gì 12 byte của ID đối tượng cho chúng ta biết
dấu thời gian
Bốn byte đầu tiên của ID đối tượng biểu thị dấu thời gian khi tài liệu được tạo. Chúng tôi tránh phải tạo một thuộc tính riêng trong tài liệu, chẳng hạn như created-at
và do đó có thể tiết kiệm thời gian và có các dòng mã được tối ưu hóa
Do sự đóng góp của dấu thời gian cho ID đối tượng, chúng tôi có thể có được thời gian khi tài liệu được tạo bằng cách chỉ tham khảo ID. Do đó, khi truy vấn dữ liệu, chúng tôi không cần một phương pháp khác để sắp xếp tài liệu theo dấu thời gian
Bạn có thể lấy dấu thời gian của một đối tượng bằng cách sử dụng các lệnh sau
const mongoose = require['mongoose'];// Create object Id on memory
const id = new mongoose.Types.ObjectId[];// Get timestamp
console.log[id.getTimestamp[]];
mã định danh máy
Ba byte tiếp theo đại diện cho mã định danh máy [i. e. máy mà tài liệu được tạo trên đó]. Giả sử hai tài liệu được tạo cùng lúc trên các máy khác nhau. Ba byte này sẽ khác nhau, làm tăng thêm tính duy nhất của ID đối tượng
định danh quy trình
Hai byte tiếp theo đại diện cho định danh quy trình [i. e. quy trình trong máy mà tài liệu được tạo trên đó]. Giả sử hai tài liệu được tạo cùng lúc trên cùng một máy nhưng với các quy trình khác nhau. Hai byte này sẽ khác nhau, làm tăng thêm tính duy nhất của ID đối tượng
Phản đối
Ba byte cuối cùng đại diện cho một bộ đếm. Bộ đếm này là một số tăng tự động tương tự như các biến bộ đếm khác trong cơ sở dữ liệu SQL và NoSQL, làm cho ID đối tượng trở thành duy nhất [trong SQL, điều này có thể cản trở khả năng mở rộng]. Giả sử hai tài liệu được tạo cùng lúc trên cùng một máy và trên cùng một quy trình. Các byte bộ đếm sẽ khác nhau, góp phần tạo nên tính duy nhất của ID đối tượng
Vấn đề ID đối tượng
Trong MongoDB, một vấn đề phát sinh với bộ đếm trong ID đối tượng có thể hạn chế tính duy nhất của nó
ID đối tượng chỉ là duy nhất miễn là bộ đếm không tràn
Sự cố tràn bộ đếm xảy ra khi bộ đếm đã đạt đến công suất tối đa, dẫn đến các tài liệu có cùng ID đối tượng. Do đó, ID đối tượng gần như là duy nhất nhưng không phải là duy nhất 100%
Đây là lý do tại sao. Bộ đếm đang được phân bổ ba byte. Điều này có nghĩa là nó có khả năng đại diện cho tới 16 triệu số. Nếu nhiều tài liệu đó được tạo cùng lúc, trên cùng một máy và cùng một quy trình, thì hai tài liệu có thể chia sẻ cùng một ID đối tượng
Sử dụng Mongoose
Khi xây dựng ứng dụng bằng Node. js và Express. js, chúng tôi sử dụng cầy mangut. Mongoose là một sự trừu tượng hóa trên trình điều khiển MongoDB. Do đó, khi tạo tài liệu, cầy mangut sẽ nói chuyện với trình điều khiển MongoDB để tạo ID đối tượng mới
Tạo ID đối tượng
// create an object id on memory - Not on DB!const mongoose = require['mongoose'];const id = mongoose.Types.ObjectId[];
console.log[id];// output -> 5f1819229fdf8a0c7c2d8c36
Xác thực ID đối tượng
Với cầy mangut, bạn cũng có thể xác thực tĩnh ID đối tượng bằng cách sử dụng thuộc tính isValid
Phần kết luận
ID đối tượng MongoDB là duy nhất trừ khi đạt đến một kịch bản nhất định [đã thảo luận ở trên]. Do đó, với tư cách là nhà phát triển phần mềm, chúng ta nên xem xét quy mô và độ phức tạp của hệ thống để đánh đổi giữa ID được tạo tự động và ID đối tượng tùy chỉnh
Cách tiếp cận hoàn toàn do bạn quyết định. Để biết thêm thông tin về ID đối tượng MongoDB, bạn có thể tham khảo tài liệu chính thức của MongoDB và Mongoose
Tôi hy vọng câu chuyện này đã giáo dục bạn về tính duy nhất và độ tin cậy của ID đối tượng trong MongoDB. Hãy vui vẻ học tập và tận hưởng mã hóa