Mẹo farovite của tôi để xử lý dữ liệu có cấu trúc dạng cây trong cơ sở dữ liệu là thêm một cột FullID
vào bảng để tránh các SQL phức tạp (có thể đệ quy) / Thủ tục được lưu trữ.
FullID id parent name
-----------------------------
1 1 null root1
2 2 null root2
2.3 3 2 home
2.3.4 4 3 child
2.3.4.5 5 4 sub_child
2.3.4.5.6 6 5 sub_sub_child
Vì vậy, để tìm id trang gốc, chỉ cần trích xuất phần đầu tiên của FullID
thông qua SQL hoặc ngôn ngữ ứng dụng của bạn.
Nếu sử dụng SQL, bạn có thể sử dụng SQL sau để lấy id gốc.
-- MySQL dialect
select substring_index(FullID,'.',1) as RootID from table;
-- SQL Server dialect
select case charindex('.', FullID) when 0 then FullID else substring(FullID, 1, charindex('.', FullID)-1) end as RootID from table
Để xóa một nút và nút đó là nút con
DELETE table WHERE id=<CURRENT_NODE_ID> OR FullID LIKE '<CURREN_NODE_FULLID>.%'
Để di chuyển một nút và nút đó là nút con
-- change the parent of current node:
UPDATE table
SET parent=<NEW_PARENT_ID>
WHERE id=<CURRENT_NODE_ID>
-- update it's FullID and all children's FullID:
UPDATE table
SET FullID=REPLACE(FullID,<CURRENT_NODE_PARENT_FULLID>, <NEW_PARENT_FULLID>)
WHERE (id=<CURRENT_NODE_ID> OR FullID LIKE '<CURRENT_NODE_FULLID>.%')
Lưu ý
Thủ thuật này chỉ được áp dụng cho các trường hợp cấp cây hạn chế hoặc FullID
không thể chứa nội dung dài nếu tầng cây quá sâu.