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ể
- có -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"
}, ]
}]