我想知道在 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
表中的层次元数据进行了非规范化。这意味着我需要手动管理表中parent
字段与spaces
表中路径的一致性space_paths
。
有没有一种方法可以重新设计架构以使数据库在兄弟姐妹之间强制执行唯一名称约束而不必非规范化?