2015-10-01 20 views
5

tôi đang cố di chuyển từ dữ liệu quan hệ cơ sở dữ liệu (mysql) sang nosql (mongoDb). Nhưng làm thế nào tôi có thể đảm bảo tính toàn vẹn dữ liệu trong mongodb. những gì tôi đã tìm thấy rằng chúng tôi không thể làm điều đó ở phía máy chủ. những gì tôi nên sử dụng trên mặt ứng dụng để xử lý toàn vẹn dữ liệu?Làm thế nào chúng ta có thể đảm bảo tính toàn vẹn dữ liệu trong mongoDb?

Ví dụ: tôi có hai bảng người dùng và tác vụ. Cả hai đều có trường userId chung. nếu tôi thêm một mục mới trong bảng nhiệm vụ, nó sẽ kiểm tra nếu userid hiện diện trong bảng người dùng. đây là một trong những yêu cầu khác như thêm ràng buộc, cập nhật giá trị, v.v.

+0

Bạn có chắc chắn muốn sử dụng [nosql] (http://stackoverflow.com/questions/2875432/use-cases-for-nosql) cho kịch bản của mình không? – Pio

+0

chỉ cần làm một poc nếu tôi có thể .. – rahul

Trả lời

2

MongoDB không hỗ trợ khóa ngoại. Nó dùng để tránh JOIN.

MongoDB không hỗ trợ các mối quan hệ khóa bên ngoài máy chủ. Nhưng một số lần chúng ta cần phải liên hệ các ứng dụng Vì vậy, MongoDB sử dụng một trong hai phương pháp cho các tài liệu liên quan:

  1. tài liệu tham khảo hướng dẫn sử dụng nơi bạn lưu các lĩnh vực _id của một tài liệu văn bản khác như một tài liệu tham khảo. Sau đó, ứng dụng của bạn có thể chạy truy vấn thứ hai để trả về dữ liệu liên quan. Những tài liệu tham khảo này đơn giản và đầy đủ cho hầu hết các trường hợp sử dụng.

  2. DBRefs là tham chiếu từ tài liệu này sang tài liệu khác bằng giá trị của trường _id, tên bộ sưu tập và tên cơ sở dữ liệu tùy chọn của tài liệu đầu tiên. Bằng cách bao gồm các tên này, DBRef cho phép các tài liệu nằm trong nhiều bộ sưu tập được liên kết dễ dàng hơn với các tài liệu từ một bộ sưu tập. Sau đó, có thể không quá nhanh vì DB phải thực hiện các truy vấn bổ sung để đọc các đối tượng nhưng cho phép loại tham chiếu khóa ngoài. Tuy nhiên, bạn sẽ phải xử lý các tham chiếu của mình theo cách thủ công. Chỉ trong khi tìm kiếm DBRef của bạn, bạn sẽ thấy nếu nó tồn tại, DB sẽ không đi qua tất cả các tài liệu để tìm kiếm các tài liệu tham khảo và loại bỏ chúng nếu mục tiêu của tham chiếu không tồn tại nữa. Nhưng tôi nghĩ rằng việc loại bỏ tất cả các tài liệu tham khảo sau khi xóa cuốn sách sẽ yêu cầu một truy vấn duy nhất cho mỗi bộ sưu tập, không còn nữa, vì vậy không khó lắm.

Tham khảo tài liệu để biết thêm thông tin: Database References.

Làm cách nào để tôi có thể giải quyết tác vụ này?

Để rõ ràng, MongoDB không quan hệ. Không có tiêu chuẩn "hình thức bình thường". Bạn nên mô hình hóa cơ sở dữ liệu của bạn phù hợp với dữ liệu bạn lưu trữ và các truy vấn bạn định chạy. Đối với ex-

student 
{ 
    _id: ObjectId(...), 
    name: 'Jane', 
    courses: [ 
    { course: 'bio101', mark: 85 }, 
    { course: 'chem101', mark: 89 } 
    ] 
} 

course 
{ 
    _id: 'bio101', 
    name: 'Biology 101', 
    description: 'Introduction to biology' 
} 

Cố gắng giải quyết này

student 
{ 
    _id: ObjectId(...), 
    name: 'Jane', 
    courses: [ 
    { 
     name: 'Biology 101', 
     mark: 85, 
     id:bio101 
    }, 
    ] 
} 
+0

Tôi không hỏi về tính nhất quán trong dữ liệu từ RDBS đến nosql nhưng về tính toàn vẹn dữ liệu trong mongoDb Ví dụ: tôi có hai bảng người dùng và tác vụ. Cả hai đều có trường userId chung. nếu tôi thêm một mục mới trong bảng nhiệm vụ, nó sẽ kiểm tra nếu userid hiện diện trong bảng người dùng. đây là một trong những yêu cầu khác như thêm ràng buộc, cập nhật các giá trị, vv – rahul

+0

khoá ngoại và tham gia không liên quan theo bất kỳ cách nào. Đó là chìa khóa nước ngoài anh ta cần, không tham gia. –

+0

@SergioTulentsev xem xét bài kiểm tra của người dùng (rahul). Có vẻ như sử dụng khóa ngoại. –

2
  • MongoDB là NoSQL và do đó không tham gia.
  • Dữ liệu được lưu dưới dạng văn bản BSON và vì thế không có ràng buộc khoá ngoại

bước để đảm bảo Data Integrity:

  • Kiểm tra trong ứng dụng trước khi thêm tài liệu công việc cho dù đó là có một người dùng hợp lệ.
+1

không được đề cập trong câu hỏi ở bất kỳ đâu. –

5

Cuối cùng, bạn đang say. Có không có cách nào (trong mongodb) để đảm bảo toàn vẹn dữ liệu trong trường hợp như vậy, vì thiếu quan hệ nói chung và khóa ngoại nói riêng. Và có rất ít điểm trong việc xây dựng các kiểm tra mức ứng dụng. Cho dù chúng phức tạp như thế nào đi nữa, chúng vẫn có thể thất bại (vì thế "không bảo đảm").

Vì vậy, nó hoặc là nhúng (để dữ liệu liên quan luôn ở đó, ngay trong tài liệu) hoặc từ bỏ hy vọng dữ liệu nhất quán.

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