Tôi đang xem xét viết lại một ứng dụng VB dựa trên tiền đề (được cài đặt cục bộ) (lập hóa đơn + hàng tồn kho) dưới dạng một ứng dụng Clojure dựa trên web cho các khách hàng doanh nghiệp nhỏ. Tôi dự định sẽ được cung cấp dưới dạng ứng dụng SaaS cho khách hàng trong giao dịch tương tự.
Tôi đã xem xét các tùy chọn cơ sở dữ liệu: Lựa chọn của tôi là RDBMS: Postgresql / MySQL. Tôi có thể mở rộng tới 400 người dùng trong năm đầu tiên, thường là 20-40 lượt xem trang / ngày cho mỗi người dùng - chủ yếu cho các giao dịch không phải là chế độ xem tĩnh. Mỗi chế độ xem sẽ liên quan đến tìm nạp dữ liệu và cập nhật dữ liệu. Tuân thủ ACID là cần thiết (hoặc tôi nghĩ vậy). Vì vậy, khối lượng giao dịch không lớn.
Sẽ không có gì phải đắn đo khi chọn một trong hai tùy theo sở thích của tôi, nhưng với yêu cầu này, mà tôi tin là điển hình của ứng dụng SaaS: Schema sẽ thay đổi khi tôi thêm nhiều khách hàng / người dùng và cho mỗi khách hàng thay đổi yêu cầu kinh doanh (tôi sẽ cung cấp một số linh hoạt hạn chế chỉ để bắt đầu). Vì tôi không phải là chuyên gia DB, dựa trên những gì tôi có thể nghĩ và đã đọc, tôi có thể xử lý việc đó theo một số cách:
- Có một thiết kế lược đồ RDBMS truyền thống trong MySQl / Postgresql với một DB thuê nhiều người thuê. Và thêm đủ các cột "thả nổi tự do" vào mỗi bảng để cho phép thay đổi trong tương lai khi tôi thêm nhiều khách hàng hoặc thay đổi cho một khách hàng hiện tại. Điều này có thể có một nhược điểm của việc truyền bá các thay đổi cho DB mỗi khi một thay đổi nhỏ được thực hiện cho Schema. Tôi nhớ đọc rằng trong các cập nhật lược đồ Postgresql có thể được thực hiện theo thời gian thực mà không cần khóa. Nhưng không chắc chắn, nó đau đớn hay thực tế như thế nào trong trường hợp sử dụng này. Ngoài ra, vì các thay đổi lược đồ cũng có thể giới thiệu các thay đổi SQL mới / nhỏ.
- Có RDBMS, nhưng thiết kế lược đồ cơ sở dữ liệu một cách linh hoạt: gần với giá trị thực thể-thuộc tính hoặc chỉ là kho lưu trữ khóa-giá trị. (Ngày làm việc, FriendFeed chẳng hạn)
- Có toàn bộ vật trong bộ nhớ dưới dạng đối tượng và lưu trữ chúng trong tệp nhật ký theo định kỳ. (Ví dụ: edval, lmax)
- Sử dụng DB NoQuery như MongoDB hoặc Redis. Nhưng dựa trên những gì tôi có thể thu thập, chúng không phù hợp với trường hợp sử dụng này và không tuân thủ ACID hoàn toàn.
- Sử dụng một số Dbs NewQuery như VoltDb hoặc JustoneDb (dựa trên đám mây) giữ lại hành vi tuân thủ SQL và ACID và là RDBMS "thế hệ mới".
- Tôi đã xem neo4j (graphdb), nhưng không chắc nó có phù hợp với trường hợp sử dụng này không
Trong trường hợp sử dụng của tôi, hơn cả khả năng mở rộng hoặc tính toán phân tán, tôi đang xem xét một cách tốt hơn để đạt được "Tính linh hoạt trong Lược đồ + ACID + một số Hiệu suất hợp lý". Hầu hết các bài viết tôi có thể tìm thấy trên mạng đều nói về tính linh hoạt trong lược đồ là nguyên nhân dẫn đến hiệu suất (trong trường hợp của NoQuery DB) và khả năng mở rộng trong khi bỏ qua bên ACID / Giao dịch.
Đây có phải là trường hợp "một hoặc hoặc" tính linh hoạt của lược đồ so với ACID 'hoặc có cách nào tốt hơn không?