2011-05-13 2 views
3

자체에 순환 참조 무결성 키가있는 테이블을 가질 수 있습니까? 내가 가진 예에서, 테이블은 Container자체적으로 참조 무결성이있는 테이블을 가질 수 있습니까?

ObjectId ParentId 
1   1 
2   1 
3   2 

ObjectId가 1 참조 자체를했다. 이드의 2와 3은 각각의 부모를 참조하며 같은 테이블에 있습니다. 1을 삭제하지 않고 2, 2를 삭제하지 않고 3을 삭제할 수 없으므로 1을 삭제할 수 없습니다.

과 같은 상호 참조 테이블을 사용하여 동일한 작업을 수행 할 수 있음을 알고 있습니다. 그것은 가능성이 불필요한 테이블을 제거하는 것처럼
ObjectId ContainerId 
    1   1 
    2   2 
    3   3 

    ContainerId ObjectId 
    1   1 
    2   1 
    3   3 

는하지만, 더 그것을 달성의 첫 번째 방법에 관심이 있어요. 이것이 가능한가?

답변

3

나는 이것을 여러 번 해왔다. 그러나 실제로 데이터의 계층 구조를 관리하고 있다면 SQL은 트리와 같은 쿼리에 적합하지 않습니다. 일부 SQL 벤더에는 사용할 수있는 SQL 확장이 있지만 Joe Celko의 'Nested Sets'는이를위한 고양이의 야옹입니다. 당신은 수색에있는 많은 명중을 얻을 것이다.

  • 내 부모는 다음과 같습니다

    은 현재 내가 참조에 대한 짧은 컷으로 자체 기준 'parentID'와 중첩 된 세트의 방법을 사용?
  • 내 직계 아동은 누구입니까?

나머지는 중첩 세트 쿼리입니다.

4

예, 자체 참조 테이블은 정상입니다.

이들은 깊이 중첩 된 계층 구조를 나타내는 고전적인 방법입니다.

외부 열을 자식 열에서 부모 열로 설정하기 만하면 자식 열의 값이 부모 열에 있어야합니다.

+0

나쁜 디자인으로 간주 되나요? –

+1

@ George - 아니, 전혀. 계층 구조에서는 매우 정상입니다. – Oded

3

첫 번째 방법은 작동하지만 임의의 깊은 트리를 저장하려고하면 재귀 쿼리가 느려집니다. 인접 목록이나 다른 방법을 저장할 수 있습니다 (http://vadimtropashko.wordpress.com/2008/08/09/one-more-nested-intervals-vs-adjacency-list-comparison/ 참조).

우리가 할 일 중 하나는 각 객체를 모든 후속 항목과 함께 (별도의 테이블에) 저장하고 메인 테이블에 "상위"표시기를 사용하여 응용 프로그램에서 트리를 작성하는 것입니다.

+1

분명히 이것은 성능을위한 공간을 제공합니다. –

+0

나를 이길 크리스! +1 – n8wrl

0

목표 인 George는 자체 참조 중첩 세트 방법을 사용할 때 불필요한 테이블을 제거하지 않습니다. 오히려 깊이가 미리 알려지지 않은 계층 구조, 즉 상사의 상사의 보스를 처리하는 것입니다. 조직 트리가 얼마나 깊은 곳인지 알 수 있습니까? 계층 구조의 깊이를 미리 알고 자주 변경되지 않는 경우 중첩 된 집합에 대해 쿼리를 작성하면 두통이 가장 잘 피할 수 있으므로 별도의 테이블을 사용하는 것이 좋습니다. 단순성은 복잡성보다 낫습니다.

+0

무제한입니다. –

관련 문제