2013-02-06 2 views
0

인접성 목록 테이블 attribute (재귀 용이성을 위해 attribute_closure이라는 폐쇄 테이블이 있음)이 있습니다.인접 목록/마감 테이블에서 최종 재정의 된 ID를 찾기위한 SQL 쿼리

attribute 테이블의 각 항목은 4 가지 계층 유형 중 하나이며 각 유형은 을 상속 할 수 있으며 상위 유형의 항목을 대체합니다. 네 가지 가능한 유형은 계층 구조에 따라 category, product_line, product, model입니다. 따라서 category에는 정의 된 트리가 있으며 product_line은 상속되며 언제든지 대체 할 수 있습니다. productmodel에 대해서도 마찬가지입니다.

이것은 기존의 기존 응용 프로그램에 대한 구조 때문에 구조 조정에 대한 어떤 제안을 사용할 수 없게 :-) 있습니다

그래서, 인접리스트 attribute, 다음과 같은 열이 있습니다 id, parent_id, overrides_id, overrides_id과을 (설정 한 경우)는 attribute.id에 대한 참조이며, parent_id과 동일합니다. overrides_id이 설정된 경우 parent_id은 항상 재정의 된 속성의 parent_id 값과 일치합니다.

각 계층 유형에 대해 유형을 속성에 매핑하는 지원 테이블이 있습니다 (예 : category_id, attribute_id).

모든 우선 적용을 고려한 전체 특성 트리를 다시 가져올 수 있어야합니다.

예제 데이터 (이 특정 사례는 제품 수준에만 적용되지만 아이디어를 얻을 수 있음). 필요에 따라 자신의 샘플 데이터로 더 자세히 분석하십시오.

attribute

+-------+-----------+--------------+ 
| id | parent_id | overrides_id | 
+-------+-----------+--------------+ 
| 6036 |  5931 |   NULL | 
| 6069 |  5931 |   6036 | 
| 30955 |  5931 |   6069 | 
+-------+-----------+--------------+ 

category_attribute

+-------------+--------------+ 
| category_id | attribute_id | 
+-------------+--------------+ 
|   2 |   6036 | 
+-------------+--------------+ 

product_line_attribute

+-----------------+--------------+ 
| product_line_id | attribute_id | 
+-----------------+--------------+ 
|    16 |   6069 | 
+-----------------+--------------+ 

product_attribute

,897,255,996,559,432 10

위의 속성을 포함하는 트리 쿼리, 그림에 표시된 다른 두 속성이 언급 한 바와 같이 30955.

에 의해 폐기해야한다로 ID 30955을 반환하는 속성 발생한다, 나 또한 전형적인 폐쇄 테이블이 ancestor, descendant, level을 매핑합니다. 클로저를 사용하여 재정의가 적용된 트리를 반환하는 결과를 포함시킬 수있는 경우 추가 브라우니 포인트. :-)

답변

0

해결 방법 위로 가기 결국 overrides의 계층 구조를 나타내는 두 번째 closure 테이블을 작성했습니다 (parent_id를 기반으로 클로저를 작성하는 대신 overrides_id를 사용함). 이렇게하면 주어진 속성에 대한 대체의 전체 계층 구조를 찾도록 쿼리 할 수 ​​있습니다.

나는 쿼리 - 투 - 엔드 - 그들 - 모두를 찾고 싶었지만, 두 번째 클로저 테이블로가는 것이 더 간단하고, 성능면에서 더 좋았다.