Bạn cần xem xét loại truy vấn bạn sẽ cần thực hiện và tần suất mỗi loại sẽ cần thiết. Khi làm việc tương tự, tôi đã nghĩ ra sáu hành động khả thi:
- Làm điều gì đó với cha mẹ
- Làm điều gì đó với bọn trẻ
- Làm điều gì đó với tổ tiên (cha mẹ cha mẹ, cha mẹ cha mẹ cha mẹ, v.v.)
- Làm điều gì đó với con cháu (con cái, con của con cái, v.v.)
- Thay đổi các mối quan hệ (thêm / di chuyển / xóa các nút trong hệ thống phân cấp)
- Thay đổi dữ liệu chính trong nút hiện tại (ví dụ:thay đổi giá trị trong trường "tiêu đề")
Bạn sẽ muốn ước tính mức độ quan trọng của từng thứ này đối với ứng dụng của mình.
Nếu hầu hết công việc của bạn liên quan đến việc làm việc với dữ liệu được lưu trữ cho một số bài viết nhất định bao gồm cả bài viết cha mẹ và con cái của nó, thì ý tưởng đầu tiên hữu ích nhất. Thật vậy trong MongoDB, khá phổ biến là đặt tất cả thông tin bạn cần vào cùng một tài liệu thay vì tham chiếu nó ra bên ngoài để bạn chỉ cần truy xuất một thứ và chỉ làm việc với dữ liệu đó. Tuy nhiên, bốn hành động cuối cùng trong danh sách phức tạp hơn.
Đặc biệt, trong trường hợp này, bạn sẽ cần phải đi qua cây để lấy tổ tiên và con cháu, di chuyển qua các tài liệu trung gian và đi theo một con đường, mặc dù bạn có thể chỉ quan tâm đến tài liệu cuối cùng trong đường dẫn. Điều này có thể chậm đối với các cấu trúc phân cấp dài. Thay đổi mối quan hệ có thể yêu cầu di chuyển nhiều thông tin trong nhiều tài liệu vì tất cả dữ liệu có trong mỗi tài liệu. Nhưng ngay cả việc thay đổi một trường đơn lẻ như "tiêu đề" cũng có thể gây khó chịu, vì bạn phải xem xét thực tế là trường này có trong nhiều tài liệu khác nhau, dưới dạng trường chính hoặc dưới trường mẹ hoặc trường con.
Về cơ bản, ý tưởng đầu tiên của bạn hoạt động tốt nhất trong các ứng dụng tĩnh khác nơi bạn sẽ không thay đổi dữ liệu nhiều sau khi tạo ban đầu, nhưng là nơi bạn cần đọc nó thường xuyên.
Tài liệu MongoDB có năm cách tiếp cận được đề xuất để xử lý các cấu trúc dạng cây (phân cấp). Tất cả chúng đều có những ưu và nhược điểm khác nhau, mặc dù vậy chúng đều giúp bạn dễ dàng cập nhật dữ liệu chính trong một bài báo bằng cách chỉ cần thực hiện trong một tài liệu.
- Tham chiếu dành cho cha mẹ :mỗi nút chứa một tham chiếu đến cha của nó.
- Ưu điểm :
- Tra cứu phụ huynh nhanh chóng (tra cứu theo "_id" =tiêu đề tài liệu của bạn, trả về trường "gốc")
- Tra cứu con nhanh (tra cứu theo "parent" =tiêu đề tài liệu của bạn, sẽ trả về tất cả các tài liệu con)
- Việc cập nhật các mối quan hệ chỉ là vấn đề thay đổi trường "chính"
- Việc thay đổi dữ liệu cơ bản chỉ yêu cầu các thay đổi đối với một tài liệu
- Nhược điểm :
- Tìm kiếm theo tổ tiên và con cháu chậm, đòi hỏi phải chuyển tải
- Tham chiếu con :mỗi nút chứa một mảng tham chiếu đến các nút con của nó
- Ưu điểm :
- Truy xuất nhanh các con (trả về mảng con)
- Cập nhật mối quan hệ nhanh chóng (chỉ cập nhật mảng dành cho trẻ em nếu cần)
- Nhược điểm :
- Việc tìm kiếm phụ huynh yêu cầu phải tra cứu _id của bạn trong tất cả các mảng con của tất cả các tài liệu cho đến khi bạn tìm thấy nó (vì cấp độ gốc sẽ chứa nút hiện tại khi còn nhỏ)
- Tìm kiếm tổ tiên và con cháu yêu cầu đi qua cây
- Ưu điểm :
- Mảng Tổ tiên :mỗi nút chứa một tham chiếu đến một mảng tổ tiên và cha của nó
- Ưu điểm :
- Truy xuất nhanh các tổ tiên (không cần chuyển tải để tìm một tổ tiên cụ thể)
- Phụ huynh và con cái dễ dàng tra cứu theo phương pháp "Tham khảo dành cho cha mẹ"
- Để tìm con cháu, chỉ cần tra cứu tổ tiên, vì tất cả con cháu phải có cùng tổ tiên
- Nhược điểm :
- Cần phải lo lắng về việc giữ cho mảng tổ tiên cũng như trường mẹ được cập nhật bất cứ khi nào có sự thay đổi trong các mối quan hệ, thường là trên nhiều tài liệu.
- Ưu điểm :
- Đường dẫn cụ thể hóa :mỗi nút chứa một đường dẫn đến chính nó - yêu cầu regex
- Ưu điểm :
- Dễ dàng tìm thấy con và con cháu bằng regex
- Có thể sử dụng một đường dẫn để truy xuất cha mẹ và tổ tiên
- Tính linh hoạt, chẳng hạn như tìm các nút bằng các đường dẫn từng phần
- Nhược điểm :
- Việc thay đổi mối quan hệ rất khó khăn vì chúng có thể yêu cầu thay đổi đường dẫn trên nhiều tài liệu
- Ưu điểm :
- Bộ lồng nhau :Mỗi nút chứa trường "trái" và "phải" để giúp tìm cây con
- Ưu điểm :
- Dễ dàng truy xuất con cháu theo cách tối ưu bằng cách tìm kiếm giữa "trái" và "phải"
- Giống như phương pháp "Tham khảo dành cho cha mẹ", thật dễ dàng tìm thấy cha mẹ và con cái
- Nhược điểm :
- Cần xem qua cấu trúc để tìm tổ tiên
- Thay đổi mối quan hệ ở đây có hiệu quả kém nhất so với bất kỳ tùy chọn nào khác vì mọi tài liệu đơn lẻ trong cây có thể cần được thay đổi để đảm bảo "bên trái" và "bên phải" vẫn có ý nghĩa khi có thứ gì đó thay đổi trong phân cấp
- Ưu điểm :
Năm phương pháp tiếp cận được thảo luận chi tiết hơn trong tài liệu MongoDB .
Ý tưởng thứ hai của bạn kết hợp các phương pháp tiếp cận "Tham khảo dành cho cha mẹ" và "Tham khảo dành cho trẻ em" đã được thảo luận ở trên. Cách tiếp cận này giúp bạn dễ dàng tìm thấy cả con và mẹ, đồng thời dễ dàng cập nhật các mối quan hệ và dữ liệu chính của một bài báo (mặc dù bạn cần cập nhật cả trường mẹ và trường con), nhưng bạn vẫn cần xem qua nó. để tìm tổ tiên và con cháu.
Nếu bạn quan tâm đến việc tìm kiếm tổ tiên và con cháu (và quan tâm đến điều này hơn là có thể dễ dàng cập nhật các mối quan hệ), bạn có thể xem xét thêm mảng tổ tiên vào ý tưởng thứ hai của mình để dễ dàng truy vấn tổ tiên và con cháu. Tất nhiên, việc cập nhật các mối quan hệ sẽ trở thành một vấn đề thực sự nếu bạn làm điều này.
Kết luận:
-
Cuối cùng, tất cả phụ thuộc vào hành động nào là cần thiết nhất. Vì bạn đang làm việc với các bài báo mà dữ liệu cơ bản (như tiêu đề) có thể thay đổi thường xuyên, bạn có thể muốn tránh ý tưởng đầu tiên vì bạn cần cập nhật không chỉ tài liệu chính cho bài báo đó mà tất cả các tài liệu con cũng như cha mẹ.
-
Ý tưởng thứ hai của bạn giúp dễ dàng truy xuất cha mẹ và con cái ngay lập tức. Việc cập nhật các mối quan hệ cũng không quá khó (Nó chắc chắn tốt hơn một số tùy chọn khác có sẵn).
-
Nếu bạn thực sự muốn dễ dàng tìm thấy tổ tiên và con cháu với chi phí cập nhật các mối quan hệ một cách dễ dàng, hãy chọn bao gồm một loạt các tham chiếu tổ tiên.
-
Nói chung, hãy cố gắng giảm thiểu số lượng truyền tải được yêu cầu, vì chúng yêu cầu chạy một số loại lặp lại hoặc đệ quy để truy cập dữ liệu bạn muốn. Nếu bạn coi trọng khả năng cập nhật các mối quan hệ, bạn cũng nên chọn một tùy chọn thay đổi ít nút hơn trong cây (Tham chiếu gốc, Tham chiếu con và ý tưởng thứ hai của bạn có thể thực hiện điều này).