1

我想知道在 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

有没有一种方法可以重新设计架构以使数据库在兄弟姐妹之间强制执行唯一名称约束而不必非规范化?

4

1 回答 1

0

在这里使用闭包表并不是你的问题的相关部分——你只需要一个UNIQUE KEYon parent, name,这就是你似乎已经定义好的东西,所以你应该很好。

可能导致您悲伤的一件事是您NOT NULL对列有限制parent。你将如何支持“根”节点?您可以使根节点使用与其 ID 列相等的父值,但这需要一个自分配的主键(AFAIK,您不能在插入语句中引用自动增量值):

INSERT INTO spaces(id, name, parent) values (0, 'root', 0);
于 2013-02-10T18:30:08.590 回答