Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Đạt được thứ bậc, Mối quan hệ cha mẹ / con cái một cách hiệu quả và dễ dàng

Thật không may, nếu bạn không thể thay đổi mô hình dữ liệu và bạn đang sử dụng MySQL, bạn sẽ gặp phải tình huống cần truy vấn đệ quy và bạn đang sử dụng DBMS không hỗ trợ truy vấn đệ quy.

Quassnoi đã viết một loạt bài blog thú vị, trình bày các kỹ thuật để truy vấn dữ liệu phân cấp. Các giải pháp của anh ấy khá thông minh, nhưng rất phức tạp. http:// Explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

PostgreSQL là một RDBMS mã nguồn mở khác, hỗ trợ truy vấn đệ quy , vì vậy bạn có thể lấy toàn bộ cây được lưu trữ theo cách bạn hiển thị. Nhưng nếu bạn không thể thay đổi mô hình dữ liệu, tôi cho rằng bạn không thể chuyển sang một RDBMS khác.

Có một số mô hình dữ liệu thay thế giúp việc tìm nạp các cây có độ sâu tùy ý dễ dàng hơn nhiều:

  • Bảng đóng cửa
  • Tập hợp lồng nhau hay còn gọi là Truyền tải cây đặt hàng trước đã sửa đổi
  • Liệt kê đường dẫn hay còn gọi là Đường dẫn vật chất hóa

Tôi trình bày những điều này trong bản trình bày của mình Mô hình cho Dữ liệu phân cấp với SQL và PHP và trong cuốn sách của tôi, Phản vật chất SQL:Tránh cạm bẫy của lập trình cơ sở dữ liệu .

Cuối cùng, có một giải pháp khác mà tôi đã thấy được sử dụng trong mã cho Slashdot , đối với phân cấp nhận xét của họ:Họ lưu trữ "parent_id" giống như trong Danh sách gần kề, nhưng họ cũng lưu trữ một cột "root_id". Mọi thành viên của một cây nhất định có cùng một giá trị cho root_id, là nút tổ tiên cao nhất trong cây của nó. Sau đó, thật dễ dàng để tìm nạp toàn bộ cây trong một truy vấn:

SELECT * FROM site WHERE root_id = 123;

Sau đó, ứng dụng của bạn tìm nạp tất cả các nút trở lại từ cơ sở dữ liệu vào một mảng và bạn phải viết mã để lặp qua mảng này, chèn các nút vào cấu trúc dữ liệu dạng cây trong bộ nhớ. Đây là một giải pháp tốt nếu bạn có nhiều cây riêng biệt và mỗi cây có tương đối ít mục nhập. Nó tốt cho trường hợp của Slashdot.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL so với PDO

  2. Cách tính tiền ký quỹ trong MySQL

  3. Đặt múi giờ trong PHP và MySQL

  4. Tái tạo một máy chủ MySQL Master bị sự cố trong thiết lập sao chép bán đồng bộ

  5. Điều khoản OUTPUT trong MySQL