----------------------------------------------------------
전형적인 분류 문제죠.
자기 자신을 참조하는 테이블을 만드세요. 간단히 적어보자면...
분류 부모ID int
분류ID 자동증가
깊이 int
분류명 string
모양이 되겠지요. 최상위 분류의 경우는 분류 부모 ID에 임의 수를 넣지요(저의 경우는 0을 넣어염)
데이터의 모양은 다음과 같겠군요.
(0, 1, 1, 모니터)
(1, 2, 2, LCD)
(1, 3, 2, PDP)...
이런 상태에서 부모 분류가 모니터인 것을 검색하면
LCD, PDP 등의 하위 분류가 나오겠지요.
그럼 즐거운 하루 되세요.
------------------------------------------------
물론 이런식이 좋기는 합니다만, 저같은 경우 분류는 거의 비정규화된
테이블을 이용하는데, 혹시나 좋은 방법이 있을까 하여 묻습니다.
제가 쓰는 것을 간력히 표현하면,
코드, 첫번째 분류, 두번째 분류
b-00-00, 서적,null
b-01-00, 서적, 인문학
b-02-00, 서적, 과학
c-00-00, 잡화, null
c-01-00, 잡화, 포장지
좀 우습죠? 그러나 아주 잘 작동 합니다.
가장 큰 약점은 역시 질문자의 경우처럼 카테고리가 많이 확장할 경우인데..
우선 서적류를 다 표시해라
select * from 상품 where 카테고리 like 'b%';
가뿐합니다.
위의 것의 경우는
카테고리가 1이고 엄마카테고리가 1인 카테고리와 그 카테고리넘버를
엄마로 가지는 카테고리를 모두 모은다.
select * from 상품 where 카테고리 in (모은것);
이런것 밖에 생각이 안나는 군요.
물론 위의 것의 경우에도 이렇게 쓰면 똑같아 집니다.
자신넘버, 부모코드, 카테고리코드,이름
1,0,b-00-00,서적
2,1,b-01-00,인문학
...
근데 보면 어이없죠?
왜냐면, " 서적> 인문학> 국문학 " 이런것을 표시하려면,
위의 것은
select * from 카테고리 where 코드='국문학코드';
해서
print (첫번째 이름 > 두번째 이름 > 세번째 이름) ;
이렇게 쓰면 되지만
아래것은 또 찾아해맨다음 써줘야 하니까요.
완전 동적으로 늘어났다 줄수 밖에 없는 분류가 아니라면
딱 비정규화 하기에 좋은 것이 카테고리 테이블이 아닌가 합니다.
코드가 더 늘어난다면 b-00-00-00으로 더 늘리면 되고
like 쿼리를 이용하면 쿼리 수정도 사실상 없앨수 있죠.
혼합하여 쓸수도 있겠습니다.
좋은 방법 없나요?
|