51

Tôi có hai bảng/bộ sưu tập; Người dùng và nhóm. Người dùng có thể là thành viên của bất kỳ số lượng nhóm nào và người dùng cũng có thể là chủ sở hữu của bất kỳ số lượng nhóm nào. Trong một cơ sở dữ liệu quan hệ, tôi có thể có một bảng thứ ba được gọi là UserGroups với một cột UserID, một cột GroupID và một cột IsOwner.Cách tổ chức quan hệ nhiều đến nhiều trong MongoDB

Tôi đang sử dụng MongoDB và tôi chắc chắn có một cách tiếp cận khác cho loại quan hệ này trong cơ sở dữ liệu tài liệu. Tôi có nên nhúng danh sách các nhóm và nhóm làm chủ sở hữu bên trong bảng Người dùng dưới dạng hai mảng của ObjectID không? Tôi có nên lưu trữ danh sách các thành viên và chủ sở hữu trong bảng Nhóm dưới dạng hai mảng, phản ánh hiệu quả mối quan hệ gây ra sự sao chép thông tin quan hệ không?

Hoặc là một bảng UserGroups bắc cầu một khái niệm hợp pháp trong cơ sở dữ liệu tài liệu cho nhiều mối quan hệ?

Cảm ơn

+0

Xem thêm câu trả lời cho [câu hỏi này] (http://stackoverflow.com/questions/2336700/mongodb-many-to-many-association) và [câu hỏi này] (http://stackoverflow.com/questions/ 5498692/nhiều-to-nhiều-mối quan hệ-trong-couchdb-hoặc-mongodb) –

+0

Tôi biết điều này là khá cũ nhưng tôi tự hỏi về quy mô là tốt.Nếu bạn có 1000 nhóm thì sao? – FarscapePROJ

+0

Điểm tuyệt vời-- Một tùy chọn khác, trong trường hợp này, là sử dụng tương đương với mối quan hệ giao tiếp từ cơ sở dữ liệu SQL - bộ sưu tập trung gian có hai khóa ngoài cho mỗi bộ sưu tập liên quan. Trong trường hợp này, bạn có thể thực hiện 3 truy vấn: (1) tìm kiếm bình thường() để nhận kết quả gốc, (2) truy vấn IN để nhận kết quả trung gian, và cuối cùng (3) truy vấn IN bằng cách sử dụng khóa ngoài trong kết quả trung gian để tìm hồ sơ trẻ em. (Đây là cách chúng tôi thực hiện tính năng này trong Đường nước) – mikermcneil

Trả lời

34

Điều tôi đã thực hiện và những gì tôi hiện đang sử dụng là các mảng được nhúng với id nút trong mỗi tài liệu.

Vì vậy, tài liệu user1 có các nhóm thuộc tính: [id1, id2]

Và nhóm tài liệu1 có người dùng tài sản: [user1]. Nhóm tài liệu 2 cũng có người dùng thuộc tính: [user1].

Bằng cách này bạn sẽ nhận được đối tượng Nhóm và dễ dàng chọn tất cả người dùng có liên quan và giống với Người dùng.

Việc này cần nhiều công việc hơn một chút khi tạo và cập nhật đối tượng. Khi bạn nói 2 đối tượng có liên quan, bạn phải cập nhật cả hai đối tượng.

Ngoài ra còn có một khái niệm DBReferences trong MongoDB và tùy thuộc vào trình điều khiển của bạn, nó sẽ tự động kéo đối tượng tham chiếu khi truy xuất tài liệu.

http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-DBRef

+0

Cảm ơn tuyệt vời vì đã chỉ cho tôi các tài liệu. Có ý nghĩa bây giờ, nó là một cách tiếp cận khác nhau và linh hoạt hơn và thực hiện nó thú vị để có được vào công cụ này. Ngoài ra http://www.mongodb.org/display/DOCS/Schema+Design –

+7

Chỉ cần nhìn thấy Kyle Banker trả lời câu hỏi của tôi ở phút 29 vào video trình bày này: http://www.blip.tv/file/3704083. Không bao giờ sử dụng một bảng nối để đại diện cho nhiều-nhiều, thay vào đó có một danh sách các đối tượng trong cả hai bộ sưu tập –

+8

Quy mô này như thế nào? Việc có danh sách người dùng trong tài liệu nhóm có thể mất kiểm soát nhanh chóng khi bạn có khả năng là hàng nghìn người dùng phải không? – PJH

2

Hãy hiểu nhiều nhiều quan hệ với một ví dụ

  • sách cho tác giả
  • sinh viên để giáo viên

Những cuốn sách cho tác giả là một vài đến vàimối quan hệ, vì vậy chúng tôi có thể có một mảng sách hoặc tác giả trong tài liệu của người khác nt. Cùng đi cho sinh viên với giáo viên. Chúng tôi cũng có thể nhúng vào nguy cơ trùng lặp. Tuy nhiên điều này sẽ yêu cầu mỗi học sinh có một giáo viên trong hệ thống trước khi chèn và ngược lại. Logic ứng dụng luôn có thể không cho phép nó. Nói cách khác, đối tượng cha mẹ phải tồn tại cho đối tượng con tồn tại.

Nhưng khi bạn có nhiều mối quan hệ, hãy sử dụng hai bộ sưu tập và có liên kết thực sự.

1

Trong trường hợp bất kỳ ai quan tâm, tôi chỉ chạm vào một bài viết rất hay được đăng trong blog mongoDB. 6 Rules of Thumb for MongoDB Schema Design. Có 3 phần trong bài viết này, sau khi đọc tất cả 3 bạn sẽ có một sự hiểu biết tốt.