gpt4 book ai didi

mysql - 闭包树中 sibling 的唯一名称约束

转载 作者:行者123 更新时间:2023-11-30 23:28:24 24 4
gpt4 key购买 nike

我想知道在使用 closure table 时如何对兄弟节点的名称实现唯一约束。在 MySQL 中对层次结构进行建模。

这是我的模式:

create table spaces (
id int not null,
name varchar(50) not null,
parent int not null,
primary key (id),
foreign key (parent) references spaces(id),
unique key (name, parent)
)

create table space_paths (
ancestor int not null,
descendant int not null,
depth int not null,
primary key (ancestor, descendant),
foreign key (ancestor) references spaces(id),
foreign key (descendant) references spaces(id)
)

使用此架构,我在 spaces 表上使用唯一约束来验证没有同级具有相同的名称。

这种方法的缺点是它反规范化了封装在 space_paths 表中的层次结构元数据。这意味着我需要手动管理 spaces 表中的 parent 字段与 space_paths 表中的路径的一致性。

有没有一种方法可以让我重新设计架构,让数据库在同级之间强制执行唯一的名称约束,而不必非规范化?

最佳答案

在这里使用闭包表并不是您问题的相关部分——您只需要parent, name 上的UNIQUE KEY,这就是它看起来的样子你已经被定义了,所以你应该很好。

可能让您感到悲伤的一件事是您在 parent 列上有一个 NOT NULL 约束。您将如何支持“根”节点?您可以让根节点使用等于其 ID 列的父值,但这将需要一个自分配的主键(据我所知,您不能在插入语句中引用自动增量值):

INSERT INTO spaces(id, name, parent) values (0, 'root', 0);

关于mysql - 闭包树中 sibling 的唯一名称约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11968493/

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