2012-08-04 6 views
0

나는 다양한 카테고리를 포함 할 테이블을 가지고 있습니다. 다음은 축소 된 테이블 구조 : 데이터 무결성이 동일한 테이블 내에서 유지 될 수 있도록 외래 키를 사용하는 동안 동일한 테이블에 parent_id가 포함 된 테이블

tb_categories 
    category_id 
    category_name 
    category_parent_id 

내가 CATEGORY_ID에 category_parent_id에 외래 키 제약 조건을 만들었습니다.

첫 번째 질문은 동일한 테이블에 외래 키를 갖는 것이 좋습니다. 제 사고 방식에서 저는 그러한 경우에 그렇다고 생각하고 있습니다. 그것은 좋은 습관입니다.

두 번째 질문은 전역 상위 엔티티를 저장하는 방법에 대한 최상의 접근 방법은 무엇입니까?

방법 1 :

나는 다음과 같은 방법을 함께했다 category_parent_id이 널 (null)을 저장할 수있는 유일한 널 모든

방법 2라는 글로벌 상위 범주이다 : 널 (null)을 저장할 수 없습니다 category_parent_id 글로벌 parrent ALL 동일한 category_id를 포함합니다. 따라서이 카테고리에 대해서만 category_id와 category_parent_id가 동일합니다. null이 없으면 0이 category_id로 존재하지 않으므로이 category_parent_id를 0으로 삽입 할 수 없습니다.

방법 3 : 글로벌 부모가없고 다른 '부모'가 있습니다. 예를 들어 Audio, Visual을 부모 및 MP3로, WMA를 Audio의 하위로, MPEG을 AVI로 Visual의 하위로 사용합니다. 이 방법을 통해 방법 1과 2의 동일한 원리가 적용됩니다.

방법 4 :이 외래 키 제약 조건을 포함하지 않는 것을 선호하는 가장 간단한 방법이며 따라서 전역 부모를 0으로 설정하여 다른 범주에 존재하지 않게 할 수 있습니다.

제안 사항? 내가 최선의 관행을 찾고 있으며 '단지 효과가있는'것이 아닙니다.

+0

[소프트웨어 문제에 대한 하나 개의 최고의 디자인 솔루션은 거의 없다. (http://www.codinghorror.com/blog/ 2008/03/revisiting-the-facts-and-fallacies-of-software-engineering.html) "Just works"는 얻을 수있는만큼 훌륭합니다. – Andomar

+0

나는 일반적으로 'Just works'를 언급하지 않는다. 나는 지금 당장의 일을 언급하고 있으며 앞으로 문제가 발생한다. – seedg

답변

1

테이블 자체를 참조하는 것이 정상입니다. 이 상황을 필요로하는 실제 시나리오가 많이 있습니다 (Employee -> Manager는 유명한 교과서 예제입니다).

그리고 하나의 글로벌 부모이거나 여러 글로벌 부모이든 "글로벌"부모를 갖게 될 것입니다. 따라서 접근 방법을 찾아야합니다.

나는 방법 1을 선호한다 - 부모가없는 요소는 부모를 가지지 않을 것이다. 왜냐하면, 그것은 정확히 당신의 비즈니스 규칙을 실현하기 때문이다.

복잡한 쿼리가있을 때 부모로서 0 또는 참조 자체가 문제를 일으킬 것이다 갖는

+0

이것이 제가 선택한 방법입니다. – seedg

관련 문제