2012-02-23 44 views
19

Sử dụng DBREF datatype trong MongoDB, tài liệu có thể trông giống như được hiển thị bên dưới. Nhưng có trường $ref trong mỗi hàng cảm thấy dư thừa vì mỗi hàng rõ ràng chỉ đến bộ sưu tập users.MongoDB - DBREF có cần thiết không?

Có cách nào để tham khảo các tài liệu khác mà không cần phần nào dư thừa $ref-field không?

{ 
    $id: {$oid : "4f4603820e25f4c515000001"}, 
    title: "User group", 
    users: [ 
     {_id: {$ref: "users", $id: { $oid: "4f44af6a024342300e000002"}}, isAdmin: true } 
    ] 
], 
+4

có lý do cụ thể nào khiến bạn không sử dụng Liên kết trực tiếp/thủ công đơn giản (chỉ cần đặt ObjectId như được đề xuất bên dưới) không? –

Trả lời

31

Dbref theo ý kiến ​​của tôi nên tránh khi làm việc với mongodb, ít nhất là nếu bạn làm việc với các hệ thống lớn yêu cầu khả năng mở rộng.

Như tôi biết tất cả các trình điều khiển yêu cầu bổ sung để tải DBRef, vì vậy nó không phải là 'tham gia' trong cơ sở dữ liệu, nó rất tốn kém.

Có cách nào để tham chiếu các tài liệu khác mà không cần có trường ref2 $ numbercó phần dư thừa không?

Vâng, giữ tài liệu tham khảo trong tâm trí, tạo ra quy ước đặt tên cho 'phím nước ngoài' (giống như RefUserId hoặc chỉ UserId) và lưu trữ chỉ id của tài liệu tham chiếu. Tự tải tài liệu được tham chiếu khi cần. Ngoài ra hãy giữ cho mắt của bạn mở cho bất kỳ sự không chuẩn hóa, nhúng bạn có thể làm, bởi vì nó thường cải thiện đáng kể hiệu suất.

+3

Nó không phải là một vấn đề thực sự của việc sử dụng một DBRef hoặc chỉ _id nhưng làm thế nào bạn giải quyết chúng với ngữ nghĩa liên kết. Nếu bạn có các tham chiếu không đồng nhất (với nhiều bộ sưu tập) thì bạn sẽ cần cả bộ sưu tập và _id == DBRef. –

+1

Chỉ cần lặp lại Scott một chút: nếu bạn đang tham chiếu các đối tượng trong cùng một bộ sưu tập, bạn chỉ có thể sử dụng trường ObjectId –

+0

vì vậy trong tương lai việc cập nhật sẽ đắt hơn? bởi vì việc cập nhật không được chỉnh sửa cần cập nhật toàn bộ bộ sưu tập hmm? –

6

Trừ khi bạn sử dụng các phương pháp cụ thể của trình điều khiển để truy cập dbref, không cần thiết.

Trong trường hợp bạn đang quản lý tham gia theo cách thủ công (nghĩa là bạn biết bộ sưu tập nào khác "tham gia"), chỉ lưu trữ ObjectId là đủ.

2

Từ docs:

Manual references là một sự thay thế, và the docs say thủ công tài liệu tham khảo là thích hợp hơn để DBREFs (though I'm not sure why). DBREF hữu ích khi đối tượng được tham chiếu sống trong cơ sở dữ liệu khác hoặc nơi tên bộ sưu tập sẽ không rõ ràng.

Không chuẩn hóa/nhúng là thích hợp hơn với bất kỳ loại liên kết nào vì bạn nhận được cập nhật nguyên tử và không cần phải truy vấn lại dữ liệu có liên quan.

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