2011-04-26 8 views
2

저는 제품과 카테고리로 구성된 전자 상거래 상점에서 일하고 있습니다. 카테고리별로, 제조업체별로, 성별로 필터링하는 세 가지 주요 방법이 있습니다.제품 카탈로그 사이트의 데이터베이스 디자인

나는 제품 예를 나열 할 수 있습니다이 테이블을 사용하여 다음 표

products 
- id 
- name 
- manufacturer_id 
- gender_id 

categories 
- id 
- name 
- parent_id 

products2categories 
- id 
- product_id 
- category_id 

manufacturers 
- id 
- name 

gender 
- id 
- name 

이 모든 제품을 찾으십시오. manufacturer_id = 1, gender = 1, category= 453.

그러나 이러한 필터 조합 각각에 대해 이미지, 페이지 제목, 메타 태그, 표시 순서 등을 설정하고 싶습니다. 그래서 나는 다른 테이블에 추가 한 :

pages 
- id 
- category_id 
- manufacturer_id 
- gender_id 
- image 
- page_title 
- meta_description 
- display_order 

이 작동을하지만 지금은 모든 단일 가능한 조합이 테이블에 있는지 만드는 작업을해야합니다. 예를 들어 새 제품을 추가 할 때 모든 조합을 만들어야합니다. 또한 미래에 필터를 더 추가하려면 테이블이 커질 것입니다. 제가 사용할 수있는 또 다른 접근법이 있습니까, 아니면 이것이 유일한 방법입니까?

이 같은 더 정확히 일치하는 항목이없는 경우 당신은 "기본"또는 선택 될 것이다 "대체"기록을 사용할 수
+0

왜 제품 카테고리에 외래 키를 사용하지 않고 products2categories 테이블을 만들었습니까? – elvenbyte

+0

'gender'를위한 별도의 테이블? – Quassnoi

+0

@ Quassnoi : 성 (gender) 카테고리에서 폭발이 일어날 것입니다. –

답변

1

:

SELECT p.*, g.* 
FROM products p 
JOIN product2categories pс 
ON  pc.product_id = p.id 
LEFT JOIN 
     pages gcgm 
ON  gcgm.category_id = pc.category_id 
     AND gcgm.gender_id = p.gender_id 
     AND gcgm.manufacturer_id = p.manufacturer_id 
LEFT JOIN 
     pages gcg 
ON  gcg.category_id = pc.category_id 
     AND gcg.gender_id = p.gender_id 
     AND gcg.manufacturer_id IS NULL 
     AND gcgm.id IS NULL 
LEFT JOIN 
     pages gc 
ON  gc.category_id = pc.category_id 
     AND gc.gender_id IS NULL 
     AND gc.manufacturer_id IS NULL 
     AND gcg.id IS NULL 
JOIN pages g 
ON  g.id = COLAESCE(gcgm.id, gcg.id, gc.id) 
WHERE pc.category_id = 453 
     AND p.manufacturer_id = 1 
     AND p.gender = 1 

이 먼저 (gender, manufacturer, collection)의 완벽한 조합을 선택하려고하고 떨어질 것 처음에는 (collection, gender)으로, 그 다음에는 (collection)으로 실패합니다.

관련 문제