Tôi chỉ mới bắt đầu với DB không quan hệ và tôi vẫn đang cố gắng nghiên cứu nó và tìm ra mô hình tốt nhất sẽ là gì. Và tôi chỉ có thể nói cho CouchDB.
Tuy nhiên, tôi có một số kết luận sơ bộ:
Bạn đã nghĩ ra những thiết kế thay thế hoạt động tốt hơn nhiều trong thế giới phi quan hệ chưa?
Trọng tâm thiết kế thay đổi: Thiết kế của mô hình tài liệu (tương ứng với các bảng DB) trở nên gần như không liên quan, trong khi mọi thứ xoay quanh việc thiết kế các khung nhìn (tương ứng với các truy vấn).
Loại DB tài liệu hoán đổi sự phức tạp: SQL có dữ liệu không linh hoạt và các truy vấn linh hoạt, DB tài liệu thì ngược lại.
Mô hình CouchDB là một tập hợp các "tài liệu JSON" (về cơ bản là các bảng băm lồng nhau). Mỗi tài liệu có một ID duy nhất và có thể được truy xuất bằng ID. Đối với bất kỳ truy vấn nào khác, bạn viết "khung nhìn", được đặt tên là tập hợp các hàm ánh xạ / thu gọn. Các khung nhìn trả về một tập hợp kết quả dưới dạng danh sách các cặp khóa / giá trị.
Bí quyết là bạn không truy vấn cơ sở dữ liệu theo nghĩa bạn truy vấn cơ sở dữ liệu SQL: Kết quả của việc chạy các hàm dạng xem được lưu trữ trong một chỉ mục và chỉ chỉ mục mới có thể được truy vấn. (Như "lấy mọi thứ", "lấy khóa" hoặc "nhận phạm vi khóa".)
Tương tự gần nhất trong thế giới SQL sẽ là nếu bạn chỉ có thể truy vấn DB bằng các thủ tục được lưu trữ - mọi truy vấn bạn muốn hỗ trợ phải được xác định trước.
Thiết kế của các tài liệu rất linh hoạt. Tôi chỉ tìm thấy hai hạn chế:
- Giữ các dữ liệu liên quan cùng nhau trong cùng một tài liệu, vì không có gì tương ứng với một phép nối.
- Đừng làm cho các tài liệu quá lớn để chúng được cập nhật quá thường xuyên (như đặt tất cả doanh số bán hàng của công ty trong năm vào cùng một tài liệu), vì mọi bản cập nhật tài liệu đều kích hoạt lập chỉ mục lại.
Nhưng mọi thứ đều xoay quanh việc thiết kế các khung nhìn.
Các thiết kế thay thế mà tôi đã nhận thấy rằng các thứ tự công việc có quy mô tốt hơn với CouchDB so với bất kỳ cơ sở dữ liệu SQL nào là ở cấp hệ thống hơn là cấp lưu trữ. Nếu bạn có một số dữ liệu và muốn cung cấp chúng cho một trang web, độ phức tạp của toàn bộ hệ thống sẽ giảm ít nhất 50%:
- không thiết kế bảng DB (vấn đề nhỏ)
- không có lớp trung gian ODBC / JDBC, tất cả các truy vấn và giao dịch qua http (vấn đề vừa phải)
- ánh xạ DB-tới-đối tượng đơn giản từ JSON, điều này gần như không đáng kể so với ánh xạ tương tự trong SQL (quan trọng!)
- bạn có thể bỏ qua toàn bộ máy chủ ứng dụng, vì bạn có thể thiết kế tài liệu của mình để trình duyệt truy xuất trực tiếp bằng AJAX và thêm một chút đánh bóng JavaScript trước khi chúng được hiển thị dưới dạng HTML. (KHỔNG LỒ!!)
Đối với các ứng dụng web thông thường, DB dựa trên tài liệu / JSON là một chiến thắng lớn và nhược điểm của các truy vấn kém linh hoạt và một số mã bổ sung để xác thực dữ liệu có vẻ là một cái giá nhỏ phải trả.
Bạn đã từng đập đầu vào bất cứ điều gì tưởng như không thể chưa?
Chưa. Ánh xạ / thu nhỏ như một phương tiện truy vấn cơ sở dữ liệu không quen thuộc và đòi hỏi nhiều tư duy hơn so với viết SQL. Có một số lượng khá nhỏ các nguyên tắc ban đầu, vì vậy việc nhận được kết quả bạn cần chủ yếu là vấn đề sáng tạo với cách bạn chỉ định các khóa.
Có một hạn chế là các truy vấn không thể xem hai hoặc nhiều tài liệu cùng một lúc - không có liên kết hoặc các loại mối quan hệ đa tài liệu khác, nhưng cho đến nay không có gì là không thể vượt qua.
Như một giới hạn ví dụ, việc đếm và tổng rất dễ dàng nhưng không thể tính giá trị trung bình bằng chế độ xem / truy vấn CouchDB. Khắc phục: Trả lại tổng và đếm riêng và tính giá trị trung bình trên máy khách.
Bạn đã thu hẹp khoảng cách với bất kỳ mẫu thiết kế nào, ví dụ như dịch từ cái này sang cái kia chưa?
Tôi không chắc điều đó khả thi. Nó giống như một thiết kế lại hoàn chỉnh, giống như dịch một chương trình kiểu chức năng sang kiểu hướng đối tượng. Nói chung, có ít loại tài liệu hơn nhiều so với các bảng SQL và nhiều dữ liệu hơn trong mỗi tài liệu.
Một cách để nghĩ về nó là xem SQL của bạn để biết các chèn và các truy vấn phổ biến: Ví dụ: bảng và cột nào được cập nhật khi khách hàng đặt hàng? Và cái nào cho báo cáo bán hàng hàng tháng? Thông tin đó có lẽ nên đi trong cùng một tài liệu.
Đó là: Một tài liệu cho Đơn đặt hàng, chứa ID khách hàng và ID sản phẩm, với các trường được sao chép nếu cần để đơn giản hóa các truy vấn. Bất kỳ thứ gì trong tài liệu đều có thể được truy vấn dễ dàng, bất kỳ thứ gì yêu cầu tham chiếu chéo giữa Đơn đặt hàng và Khách hàng phải được thực hiện bởi khách hàng. Vì vậy, nếu bạn muốn có một báo cáo về doanh số bán hàng theo khu vực, có lẽ bạn nên đặt mã vùng vào đơn đặt hàng.
Bây giờ bạn có thực hiện các mô hình dữ liệu rõ ràng không (ví dụ: trong UML)?
Xin lỗi, chưa bao giờ làm nhiều UML trước các DB tài liệu :)
Nhưng bạn cần một số loại mô hình cho biết trường nào thuộc tài liệu nào và chúng chứa những loại giá trị nào. Cả hai đều để bạn tham khảo sau này và để đảm bảo rằng mọi người sử dụng DB đều biết các quy ước. Ví dụ: vì bạn không còn gặp lỗi nếu bạn lưu trữ ngày trong trường văn bản và bất kỳ ai cũng có thể thêm hoặc xóa bất kỳ trường nào mà họ cảm thấy thích, nên bạn cần cả mã xác thực và quy ước để giải quyết vấn đề. Đặc biệt nếu bạn làm việc với các nguồn lực bên ngoài.
Bạn có bỏ lỡ bất kỳ dịch vụ bổ sung chính nào mà RDBMSes cung cấp không?
Không. Nhưng nền tảng của tôi là nhà phát triển ứng dụng web, chúng tôi chỉ xử lý cơ sở dữ liệu trong phạm vi mà chúng tôi phải :)
Một công ty mà tôi từng làm việc đã tạo ra một sản phẩm (ứng dụng web) được thiết kế để chạy trên cơ sở dữ liệu SQL từ nhiều nhà cung cấp và các "dịch vụ bổ sung" rất khác nhau giữa DB với DB đến nỗi chúng phải được triển khai riêng cho từng DB. Vì vậy, việc di chuyển chức năng ra khỏi RDBMS sẽ ít công việc hơn đối với chúng tôi. Điều này thậm chí còn mở rộng sang tìm kiếm toàn văn bản.
Vì vậy, bất cứ điều gì tôi đang từ bỏ là điều mà tôi chưa bao giờ thực sự có được ngay từ đầu. Rõ ràng, trải nghiệm của bạn có thể khác.
Lưu ý: Những gì tôi đang làm bây giờ là một ứng dụng web cho dữ liệu tài chính, báo giá cổ phiếu và những thứ tương tự. Đây là một kết hợp rất tốt cho một DB tài liệu, theo quan điểm của tôi, tôi nhận được tất cả những lợi ích của một DB (tính bền bỉ và truy vấn) mà không gặp bất kỳ rắc rối nào.
Nhưng các dữ liệu này khá độc lập với nhau, không có các truy vấn quan hệ phức tạp. Nhận báo giá mới nhất theo mã, nhận báo giá theo mã và phạm vi ngày, nhận thông tin meta của công ty, đó là tất cả. Một ví dụ khác mà tôi đã thấy là một ứng dụng blog và các blog cũng không được đặc trưng bởi các lược đồ cơ sở dữ liệu phức tạp.
Điều tôi đang cố gắng nói là tất cả các ứng dụng thành công của DB tài liệu mà tôi biết đều có dữ liệu không có nhiều mối liên hệ với nhau ngay từ đầu: Tài liệu (như trong tìm kiếm của Google), bài đăng trên blog, tin bài, dữ liệu tài chính .
Tôi hy vọng rằng có những bộ dữ liệu ánh xạ tốt hơn tới SQL hơn là mô hình tài liệu, vì vậy tôi tưởng tượng rằng SQL sẽ tồn tại.
Nhưng đối với những người trong chúng ta chỉ muốn một cách đơn giản để lưu trữ và truy xuất dữ liệu - và tôi nghi ngờ rằng có nhiều người trong chúng ta - cơ sở dữ liệu tài liệu (như trong CouchDB) là một món quà trời cho.