MySQL에서 closure table을 사용하여 계층 구조를 모델링 할 때 형제 노드의 이름에 대해 고유 제한을 적용하는 방법이 궁금합니다. 나는 어떤 형제가 같은 이름을 가진 없는지 확인하기 위해 spaces
테이블에 고유 제한 조건을 사용하고이 스키마와폐쇄 트리에서 형제 간의 고유 한 이름 제한
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)
)
:
이
내 스키마입니다.이 접근법의 단점은 space_paths
테이블에 캡슐화 된 계층 구조 메타 데이터를 비정규 화합니다. 그 의미는 space_paths
테이블에있는 경로를 사용하여 spaces
테이블의 parent
필드의 일관성을 수동으로 관리해야한다는 의미입니다.
데이터베이스를 비정규 화하지 않고 형제간에 고유 한 이름 제약 조건을 적용하도록 스키마를 다시 디자인 할 수있는 방법이 있습니까?
비정규 화의 원인에 대해 자세히 설명해 주시겠습니까? 아니면 space_paths 테이블 구조가 이상적이라고 생각하십니까? – wisefish
필자가 언급 한 비정규 화는'space_paths' 테이블이 담당하는 부모 - 자식 관계 정보가'unique key (name, parent)'제약 조건에 의해 중복된다는 사실입니다. 이론적으로 누군가가 테이블에 직접 액세스하거나 앱의 버그를 통해'spaces' 테이블의'parent' 컬럼을'space_paths' 테이블에서 관리되는 것과 다른 부모를 참조하도록 업데이트 할 수 있습니다. 클로저 트리 접근법의 이점이 비용보다 중요한 반면,이 중복을 피하기 위해 형제의 고유성을 강화하는 또 다른 방법이 있는지 궁금합니다. – 0x6e6562