2010-01-04 2 views
5

카테고리를 만들기 위해 인접리스트 모델을 사용하고 있으며 완벽하게 작동합니다.나무와 같은 카테고리 시스템의 데이터베이스 디자인

특정 카테고리 (예 : 전자 제품)의 기사를 검색 할 때 하위 카테고리 (예 : 전자 제품 -> 카메라 또는 전자 제품 -> 카메라 -> 카메라 렌즈)의 기사도 검색하고 싶습니다.

내가 지금하고있는 방식은 전자 제품의 하위 카테고리의 모든 카테고리 ID를 가져와이 목록의 category_id가있는 모든 기사를 찾는 것입니다.

이것은 매우 비효율적이며 많은 시간이 소요됩니다. 그 결과 많은 쿼리가 이러한 하위 카테고리를 검색 할 수 있기 때문입니다.

내가 생각한 또 다른 방법은 모든 카테고리 트리 (예 : 카메라 렌즈에 관한 기사는 MANY_MANY 테이블의 카메라 및 전자 제품 카테고리와 연결될 것입니다.)와 관련된 모든 기사를 가져 오는 것입니다. 전자 제품에서도 나타날 것입니다.

각 기사에 대해 3 개 또는 4 개의 카테고리를 저장해야하기 때문에 이렇게하면 많은 중복 데이터가 데이터베이스에 추가됩니다. 또한 기사를 다른 카테고리로 이동하는 것과 같은 작업을 복잡하게 만듭니다.

이것이 올바른 방법인가요? 아니면 내가 생각하지 못한 더 좋고/더 쉬운 방법이 있습니까?

도움을 주셨습니다.

+0

당신이 지금하고있는 방식은 지금 당신이 묘사하는 두 번째 방법과 비교할 때 완벽하게 잘 들립니다. –

답변

12

중첩 세트 모델링에 대한이 기사의 읽기 : Managing Hierarchical Data in MySQL.

제안 된 기술을 사용하면 하나의 단일 SELECT에서 전체 트리 또는 하위 트리를 가져올 수 있습니다. 그것은 "보통"접근법보다 조금 복잡합니다. 그러나 테이블에서 많은 양의 읽기를 수행한다면 가치가 있습니다.

+0

나는 기사를 좋아하지만 질문이있다. 같은 테이블에 두 번째 트리가 있다고 가정합니다. 루트의 lft는 21이 될 것입니다. 그러면 우리는 이전 트리에 다른 아이를 추가합니다. 그러면 트리의 루트의 rgt가 다음 루트와 겹치게됩니다. 어떻게 해결할 수 있습니까? 새로 삽입 한 노드의 오른쪽에있는 모든 노드의 번호를 다시 매기고 싶지는 않습니다. 그게 유일한 방법인가요? –

+0

신경 쓰지 마세요. 새로운 노드 추가에 관한 절은 결정적이라고 생각합니다. 조금 비싸지 않습니까? 테이블의 초기 트리 중 하나에서 추가 또는 제거를 수행하면 거의 모든 테이블에서 반복하여 lft 및 rft 값을 업데이트합니다. 일반적으로 받아 들여질 수 있습니까? –

+0

당신은 스스로 균형을 맞추어야한다고 생각합니다 : 총 레코드 수 * 쓰기 양/읽기량 – nickf