인접성 목록 테이블 attribute
(재귀 용이성을 위해 attribute_closure
이라는 폐쇄 테이블이 있음)이 있습니다.인접 목록/마감 테이블에서 최종 재정의 된 ID를 찾기위한 SQL 쿼리
attribute
테이블의 각 항목은 4 가지 계층 유형 중 하나이며 각 유형은 및을 상속 할 수 있으며 상위 유형의 항목을 대체합니다. 네 가지 가능한 유형은 계층 구조에 따라 category
, product_line
, product
, model
입니다. 따라서 category
에는 정의 된 트리가 있으며 product_line
은 상속되며 언제든지 대체 할 수 있습니다. product
및 model
에 대해서도 마찬가지입니다.
이것은 기존의 기존 응용 프로그램에 대한 구조 때문에 구조 조정에 대한 어떤 제안을 사용할 수 없게 :-) 있습니다
그래서, 인접리스트 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
위의 속성을 포함하는 트리 쿼리, 그림에 표시된 다른 두 속성이 언급 한 바와 같이 30955.
에 의해 폐기해야한다로 ID 30955
을 반환하는 속성 발생한다, 나 또한 전형적인 폐쇄 테이블이 ancestor
, descendant
, level
을 매핑합니다. 클로저를 사용하여 재정의가 적용된 트리를 반환하는 결과를 포함시킬 수있는 경우 추가 브라우니 포인트. :-)