Vì vậy, để trả lời trực tiếp các câu hỏi ...
Lưu trữ vô hướng chắc chắn là một lý do thuyết phục để sử dụng MongoDB, nhưng như bạn đã chỉ ra, việc lưu trữ JSON trong RDBMS cũng khá dễ dàng. Sức mạnh đằng sau MongoDB nằm ở các truy vấn phong phú chống lại việc lưu trữ không sử dụng schemaless.
Nếu tôi có thể chỉ ra một lỗ hổng nhỏ trong hình minh họa về việc cập nhật trường JSON, thì đó không chỉ là vấn đề lấy giá trị hiện tại, cập nhật tài liệu và sau đó đẩy nó trở lại cơ sở dữ liệu. Tất cả quy trình phải được gói gọn trong một giao dịch. Các giao dịch có xu hướng khá đơn giản, cho đến khi bạn bắt đầu chuẩn hóa cơ sở dữ liệu của mình. Sau đó, một cái gì đó đơn giản như ghi lại một ủng hộ có thể khóa các bảng trên lược đồ của bạn.
Với MongoDB, không có giao dịch nào. Nhưng các hoạt động hầu như luôn có thể được cấu trúc theo cách cho phép cập nhật nguyên tử. Điều này thường liên quan đến một số thay đổi đáng kể từ các mô hình SQL, nhưng theo ý kiến của tôi, chúng khá rõ ràng khi bạn ngừng cố gắng buộc các đối tượng vào bảng. Ít nhất, rất nhiều người khác đã gặp phải những vấn đề tương tự mà bạn sẽ gặp phải và cộng đồng Mongo có xu hướng khá cởi mở và lên tiếng về những thách thức mà họ đã vượt qua.
Bằng cách "ghi an toàn", tôi cho rằng ý bạn là tùy chọn bật "getLastError ()" tự động sau mỗi lần ghi. Chúng ta có một lớp bao bọc rất mỏng trên DBCollection cho phép chúng ta kiểm soát chi tiết khi getLastError () được gọi. Tuy nhiên, chính sách của chúng tôi không dựa trên mức độ "quan trọng" của dữ liệu, mà dựa trên việc mã theo sau truy vấn có mong đợi bất kỳ sửa đổi nào sẽ hiển thị ngay lập tức trong các lần đọc sau hay không.
Nói chung, đây vẫn là một chỉ báo kém và thay vào đó, chúng tôi đã chuyển sang findAndModify () cho cùng một hành vi. Trong trường hợp chúng ta vẫn gọi getLastError () một cách rõ ràng, đó là khi cơ sở dữ liệu có khả năng từ chối ghi, chẳng hạn như khi chúng ta chèn () với _id có thể là một bản sao.
Tôi e rằng tôi không thể nói liệu chính sách sao lưu / khôi phục của chúng tôi có hiệu quả hay không vì chúng tôi chưa phải khôi phục. Chúng tôi đang tuân theo các khuyến nghị của MongoDB để sao lưu; @ mark-hillick đã làm rất tốt khi tóm tắt những điều đó. Chúng tôi đang sử dụng các bộ bản sao và chúng tôi đã di chuyển các phiên bản MongoDB cũng như giới thiệu các thành viên bản sao mới. Cho đến nay, chúng tôi không có thời gian ngừng hoạt động, vì vậy tôi không chắc mình có thể nói tốt cho đến thời điểm này.
Vì vậy, theo kinh nghiệm của tôi, MongoDB cung cấp lưu trữ dữ liệu không toán học với một tập hợp các truy vấn nguyên thủy đủ phong phú để các giao dịch thường có thể được thay thế bằng các phép toán nguyên tử. Thật khó để mở ra hơn 10 năm kinh nghiệm SQL, nhưng mọi vấn đề tôi gặp phải đều được cộng đồng hoặc 10gen giải quyết trực tiếp. Chúng tôi đã không bị mất dữ liệu hoặc có bất kỳ thời gian chết nào mà tôi có thể nhớ lại.
Nói một cách đơn giản, MongoDB là hệ sinh thái lưu trữ dữ liệu tốt nhất mà tôi từng sử dụng về khả năng truy vấn, bảo trì, khả năng mở rộng và độ tin cậy. Trừ khi tôi có một ứng dụng có quan hệ rõ ràng đến mức tôi không thể sử dụng bất kỳ thứ gì khác ngoài SQL, tôi sẽ cố gắng hết sức để sử dụng MongoDB.
Tôi không làm việc cho 10gen, nhưng tôi rất biết ơn những người đã làm việc đó.