Tôi vừa vấp phải câu hỏi này và, mặc dù nó là một câu hỏi cũ, tôi nghĩ rằng sẽ rất hữu ích nếu thêm một vài khả năng không được đề cập trong các câu trả lời được đưa ra. Ngoài ra, mọi thứ đã thay đổi một chút trong vài năm qua, do đó, cần nhấn mạnh rằng SQL và NoQuery đang tiến gần nhau hơn.
Một trong những nhà bình luận đã đưa ra thái độ cảnh báo khôn ngoan rằng, nếu dữ liệu là quan hệ, hãy sử dụng mối quan hệ. Tuy nhiên, nhận xét đó chỉ có ý nghĩa trong thế giới quan hệ, nơi các lược đồ luôn đến trước ứng dụng.
THẾ GIỚI LIÊN QUAN: Dữ liệu cấu trúc> Viết ứng dụng để có được
NOSQL WORLD: Ứng dụng thiết kế> Dữ liệu cấu trúc phù hợp
Ngay cả khi dữ liệu là quan hệ, NoQuery vẫn là một tùy chọn. Ví dụ: các mối quan hệ một-nhiều không có vấn đề gì cả và được bao phủ rộng rãi trong các tài liệu MongoDB
GIẢI PHÁP 2015 ĐẾN VẤN ĐỀ 2010
Vì câu hỏi này đã được đăng, đã có những nỗ lực nghiêm túc trong việc đưa noQuery đến gần hơn với SQL. Nhóm được lãnh đạo bởi Yannis Papakonstantinou tại Đại học California (San Diego) đã làm việc trên FORWARD , một triển khai SQL ++ có thể sớm là giải pháp cho các vấn đề dai dẳng như được đăng ở đây.
Ở mức độ thực tế hơn, việc phát hành Couchbase 4.0 có nghĩa là, lần đầu tiên, bạn có thể thực hiện THAM GIA bản địa trong NoQuery. Họ sử dụng N1QL của riêng họ. Đây là một ví dụ về một JOIN
từ hướng dẫn của họ :
SELECT usr.personal_details, orders
FROM users_with_orders usr
USE KEYS "Elinor_33313792"
JOIN orders_with_users orders
ON KEYS ARRAY s.order_id FOR s IN usr.shipped_order_history END
N1QL cho phép hầu hết nếu không phải tất cả các hoạt động SQL bao gồm tổng hợp, lọc, v.v.
GIẢI PHÁP HYBRID KHÔNG-SO-NEW
Nếu MongoDB vẫn là lựa chọn duy nhất, thì tôi muốn quay lại quan điểm của mình rằng ứng dụng sẽ được ưu tiên hơn cấu trúc dữ liệu. Không có câu trả lời nào đề cập đến việc nhúng lai, theo đó, hầu hết dữ liệu được truy vấn được nhúng trong tài liệu / đối tượng và các tài liệu tham khảo được lưu giữ cho một số ít trường hợp.
Ví dụ: thông tin (ngoài tên vai trò) có thể chờ không? có thể bootstrapping ứng dụng nhanh hơn bằng cách không yêu cầu bất cứ điều gì mà người dùng chưa cần?
Đây có thể là trường hợp nếu người dùng đăng nhập và anh ấy cần phải xem tất cả các tùy chọn cho tất cả các vai trò mà anh ấy thuộc về. Tuy nhiên, người dùng là một Kỹ sư trực tuyến và các tùy chọn cho vai trò này hiếm khi được sử dụng. Điều này có nghĩa là ứng dụng chỉ cần hiển thị các tùy chọn cho một kỹ sư trong trường hợp anh ta muốn nhấp vào chúng.
Điều này có thể đạt được với một tài liệu cho ứng dụng biết khi bắt đầu (1) vai trò của người dùng và (2) nơi nhận thông tin về một sự kiện được liên kết với một vai trò cụ thể.
{_id: ObjectID(),
roles: [[“Engineer”, “ObjectId()”],
[“Administrator”, “ObjectId()”]]
}
Hoặc, thậm chí tốt hơn, lập chỉ mục trường role.name trong bộ sưu tập vai trò và bạn có thể không cần phải nhúng ObjectID ().
Một ví dụ khác: thông tin về TẤT CẢ các vai trò được yêu cầu TẤT CẢ thời gian?
Nó cũng có thể là trường hợp người dùng đăng nhập vào bảng điều khiển và 90% thời gian thực hiện các tác vụ được liên kết với vai trò của Kỹ sư trực. Việc nhúng lai có thể được thực hiện cho vai trò cụ thể đó một cách đầy đủ và chỉ giữ các tài liệu tham khảo cho phần còn lại.
{_id: ObjectID(),
roles: [{name: “Engineer”,
property1: value1,
property2: value2
},
[“Administrator”, “ObjectId()”]
]
}
Trở thành một schemaless không chỉ là một đặc điểm của NoQuery, nó có thể là một lợi thế trong trường hợp này. Nó hoàn toàn hợp lệ để lồng các loại đối tượng khác nhau trong thuộc tính của Roles của một đối tượng người dùng.