Tôi không nghĩ rằng có gì sai trong thiết kế, giả sử bạn có một mức độ hạn chế của mối quan hệ cha mẹ và con cái. Dưới đây là một ví dụ nhanh về việc truy xuất mối quan hệ bằng cách sử dụng CTE đệ quy:
USE tempdb;
GO
CREATE TABLE dbo.tree
(
ID INT PRIMARY KEY,
name VARCHAR(32),
ParentID INT FOREIGN KEY REFERENCES dbo.tree(ID)
);
INSERT dbo.tree SELECT 1, 'grandpa', NULL
UNION ALL SELECT 2, 'dad', 1
UNION ALL SELECT 3, 'me', 2
UNION ALL SELECT 4, 'mom', 1
UNION ALL SELECT 5, 'grandma', NULL;
;WITH x AS
(
-- anchor:
SELECT ID, name, ParentID, [level] = 0
FROM dbo.tree WHERE ParentID IS NULL
UNION ALL
-- recursive:
SELECT t.ID, t.name, t.ParentID, [level] = x.[level] + 1
FROM x INNER JOIN dbo.tree AS t
ON t.ParentID = x.ID
)
SELECT ID, name, ParentID, [level] FROM x
ORDER BY [level]
OPTION (MAXRECURSION 32);
GO
Đừng quên dọn dẹp:
DROP TABLE dbo.tree;
Đây có thể là một bài viết hữu ích. Một giải pháp thay thế là hierarchyid
nhưng tôi thấy nó quá phức tạp đối với hầu hết các tình huống.