2

SQL Server에서 n 수준 트리를 모델링해야합니다.계단식 삭제를 사용하여 SQL Server에서 N 수준 트리 모델링

[Id] [bigint] IDENTITY(1,1) NOT NULL, 
[Name] [nvarchar](50) NOT NULL, 
[ParentId] [bigint] NULL 

그것은 ParentID는 (루트가 nullParentID있다) 다른 Node 엔티티로 다시 참조하는 자체 참조 테이블이있다 : 원래는 이런 일이 Node 테이블을 작성했다. 하지만 삭제를 계단식으로 제약 조건을 추가 할 때, 내가 할이 : 내가 읽은 바로는

Introducing FOREIGN KEY constraint 'FK_dbo.Nodes_dbo.Nodes_ParentId' on table 'Nodes' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. 

, 이것은 SQL 서버에서 꽤 잘 알려져 있으며, 합리적 제한 될 것으로 보인다. 어떤 사람들은 이것을 성취하기 위해 방아쇠를 사용하라고 제안하지만 가능하다면 그것을 피하기를 원합니다.

제 질문은 - 계단식 삭제를 허용하기 위해 SQL에서 n- 레벨 계층 구조 또는 트리를 어떻게 모델링해야합니까?

나는 SQL 서버 나는 이것이 클러스터 기본 키는 노드의 가변 길이 전체 트리 경로 수 있도록하는 것입니다 수행하기위한 본 것보다 효과적인 기술의 2012 년

+0

참조 : http://stackoverflow.com/questions/851625/foreign-key-constraint-may-cause-cycles-or-multiple-cascade-paths – JohnLBevan

+0

ps. 저장 프로 시저를 사용하여 삭제 작업을 수행 할 수 있습니까? 즉,이 논리를 제약 조건/트리거에 두는 대신 삭제가 발생하면 부모를 재귀 적으로 삭제 처리하고 모든 논리를 저장 프로 시저에 넣고 삭제를 호출합니다. 사람들이 데이터베이스에 직접 액세스 할 수 있다면 도움이되지 않지만 대부분 사람들이 프론트 엔드 프로그램을 사용한다고 가정하므로 delete 문을 작성하는 대신 proc을 가리킬 수 있습니다. – JohnLBevan

+0

@JohnLBevan, 그건 결국 내가 한 일입니다. EntityFramework를 사용하고 있으므로 저장소 패턴을 사용하고 저장소의 삭제 기능을 재귀 적으로 만들었습니다. 이 앱으로 효율성에 신경 쓰지는 않겠지 만, 그렇게했다면 아마도 로직을 저장 프로 시저로 옮길 것입니다. – Eric

답변