Tôi biết có những câu hỏi tương tự ở đây nhưng họ đang bảo tôi chuyển về hệ thống RDBMS thông thường nếu tôi cần giao dịch hoặc sử dụng các hoạt động nguyên tử hoặc cam kết hai pha . Giải pháp thứ hai có vẻ là sự lựa chọn tốt nhất. Thứ ba tôi không muốn làm theo vì dường như nhiều điều có thể sai và tôi không thể kiểm tra nó ở mọi khía cạnh. Tôi đang gặp khó khăn trong việc tái cấu trúc dự án của mình để thực hiện các hoạt động nguyên tử. Tôi không biết liệu điều này xuất phát từ quan điểm hạn chế của tôi (tôi mới chỉ làm việc với cơ sở dữ liệu SQL) hoặc liệu nó có thực sự không thể thực hiện được hay không.
Chúng tôi muốn thử nghiệm MongoDB tại công ty của chúng tôi. Chúng tôi đã chọn một dự án tương đối đơn giản - một cổng SMS. Nó cho phép phần mềm của chúng tôi gửi tin nhắn SMS đến mạng di động và cổng thực hiện công việc bẩn thỉu: thực sự giao tiếp với các nhà cung cấp thông qua các giao thức truyền thông khác nhau. Cổng cũng quản lý việc thanh toán các tin nhắn. Mỗi khách hàng đăng ký dịch vụ phải mua một số tín dụng. Hệ thống tự động giảm số dư của người dùng khi tin nhắn được gửi và từ chối quyền truy cập nếu số dư không đủ. Cũng bởi vì chúng tôi là khách hàng của các nhà cung cấp SMS của bên thứ ba, chúng tôi cũng có thể có số dư riêng với họ. Chúng tôi phải theo dõi những người là tốt.
Tôi bắt đầu suy nghĩ về cách tôi có thể lưu trữ dữ liệu cần thiết với MongoDB nếu tôi giảm bớt một số phức tạp (thanh toán bên ngoài, gửi tin nhắn SMS xếp hàng). Đến từ thế giới SQL, tôi sẽ tạo một bảng riêng cho người dùng, một bảng khác cho tin nhắn SMS và một bảng để lưu trữ các giao dịch liên quan đến số dư của người dùng. Giả sử tôi tạo các bộ sưu tập riêng cho tất cả những người trong MongoDB.
Hãy tưởng tượng một tác vụ gửi SMS với các bước sau trong hệ thống đơn giản này:
kiểm tra xem người dùng có đủ số dư hay không; từ chối truy cập nếu không đủ tín dụng
gửi và lưu trữ tin nhắn trong bộ sưu tập SMS với các chi tiết và chi phí (trong hệ thống trực tiếp, tin nhắn sẽ có một
status
thuộc tính và một nhiệm vụ sẽ nhận nó để gửi và đặt giá của SMS theo trạng thái hiện tại của nó)giảm số dư của người dùng bằng chi phí của tin nhắn đã gửi
đăng nhập giao dịch trong bộ sưu tập giao dịch
Bây giờ vấn đề với điều đó là gì? MongoDB chỉ có thể cập nhật nguyên tử trên một tài liệu. Trong luồng trước, có thể xảy ra một số loại lỗi xuất hiện và thông báo được lưu trữ trong cơ sở dữ liệu nhưng số dư của người dùng không được cập nhật và / hoặc giao dịch không được ghi lại.
Tôi đã đưa ra hai ý tưởng:
Tạo một bộ sưu tập duy nhất cho người dùng và lưu trữ số dư dưới dạng một trường, các giao dịch và tin nhắn liên quan đến người dùng dưới dạng tài liệu phụ trong tài liệu của người dùng. Bởi vì chúng tôi có thể cập nhật tài liệu nguyên tử, điều này thực sự giải quyết được vấn đề giao dịch. Nhược điểm: nếu người dùng gửi nhiều tin nhắn SMS, kích thước của tài liệu có thể trở nên lớn và giới hạn tài liệu 4MB có thể đạt được. Có lẽ tôi có thể tạo tài liệu lịch sử trong các tình huống như vậy, nhưng tôi không nghĩ đây sẽ là một ý tưởng hay. Ngoài ra tôi không biết hệ thống sẽ nhanh đến mức nào nếu tôi đẩy ngày càng nhiều dữ liệu vào cùng một tài liệu lớn.
Tạo một bộ sưu tập cho người dùng và một bộ sưu tập. Có thể có hai loại giao dịch: mua tín dụng với thay đổi số dư dương và tin nhắn được gửi với thay đổi số dư âm. Giao dịch có thể có một tiểu khu; ví dụ trong các tin nhắn được gửi, các chi tiết của SMS có thể được nhúng trong giao dịch. Nhược điểm: Tôi không lưu trữ số dư người dùng hiện tại vì vậy tôi phải tính toán số dư mỗi khi người dùng cố gắng gửi tin nhắn để cho biết tin nhắn có thể đi qua hay không. Tôi sợ tính toán này có thể trở nên chậm khi số lượng giao dịch được lưu trữ tăng lên.
Tôi hơi bối rối về việc chọn phương pháp nào. Có giải pháp nào khác không? Tôi không thể tìm thấy bất kỳ thực tiễn tốt nhất trực tuyến nào về cách khắc phục các loại vấn đề này. Tôi đoán rằng nhiều lập trình viên đang cố gắng làm quen với thế giới NoQuery đang phải đối mặt với những vấn đề tương tự ngay từ đầu.