2014-08-29 16 views
6

Tôi hiểu rằng THAM GIA không thể hoặc không được tán thành trong cơ sở dữ liệu tài liệu. Tôi đến từ một nền tảng cơ sở dữ liệu quan hệ và cố gắng hiểu cách xử lý các tình huống như vậy.Nếu không có JOIN, cách nào đúng để xử lý dữ liệu trong cơ sở dữ liệu tài liệu là gì?

Giả sử tôi có bộ sưu tập Nhân viên, nơi tôi lưu trữ tất cả thông tin liên quan đến nhân viên. Sau đây là một tài liệu nhân viên tiêu biểu:

{ 
    "id": 1234, 
    "firstName": "John", 
    "lastName": "Smith", 
    "gender": "Male", 
    "dateOfBirth": "3/21/1967", 
    "emailAddresses":[ 
     { "email": "[email protected]", "isPrimary": "true" }, 
     { "email": "[email protected]", "isPrimary": "false" } 
    ] 
} 

Cũng giả sử, tôi có một bộ sưu tập các dự án riêng biệt, nơi tôi lưu trữ dữ liệu dự án mà trông giống như thế:

{ 
    "id": 444, 
    "projectName": "My Construction Project", 
    "projectType": "Construction", 
    "projectTeam":[ 
     { "_id": 2345, "position": "Engineer" }, 
     { "_id": 1234, "position": "Project Manager" } 
    ] 
} 

Nếu tôi muốn trả về một danh sách của tất cả các dự án của tôi cùng với các nhóm dự án, làm cách nào để xử lý đảm bảo rằng tôi trả lại tất cả thông tin thích hợp về các cá nhân trong nhóm, chẳng hạn tên đầy đủ, địa chỉ email, v.v ...?

Có hai truy vấn riêng biệt không? Một cho các dự án và một cho những người có ID xuất hiện trong bộ sưu tập dự án?

Nếu vậy, làm cách nào để chèn dữ liệu về những người, tức là tên đầy đủ, địa chỉ email? Tôi có làm một vòng lặp foreach trong ứng dụng của mình để cập nhật dữ liệu không?

Nếu tôi dựa vào đơn đăng ký để xử lý tất cả dữ liệu thích hợp, đây có phải là lần truy cập hiệu suất bù đắp lợi ích hiệu suất của cơ sở dữ liệu tài liệu như MongoDB không?

Cảm ơn sự giúp đỡ của bạn.

Trả lời

7

"... làm cách nào để xử lý đảm bảo rằng tôi trả lại tất cả thông tin thích hợp về các cá nhân trong nhóm tức là tên đầy đủ, địa chỉ email, v.v ... Có phải hai truy vấn riêng biệt không?"

Đây là 2 truy vấn riêng biệt HOẶC bạn không chuẩn hóa tài liệu Dự án. Trong các ứng dụng của chúng tôi, chúng tôi thực hiện truy vấn thứ 2 và giữ cho dữ liệu được chuẩn hóa càng tốt trong tài liệu.

Thực tế KHÔNG phổ biến để thấy phím "_id" ở bất kỳ nơi nào trừ trên tài liệu cấp cao nhất. Hơn nữa, đối với các bộ sưu tập mà bạn sẽ có hàng triệu tài liệu, bạn tiết kiệm dung lượng lưu trữ bằng cách giữ các khóa "terse". Xem xét "name" thay vì "projectName", "type" thay vì "projectType", "pos" thay vì "position". Nó có vẻ tầm thường nhưng nó cho biết thêm. Bạn cũng sẽ muốn đặt một chỉ mục trên "team.empId" để truy vấn "có bao nhiêu dự án có Joe Average hoạt động" chạy tốt.

{ 
    "_id": 444, 
    "name": "My Construction Project", 
    "type": "Construction", 
    "team":[ 
    { "empId": 2345, "pos": "Engineer" }, 
    { "empId": 1234, "pos": "Project Manager" } 
    ] 
} 

Một điều cần làm là bạn không phải viết toàn bộ tài liệu mỗi khi bạn muốn cập nhật một trường riêng lẻ hoặc nói thêm thành viên mới vào nhóm. Bạn có thể thực hiện các cập nhật được nhắm mục tiêu để nhận dạng duy nhất tài liệu nhưng chỉ cập nhật một phần tử mảng hoặc trường riêng lẻ.

db.projects.update(
    { _id : 444 }, 
    { $addToSet : "team" : { "empId": 666, "position": "Minion" } } 
); 

2 truy vấn để thực hiện một điều trước tiên, nhưng bạn sẽ vượt qua nó.

+0

Cảm ơn cả hai rất nhiều! – Sam

0

Mongo DB là cơ sở dữ liệu lưu trữ tài liệu. Nó hỗ trợ Tính sẵn sàng cao và Khả năng mở rộng.

Để trả lại danh sách tất cả các dự án của bạn cùng với nhóm dự án (chi tiết), theo sự hiểu biết của tôi, bạn sẽ phải chạy 2 truy vấn. Vì mongoDb không có ràng buộc FK, chúng tôi cần duy trì nó ở cấp chương trình. Thay vì các ràng buộc FK, 1) nếu dữ liệu ít hơn, thì chúng tôi có thể nhúng dữ liệu dưới dạng tài liệu phụ. 2) chứ không phải cách chuẩn hóa thiết kế db, trong MongoDb chúng ta cần thiết kế theo mẫu truy cập. tức là cách chúng tôi cần truy vấn dữ liệu nhiều khả năng hơn. (Tuy nhiên thời gian cập nhật nhiều hơn (chậm), nhưng ở cuối người dùng hiệu suất chủ yếu phụ thuộc vào hoạt động đọc, sẽ tốt hơn RDBMS)

Liên kết sau đây cung cấp khóa học chứng chỉ trên mongo Db, miễn phí. Mongo DB University Họ cũng có diễn đàn, điều này khá hay.

Các vấn đề liên quan