Tôi có cùng một vấn đề cần giải quyết và cũng đang xem xét các biến thể. Vì tôi đã có nhiều năm kinh nghiệm tạo các ứng dụng dành cho nhiều người thuê SaaS nên tôi cũng sẽ chọn tùy chọn thứ hai dựa trên kinh nghiệm trước đây của tôi với cơ sở dữ liệu quan hệ.
Trong khi thực hiện nghiên cứu của mình, tôi đã tìm thấy bài viết này trên trang web hỗ trợ mongodb (đã thêm từ khi nó không còn nữa):
https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-case/multi -tenant.html
Các chàng trai đã tuyên bố tránh các tùy chọn thứ 2 bằng bất kỳ giá nào, theo tôi hiểu không phải là đặc biệt cụ thể cho mongodb. Ấn tượng của tôi là điều này có thể áp dụng cho hầu hết các dbs NoSQL mà tôi đã nghiên cứu (CoachDB, Cassandra, CouchBase Server, v.v.) do các chi tiết cụ thể của thiết kế cơ sở dữ liệu.
Các bộ sưu tập (hoặc nhóm hoặc tuy nhiên chúng gọi nó trong các DB khác nhau) không giống như các lược đồ bảo mật trong RDBMS mặc dù chúng hoạt động như một vùng chứa cho các tài liệu mà chúng vô dụng để áp dụng tách biệt đối tượng thuê. Tôi không thể tìm thấy cơ sở dữ liệu NoSQL có thể áp dụng các hạn chế bảo mật dựa trên bộ sưu tập.
Tất nhiên bạn có thể sử dụng bảo mật dựa trên vai trò mongodb để hạn chế quyền truy cập ở cấp cơ sở dữ liệu / máy chủ. ( http://docs.mongodb.org/manual/core/authorization/ )
Tôi muốn giới thiệu lựa chọn đầu tiên khi:
- Bạn có đủ thời gian và nguồn lực để giải quyết sự phức tạp của việc thiết kế, triển khai và thử nghiệm kịch bản này.
- Nếu bạn sẽ không có nhiều khác biệt về cấu trúc và chức năng trong cơ sở dữ liệu cho những người thuê khác nhau.
- Thiết kế ứng dụng của bạn sẽ cho phép người thuê chỉ thực hiện các tùy chỉnh tối thiểu trong thời gian chạy.
- Nếu bạn muốn tối ưu hóa không gian và giảm thiểu việc sử dụng tài nguyên phần cứng.
- Nếu bạn sắp có hàng nghìn người thuê.
- Nếu bạn muốn mở rộng quy mô nhanh và chi phí tốt.
- Nếu bạn KHÔNG sao lưu dữ liệu dựa trên người thuê (giữ các bản sao lưu riêng biệt cho từng người thuê). Có thể làm được điều đó ngay cả trong trường hợp này nhưng nỗ lực sẽ rất lớn.
Tôi sẽ chuyển sang biến thể 3 nếu:
- Bạn sẽ có một danh sách nhỏ những người thuê (vài trăm).
- Các chi tiết cụ thể của doanh nghiệp đòi hỏi bạn phải có khả năng hỗ trợ những khác biệt lớn trong cấu trúc cơ sở dữ liệu cho các đối tượng thuê khác nhau (ví dụ: tích hợp với hệ thống của bên thứ 3, nhập - xuất dữ liệu).
- Thiết kế ứng dụng của bạn sẽ cho phép khách hàng (người thuê) thực hiện những thay đổi đáng kể trong thời gian chạy ứng dụng (thêm mô-đun, tùy chỉnh các trường, v.v.).
- Nếu bạn có đủ tài nguyên để mở rộng quy mô với các nút phần cứng mới một cách nhanh chóng.
- Nếu bạn được yêu cầu giữ các phiên bản / bản sao lưu dữ liệu cho mỗi người thuê. Ngoài ra việc khôi phục sẽ dễ dàng.
- Có những hạn chế pháp lý / quy định buộc bạn phải giữ những người thuê khác nhau trong các cơ sở dữ liệu khác nhau (thậm chí cả trung tâm dữ liệu).
- Nếu bạn muốn sử dụng đầy đủ các tính năng bảo mật của mongodb chẳng hạn như role.
- Có sự khác biệt lớn về quy mô giữa những người thuê (bạn có nhiều người thuê nhỏ và ít người thuê rất lớn).
Nếu bạn đăng thêm thông tin chi tiết về ứng dụng của mình, có lẽ tôi có thể cho bạn lời khuyên chi tiết hơn.