2012-02-12 2 views
3

제품 및 관련 동적 제품 특성에 대한 데이터베이스/모델 디자인을 고안하려고합니다. 그러나 모델링 부분에서 나는 많은 "JOINS"를 사용하여 결국 "뭔가 잘못하고있다"고 생각합니다. 기본적으로 원하는 기능을 달성하는 방법에 대한 정보를 얻으려고합니다. 아마도 더 간단한 디자인 일 것입니다. 경험을 가진 사람은 내가 중요성의 무언가를 놓친 느낌해야 - 다음 가르치 려하시기 바랍니다 : 동적 제품의쿼리를 명확하고 효과적으로 유지하면서 동적 특성을 얻는 방법

예 속성 :

  • 크기
  • 컬러
  • 제조업체
  • 무게

"다이나믹 "속성은 두 가지 측면을 다루고 있습니다. 하나의 값 (예 : 어떤 값과 같은 가중치) 또는 다른 예제의 색상 (많은 다른 값을 가짐)이 있습니다. 속성 값 외에도 각 속성에는 고유 한 언어 설정이 있습니다. 예 : 속성 키/값은 고객 언어에 따라 변경 될 수 있습니다. 내 tabels입니다의

구조 :

SELECT pv.price, pv.special_price, pv.overlay_id, p.id, pv.id variant, pl.url_key, pl.name, UNIX_TIMESTAMP(p.created) created, al.value color_value, a.id color_id,al.name color_name 
FROM x_product_attribute pa 
INNER JOIN x_attribute_group ag 
ON pa.attribute_id = ag.id AND pa.group = 1 AND pa.variant = 0 AND ag.type LIKE 'color%' 
INNER JOIN x_attribute_group_languages agl 
ON agl.attribute_group_id = ag.id AND agl.locale = :locale 
INNER JOIN x_attribute_groups_attributes aga 
ON aga.attribute_group_id = pa.attribute_id 
INNER JOIN x_product_attribute pa2 
ON aga.attribute_id = pa2.attribute_id AND pa2.variant = 1 AND pa2.group = 0 
INNER JOIN product_variants pv 
ON pa2.product_id = pv.id 
INNER JOIN x_attribute_languages al 
ON al.attribute_id = pa2.attribute_id AND al.locale = :locale 
INNER JOIN x_attribute a 
ON a.id = pa2.attribute_id 
INNER JOIN products p 
ON p.id = pa.product_id 
INNER JOIN product_languages pl 
ON pl.product_id = p.id 
INNER JOIN shop_products sp 
ON sp.shop_id = :shop_id AND sp.product_id = pa.product_id 
GROUP BY p.id,a.id 
ORDER BY p.created DESC,a.sort ASC, p.id DESC 
: 최신 제품과 일치하는 특성을 가져하기 위해

, 나는 아래의 불쾌한 쿼리를 실행 쿼리의

Product 

- id 
- created 
- modified 

Product_variants 

- id 
- product_id 
- quantity 
- price 

Attribute 

- id 
- visible 
- required 
- comparable 

Attribute_group 

- id 
- type 

Attribute_groups_attributes 

- attribute_group_id 
- attribute_id 

Attribute_group_languages 

- id 
- attribute_group_id 
- name 
- locale 

Attribute_languages 

- id 
- attribute_id 
- name 
- value 
- locale 

Product_attribute 

- product_id 
- attribute_id 
- group 
- variant 

앞서 언급했듯이 관련 검색어에 많은 JOINS가 있어야합니다. 간단합니다. 이것을 좀 더 작은 쿼리로 나눌 수는 있지만 가장 효과적인 것이 무엇인지 확신 할 수는 없습니다. 여전히 속성의 "동적"속성을 매핑하고 유지하는 중입니다.

+0

'동적 속성'을 참조 할 때 디자인 타임에 알려지지 않은 속성에 대해 이야기하고 있습니까? 당신 질문에서 그것은 그런 경우가 아닌 것처럼 보입니다 –

+0

맞습니다. 그것들은 사용자에 의해 만들어지기 때문에 데이터베이스의 각 속성에 대해 특정 열을 작성하는 것이 아닙니다. – Kristian

+0

PostgreSQL을'hstore' 모듈 (또는 9.2의 JSON 열 포함)과 함께 사용할 수 있습니다. –

답변

1

MongoDB과 같은 NoSQL 솔루션을 제안합니다. 간단한 이름 - 값 쌍 (예 : JSON)으로 제품을 표현할 수 있으므로 응용 프로그램을 훨씬 쉽게 디자인 할 수 있습니다.

SQL을 고수하면 응용 프로그램과 데이터베이스가 관리하기 어려워진다는 것을 알게 될 것입니다.

+1

EAV 모델을 통해 MongoDB를 선택했습니다. 감사합니다. – Kristian

+0

도움이 되니 기쁩니다! 행운을 빕니다 –

관련 문제