Tôi tò mò muốn biết cách tốt nhất (thực hành tốt nhất) để xử lý cấu trúc phân cấp liên quan đến thiết kế cơ sở dữ liệu là gì. Đây là một ví dụ nhỏ về cách tôi thường xử lý chúng.Xử lý dữ liệu phân cấp trong cơ sở dữ liệu
Node Bảng
NodeId int PRIMARY KEY
NodeParentId int NULL
DisplaySeq int NOT NULL
Title nvarchar(255)
Tổ Bảng
NodeId int
AncestorId int
Hops int
với chỉ số trên nodeID, AncestorId, Hops
Bàn giống như thế này:
Node Bảng
NodeId NodeParentId DisplaySeq Title
1 NULL 1 'Root'
2 1 1 'Child 1'
3 1 2 'Child 2'
4 2 1 'Grandchild 1'
5 2 2 'Grandchild 2'
Tổ Bảng
NodeId AncestorId Hops
1 NULL 0
1 1 0
2 1 1
2 2 0
3 1 1
3 3 0
4 1 2
4 2 1
4 4 0
5 1 2
5 2 1
5 5 0
Với thiết kế này, tôi đã tìm thấy rằng với hệ thống phân cấp lớn tôi có thể nhận được toàn bộ một phần của hệ thống phân cấp rất nhanh chóng bằng cách tham gia vào Bảng tổ tiên cho AncestorId = target NodeId, như:
SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId
Nó cũng là e muốn nhận con trực tiếp cũng như
SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId
AND Hops = 1
Tôi muốn biết bạn có thể sử dụng giải pháp nào khác cho loại điều này. Theo kinh nghiệm của tôi, hệ thống phân cấp có thể nhận được khá nhiều lông, và bất kỳ cách nào để tối ưu hóa quá trình truy xuất của chúng là rất quan trọng.
Sets lồng nhau! Đó là thuật ngữ tôi đang tìm kiếm! – n8wrl
Bài viết khá thú vị. Một vấn đề tôi luôn gặp phải là khi thêm/xóa một nút, bạn phải cập nhật vị trí của mỗi nút khác sau nó. –
Bạn làm. Và đó là câu trả lời của Tom H rất quan trọng. Đối với tôi, điều này làm việc tuyệt vời trên hệ thống phân cấp mà tôi có thay đổi khá thường xuyên. – n8wrl