MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Spring Data Mongo - áp dụng các trường kết hợp duy nhất trong tài liệu nhúng

Trong MongoDB, một chỉ mục duy nhất đảm bảo rằng một giá trị cụ thể trong một trường không có trong nhiều tài liệu. Nó sẽ không đảm bảo rằng một giá trị là duy nhất trên một mảng trong một tài liệu. Điều này được giải thích ở đây trong Hướng dẫn sử dụng MongoDB, nơi nó thảo luận về các Chỉ mục đa khóa duy nhất.

Do đó, một chỉ mục duy nhất sẽ không đáp ứng yêu cầu của bạn. Nó sẽ ngăn các tài liệu riêng biệt chứa các kết hợp trùng lặp, nhưng nó vẫn cho phép một tài liệu duy nhất chứa các giá trị trùng lặp trên một mảng.

Tùy chọn tốt nhất bạn có là thay đổi mô hình dữ liệu của mình để chia mảng các đối tượng techEaffeeRef thành các tài liệu riêng biệt. Chia nó thành các tài liệu riêng biệt sẽ cho phép bạn sử dụng một chỉ mục duy nhất để thực thi tính duy nhất.

Việc triển khai cụ thể sẽ được thực hiện cho sự thay đổi mô hình dữ liệu này sẽ phụ thuộc vào mẫu truy cập của bạn (nằm ngoài phạm vi của câu hỏi này).

Một cách như vậy có thể được thực hiện là tạo một bộ sưu tập TechnologyEaffee có tất cả các trường hiện đang tồn tại trong mảng techEaffeeRef. Ngoài ra, bộ sưu tập Nhân viên Công nghệ này sẽ có một trường, chẳng hạn như email, cho phép bạn liên kết nó với một tài liệu trong bộ sưu tập Nhân viên.

Tài liệu nhân viên mẫu

{
  ....
  ....
  "firstName" : "John",
  "lastName" : "Doe",
  "email" : "[email protected]",
  .....
  .....
  .....
}

Tài liệu công nghệ nhân viên mẫu

{
  "email" : "[email protected]",
  "technologyCd" : "Java",
  "technologyName" : "Java8",
  ....
  .....
  "status" : "A"
}

Chỉ mục trong bộ sưu tập Công nghệ nhân viên

{'email' : 1, 'technologyCd' : 1}, {unique: true}

Nhược điểm của phương pháp này là bạn sẽ cần phải đọc từ hai bộ sưu tập để có tất cả dữ liệu. Hạn chế này có thể không phải là vấn đề lớn nếu bạn hiếm khi cần truy xuất dữ liệu từ cả hai bộ sưu tập cùng một lúc. Nếu bạn cần tất cả dữ liệu, nó có thể được tăng tốc thông qua việc sử dụng các chỉ mục. Với các chỉ mục, nó có thể được đẩy nhanh hơn nữa thông qua việc sử dụng các truy vấn được đề cập.

Một tùy chọn khác là không chuẩn hóa dữ liệu. Bạn sẽ thực hiện việc này bằng cách sao chép dữ liệu Nhân viên mà bạn cần truy cập cùng lúc với dữ liệu Công nghệ.

Tài liệu mẫu

[
  {
    ....
    "firstName" : "John",
    "lastName" : "Doe",
    "email" : "[email protected]",
    .....
    "technologyCd" : "Java",
    "technologyName" : "Java8",
    ....
    "status" : "A"
  },
  {
    ....
    "firstName" : "John",
    "lastName" : "Doe",
    "email" : "[email protected]",
    .....
    "technologyCd" : "Spring",
    "technologyName" : "Spring Boot2",
    ....
    "status" : "A"
  }
]

Trong bài đăng trên blog MongoDB này, họ nói rằng

Bạn chỉ nên làm điều này đối với các trường thường xuyên được đọc, được đọc thường xuyên hơn nhiều so với những trường được cập nhật và nơi bạn không yêu cầu tính nhất quán mạnh mẽ, vì việc cập nhật giá trị không chuẩn hóa sẽ chậm hơn, đắt hơn và không phải là nguyên tử.

Hoặc như bạn đã đề cập, có thể hợp lý khi để nguyên mô hình dữ liệu và thực hiện kiểm tra tính duy nhất ở phía ứng dụng. Điều này có thể mang lại cho bạn hiệu suất đọc tốt nhất, nhưng nó đi kèm với một số nhược điểm. Đầu tiên, nó sẽ làm chậm hoạt động ghi vì ứng dụng sẽ cần chạy một số kiểm tra trước khi có thể cập nhật cơ sở dữ liệu.

Nó có thể khó xảy ra, nhưng cũng có khả năng bạn vẫn có thể nhận được các bản sao. Nếu có hai yêu cầu liên tiếp để chèn cùng một đối tượng EmployeeTechnology vào mảng, thì quá trình xác thực yêu cầu thứ hai có thể kết thúc (và vượt qua) trước khi yêu cầu đầu tiên được ghi vào cơ sở dữ liệu. Bản thân tôi đã từng thấy một kịch bản tương tự với một ứng dụng mà tôi đã làm việc trên. Mặc dù ứng dụng đang kiểm tra tính duy nhất, nhưng nếu người dùng nhấp đúp vào nút gửi thì cuối cùng sẽ có các mục nhập trùng lặp trong cơ sở dữ liệu. Trong trường hợp này, việc vô hiệu hóa nút trong lần nhấp đầu tiên sẽ giảm đáng kể rủi ro. Rủi ro nhỏ này có thể chấp nhận được, tùy thuộc vào yêu cầu của bạn và tác động của việc có các mục nhập trùng lặp.

Cách tiếp cận nào có ý nghĩa nhất phụ thuộc phần lớn vào kiểu truy cập và yêu cầu của bạn. Hy vọng điều này sẽ hữu ích.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách tốt nhất để phân trang ajax với MongoDb và Nodejs là gì?

  2. Lệnh khác biệt MongoDB

  3. Làm cách nào để sắp xếp bộ sưu tập Sao băng theo thời gian chèn?

  4. Nhận danh sách các chỉ mục trong MongoDB

  5. Id Mongo dẫn đến các URL đáng sợ