Please enable JavaScript.
Coggle requires JavaScript to display documents.
Data Modeling in MongoDB (Thiết kế mô hình gia phả giữa document…
Data Modeling in MongoDB
Lý thuyết
Embedded Data và Normalized Data
Embedded Data
Lưu trữ dữ liệu có liên quan tới trong trong một document (array hoặc sub-document)
Nhược điểm
Kích thước document tăng lên về sau làm giảm hiệu năng (đối với storage engine của phiên bản trước 3.0.0)
Tràn giới hạn kích thước document
Sử dụng khi
Mối quan hệ "bao trùm" (sở hữu, thuộc về, vv...)
Khi một đối tượng luôn được truy cập trong khuôn khổ của đối tượng khác
Ưu điểm
Ứng dụng có thể thao tác với ít query hơn
Atomic query
Hiệu năng đọc-ghi cao hơn (lưu trữ ở địa chỉ liền kề nhau)
Normalized Data
Mô tả quan hệ giữa dữ liệu có liên quan bằng các reference tới nhau
Ưu điểm
Linh hoạt hơn Embedded Data
Nhược điểm
Thao tác cần nhiều query hơn
Sử dụng khi
Embedded Data gây ra trùng lặp dữ liệu không cần thiết
Mô tả quan hệ N-N
Mô tả quan hệ gia phả phức tạp
Các yếu tổ ảnh hưởng tới hiệu năng
Kích cỡ document
Do storage engine của MongoDB trước 3.0.0
MongoDB 3.0.0+ sử dụng Power of 2 Allocation, giải quyết được vấn đề này
Atomicity - Tính độc lập
Tất cả các query đều là atomic ở mức độ document
Các query trên nhiều document được thực thi trên từng document một
Embedded Data cho phép thao tác trong một query
Normalized Data cần nhiều query độc lập với nhau để thực thi
Sharding
Indexing
Mỗi index yêu cầu ít nhất 8 kB bộ nhớ
Indexing làm giảm hiệu năng viết (do phải update lại index), tăng hiệu năng đọc
Số lượng collection
Hầu như không tác động tiêu cực tới hiệu năng
Mỗi collection có overhead tối thiểu vài kB
Giới hạn file namespace của database (tiền 3.0.0)
Nhiều dữ liệu có kích thước nhỏ
Lưu trữ chung trong một document
Lưu trữ trong các địa chỉ liền kề nhau, giảm random access
Không nhất thiết nếu muốn mô tả chính xác bản chất dữ liệu
Memory overhead khi sử dụng index
Thiết kế quan hệ giữa document
Quan hệ 1-1
Nếu một giá trị thường xuyên phụ thuộc vào giá trị còn lại, Normalized Data sẽ phải thực hiện nhiều query xử lý reference
Sử dụng Embedded Data dể có thể thao tác trong một query
Quan hệ 1-N
1-Few
Embedded Data vế N vào vế 1 - có thể thao tác trong một query
1-Many
Dữ liệu vế N có thể làm tràn giới hạn document
Embedding Data các reference tới vế N vào vế 1
1-Squillion
Danh sách reference tới vế N có thể làm tràn giới hạn document
Reference tới vế 1 vào vế N
Yếu tố cần xem xét
Kích thước của vế N
Yêu cầu truy cập không phụ thuộc vào vế 1 của vế N
Tỉ lệ read/write
Quan hệ N-N: Là quan hệ 1-N trên cả hai vế
6 quy tắc
Sử dụng Embedded Data, trừ khi có lý do hợp lý.
Một đối tượng cần được truy cập không phụ thuộc vào đối tượng khác là một lý do hợp lý để không dùng Embedded Data.
Array không nên mở rộng không giới hạn. Array cần có dung lượng lớn là một lý do hợp lý để không dùng Embedded Data.
Application-side join, với index và projection hợp lý, không thua kém hiệu năng là mấy so với server-side join
Xem xét tỉ lệ read/write. Nếu write ít read nhiều, có thể denormalize dữ liệu để tăng tốc độ đọc
Thiết kế database phù hợp với yêu cầu read/write của ứng dụng
Thiết kế mô hình gia phả giữa document
Reference tới nút cha
Mô tả
Có thể truy vấn nút cha tức thời
Có thể tạo index trên
_id
của nút cha để tăng tốc tìm nút con
Nút con chứa
_id
của nút cha
Ưu điểm:
Đơn giản
Nhược điểm:
Yêu cầu nhiều truy vấn để tìm cây con
Reference tới nút con
Mô tả
Nút cha chứa mảng
_id
các nút con
Có thể truy vấn nút con tức thời
Có thể tạo index trên array
_id
của nút con để tăng tốc tìm nút cha
Ưu điểm
Đơn giản
Có thể lưu trữ mô hình với nút con nhiều nút cha
Nhược điểm:
Không hiệu quả đối với truy vấn trên cây con
Lưu trữ mảng nút cha
Mô tả
Nút con chứa
_id
của nút cha và một mảng chứa toàn bộ các nút cha dẫn tới nó
Có thể truy vấn nút cha tức thời
Có thể tạo index trên array nút cha để tăng tốc tìm subtree
Ưu điểm
Thích hợp cho việc tìm subtree
Thao tác trực tiếp hơn phương pháp lưu trữ địa chỉ trên cây
Nhược điểm
Chậm hơn một chút so với lưu trữ địa chỉ trên cây
Lưu trữ địa chỉ trên cây
Mô tả
Mỗi nút lưu trữ string mô tả đường đi từ gốc tới nút
Sử dụng RegEx để thao tác trên string này
Có thể index trên string này để tăng tốc truy vấn
Ưu điểm
Cho phép thao tác khi chỉ biết một số nút cha
Tốc độ khi thao tác với cây con từ gốc được cải thiện nhiều
Nhược điểm
Khi thao tác không từ gốc, truy vấn phải duyệt qua toàn bộ index
Nested Sets
Mô tả
Mỗi nút lưu trữ thứ tự đi tới và đi ra khi di chuyển DFS từ gốc
Có thể index trên hai thứ tự này để tăng tốc truy vấn
Truy vấn tất cả các nút hậu duệ nằm giữa thứ tự tới và đi
Ưu điểm
Tốc độ truy vấn nhanh
Nhược điểm
Phải hy sinh khả năng thay đổi của cấu trúc cây
Chỉ thích hợp với cây không bao giờ thay đổi