2014-12-13 13 views
16

Có nên có một thực thể cho mỗi bộ sưu tập trong DB tài liệu không?Một hoặc nhiều thực thể cho mỗi bộ sưu tập trong DocumentDB

Cân nhắc tôi có mối quan hệ khóa ngoại trong sơ đồ dưới đây: enter image description here

Tôi có nên tạo ra hai bộ sưu tập một cho nhân viên & khác cho công ty. Hay tôi nên lưu trữ chúng vào một bộ sưu tập duy nhất?

Tôi đọc here rằng trong phạm vi documentdb của các thủ tục được lưu trữ kích hoạt vv nằm trong bộ sưu tập. Vì vậy, bằng cách tách các thực thể differetn thành bộ sưu tập riêng biệt, tôi không có chức năng hộp.

Vì vậy, nó sẽ không thể tốt hơn để đổ cả các lớp học như thực thể duy nhất như sau:

{ 
    "Id": 1001, 
    "Industry": "Software", 
    "Employees": [ 
    { 
     "Id": 10011, 
     "Name": "John Doe", 
     "CompanyId": 1001 
    }, 
    { 
     "Id": 10012, 
     "Name": "Jane Doe", 
     "CompanyId": 1001 
    } 
    ] 
} 

các tiêu chuẩn thực hiện triển khai các đơn vị liên quan trong DocumentDB là gì?

Trả lời

4

Câu hỏi của bạn hơi chủ quan, vì bạn đang yêu cầu thiết kế thực thể và vì vậy, không có câu trả lời đúng nào.

Tuy nhiên: Từ hơn khách quan quan điểm: Không có gì ngăn cản bạn từ việc có nhiều thực thể loại trong một bộ sưu tập là (ví dụ Company loại tài liệu và Employee loại tài liệu, trong trường hợp của bạn).

Bạn cần bao gồm một số loại gợi ý cho chính mình (có thể là thuộc tính type) để giúp phân biệt giữa hai khi chạy truy vấn của bạn. Nhưng, bằng cách có cả hai loại trong cùng một bộ sưu tập, bây giờ bạn có một phạm vi thu thập để làm việc bên trong. Về thuộc tính type: Vì DocumentDB lập chỉ mục tất cả thuộc tính theo mặc định, thuộc tính type sẽ dễ dàng tích hợp vào truy vấn của bạn.

EDIT Phần bị xóa về đơn vị 3 bộ sưu tập trên mỗi công suất, vì sắp xếp đó đã bị xóa khi DocumentDB chuyển từ Xem trước sang sản xuất.

44

Thường là tốt để lưu trữ nhiều loại thực thể cho mỗi bộ sưu tập. Cho dù lưu trữ các loại thực thể trong một tài liệu hay không phải suy nghĩ nhiều hơn một chút.

Như David đã đề cập - cách tạo mô hình dữ liệu hơi chủ quan.

Lưu Bội Entity loại trong vòng một Bộ sưu tập

Đầu tiên ... chúng ta hãy nói về việc lưu trữ nhiều thực thể trong một bộ sưu tập. Bộ sưu tập DocumentDB là không phải bảng. Bộ sưu tập không thực thi lược đồ; nói cách khác, bạn có thể lưu trữ các loại tài liệu khác nhau với các lược đồ khác nhau trong cùng một bộ sưu tập. Bạn có thể theo dõi các loại đối tượng khác nhau chỉ bằng cách thêm thuộc tính loại vào tài liệu của mình.

Bạn nên coi Bộ sưu tập là đơn vị phân vùng và ranh giới để thực hiện truy vấn và giao dịch. Vì vậy, một perk rất lớn để lưu trữ các loại thực thể khác nhau trong cùng một bộ sưu tập là bạn nhận được hỗ trợ giao dịch ngay ra khỏi hộp thông qua sprocs.

Lưu trữ Nhiều loại Entity trong một tài liệu

Cho dù bạn lưu trữ nhiều loại thực thể trong một tài liệu duy nhất có nghĩ nhiều hơn một chút. Đây thường được gọi de-bình thường hóa (chiếm mối quan hệ giữa các dữ liệu bằng cách nhúng dữ liệu trong một tài liệu duy nhất) và bình thường (chiếm mối quan hệ giữa các dữ liệu bằng cách tạo liên kết yếu để o các tài liệu khác) dữ liệu của bạn.

Thường là khử bình thường cung cấp hiệu suất tốt hơn đọc hiệu suất.

Ứng dụng có thể cần phát hành ít truy vấn và cập nhật hơn để hoàn thành các hoạt động phổ biến.

Nói chung, sử dụng mô hình dữ liệu de-bình thường khi:

  • có “chứa” mối quan hệ giữa các thực thể
  • -vài một to- mối quan hệ giữa các thực thể
  • de-bình thường dữ liệu thay đổi không thường xuyên
  • dữ liệu không chuẩn hóa sẽ không phát triển mà không bị ràng buộc dữ liệu
  • de-bình thường là thể thiếu vào dữ liệu trong tài liệu

Ví dụ về một mô hình dữ liệu de-bình thường:

{ 
    "Id": 1001, 
    "Type": "Company", 
    "Industry": "Software", 
    "Employees": [ 
    { 
     "Id": 10011, 
     "Type": "Employee", 
     "Name": "John Doe" 
    }, 
    { 
     "Id": 10012, 
     "Type": "Employee", 
     "Name": "Jane Doe" 
    } 
    ] 
} 

thường bình thường cung cấp tốt hơn ghi hiệu suất .

Cung cấp linh hoạt hơn de-bình thường hóa

ứng dụng Client-side phải ban hành các truy vấn theo dõi để giải quyết các tài liệu tham khảo. Nói cách khác, các mô hình dữ liệu chuẩn hóa có thể yêu cầu nhiều chuyến đi khứ hồi hơn đến máy chủ.

Nói chung, sử dụng bình thường hóa mô hình dữ liệu:

  • khi de-bình thường sẽ cho kết quả trùng lặp dữ liệu nhưng sẽ không cung cấp đủ ưu điểm hiệu suất đọc để lớn hơn những tác động của sự trùng lặp.
  • đại diện one-to-many mối quan hệ
  • đại diện nhiều-nhiều mối quan hệ.
  • dữ liệu liên quan thay đổi thường xuyên

Ví dụ về một mô hình dữ liệu bình thường:

{ 
    "Id": 1001, 
    "Type": "Company", 
    "Industry": "Software" 
} 

{ 
    "Id": 10011, 
    "Type": "Employee", 
    "Name": "John Doe", 
    "CompanyId": 1001 
} 

{ 
    "Id": 10012, 
    "Type": "Employee", 
    "Name": "Jane Doe", 
    "CompanyId": 1001 
} 

lai Phương pháp tiếp cận

Lựa chọn giữa bình thường và de-bình thường không phải là một lựa chọn màu đen và trắng. Tôi thường thấy rằng một mẫu thiết kế chiến thắng là một cách tiếp cận lai, trong đó bạn có thể chọn để bình thường hóa một bộ một phần của các trường của đối tượng và khử chuẩn hóa các trường khác.

Nói cách khác, bạn có thể chọn không chuẩn hóa thường xuyên các thuộc tính ổn định (hoặc không thay đổi) để giảm nhu cầu theo dõi truy vấn, trong khi chuẩn hóa các trường được viết/tắt thường xuyên để giảm nhu cầu ghi quạt.

Ví dụ về một phương pháp lai:

// Author documents: 
[{ 
    "id": 1, 
    "firstName": "Thomas", 
    "lastName": "Andersen", 
    "countOfBooks": 3, 
    "books": [1, 2, 3], 
    "images": [{ 
    "thumbnail": "http://....png" 
    }, { 
    "profile": "http://....png" 
    }, { 
    "large": "http://....png" 
    }] 
}, { 
    "id": 2, 
    "firstName": "William", 
    "lastName": "Wakefield", 
    "countOfBooks": 1, 
    "books": [1, 4, 5], 
    "images": [{ 
    "thumbnail": "http://....png" 
    }] 
}] 

// Book documents: 
[{ 
    "id": 1, 
    "name": "DocumentDB 101", 
    "authors": [{ 
    "id": 1, 
    "name": "Thomas Andersen", 
    "thumbnailUrl": "http://....png" 
    }, { 
    "id": 2, 
    "name": "William Wakefield", 
    "thumbnailUrl": "http://....png" 
    }] 
}, { 
    "id": 2, 
    "name": "DocumentDB for RDBMS Users", 
    "authors": [{ 
    "id": 1, 
    "name": "Thomas Andersen", 
    "thumbnailUrl": "http://....png" 
    }, ] 
}] 
Các vấn đề liên quan