gpt4 book ai didi

sql - 限制数据库树的深度

转载 作者:搜寻专家 更新时间:2023-10-30 20:44:24 25 4
gpt4 key购买 nike

通常,当我表示一个父子层次结构时,我有一个如下表(我可能还会添加额外的深度列以加快处理速度),其中父项和子项都是与同一实体表中的行的外键关系。

实体关系
复合公钥
child 编号
家长编号

我想弄清楚的是如何将树的深度限制为一。换句话说,如果某人是 child 的 parent ,我如何防止那个 parent 本身就是 child ,所以不可能有祖 parent 甚至更进一步?

最佳答案

根据您的 RDBMS,您可以在 INSERT/UPDATE 触发器中处理类似的事情。对于简单地限制 parent 不能同时是 child 来说,这应该不会太糟糕(尽管我讨厌在不必要的情况下使用触发器)。如果您试图将级别限制在一定数量(比如 100),那么您可能会开始遇到性能问题。

在 MS SQL Server 中,您还可以在约束中使用用户定义的函数。但是有限制,所以我不知道它是否适用于这里。不过,我会尝试对其进行测试。

编辑:

我刚刚在 MS SQL Server 2008 上对此进行了测试,看起来它可以正常工作:

CREATE FUNCTION dbo.Is_Child (@parent_id INT) RETURNS BIT
AS
BEGIN
DECLARE @return BIT
IF EXISTS (SELECT * FROM dbo.Test_Trees WHERE child_id = @parent_id)
SET @return = 1
ELSE
SET @return = 0

RETURN @return
END
GO
CREATE TABLE dbo.Test_Tree_Objects (
my_id INT NOT NULL,
CONSTRAINT PK_Test_Tree_Objects PRIMARY KEY CLUSTERED (my_id)
)
CREATE TABLE dbo.Test_Trees (
my_id INT NOT NULL IDENTITY,
parent_id INT NOT NULL CHECK (dbo.Is_Child(parent_id) = 0),
child_id INT NOT NULL,
CONSTRAINT PK_Test_Trees PRIMARY KEY CLUSTERED (my_id),
CONSTRAINT FK_Test_Trees_parent_id FOREIGN KEY (parent_id) REFERENCES dbo.Test_Tree_Objects (my_id),
CONSTRAINT FK_Test_Trees_child_id FOREIGN KEY (child_id) REFERENCES dbo.Test_Tree_Objects (my_id)
)
GO

INSERT INTO dbo.Test_Tree_Objects (my_id) VALUES (1), (2), (3), (4), (5)
GO

INSERT INTO dbo.Test_Trees (parent_id, child_id) VALUES (1, 2)
INSERT INTO dbo.Test_Trees (parent_id, child_id) VALUES (2, 3)

DROP TABLE dbo.Test_Trees
DROP TABLE dbo.Test_Tree_Objects
DROP FUNCTION dbo.Is_Child
GO

关于sql - 限制数据库树的深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6624084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com