2011-08-25 3 views
1

나는
에게 제품 테이블 "제품"별도의 테이블에 제품 등록 정보를 저장하는 데이터 모델? 내가 필요로하는 지금 proStatus <br/></p> <p>- proID (PK) <br/> - - proName <br/> - proDescription <br/> - proPrice <br/> - proSize <br/>

제품을 두 가지 추가 속성 (유형 및 색상)을 추가하고 나중에 더 많이 추가 할 수 있습니다. 미래에는 각기 다른 특성을 지닌 다양한 제품을 얻을 수 있습니다.

두 개의 추가 속성은 제품 테이블의 일부 제품에만 적용됩니다.

제품 테이블에 속성을 추가하거나 이러한 속성 및 값을 저장하기 위해 별도의 테이블을 만드는 것이 더 좋습니까?

내가 그들을 좋아 저장할 수 :

product_properties을
- pprID (PK)
- pprName

product_properties_values ​​
- pprID (PK)
- proID (PK)
- ppvValue

답변

1

, 당신은 제품이 가질 수있는 모든 속성을 나열하는 제품 _ 테이블을 가질 수 있습니다.

제품 _ 테이블 : TYPE_ID

  • TYPE_NAME
  • type_property_1
  • type_property_2

생성물 테이블 :

  • 등을 TYPE_ID PRODUCT_ID
별도의 type 테이블을 갖는 이점은 그것의 새로운 속성을 추가하는 등 변경을 상대적으로 쉬울 것 때문에 아마 작은 것입니다

미래. 또한 디스크 공간을 절약 할 수 있습니다.

별도의 type 테이블이없는 이점은 등록 정보가있는 제품을 나열하기 위해 두 테이블을 조인 할 필요가 없다는 것입니다. 즉, 쿼리 성능이 더 좋을 것입니다.

0

EAV 모델 (Entity-Attribute-Value)처럼 들립니다.
Google에 대한 자세한 정보는 google을 참조하십시오.
일부 사람들은 EAV를 좋아하지만 많은 사람들이 데이터베이스의 디자인이 좋지 않다고 생각합니다.

난 당신이 데이터베이스 설계 및 EAV에 대한이 스레드를 읽어 제안 : 당신이 normalized 스키마를 갖고 싶어
single fixed table with multiple columns vs flexible abstract tables

+1

개인적으로는 EAV가 올바르게 사용되는 한 EAV에는 아무런 문제가 없습니다. – Andrey

+0

어떻게 EAV 속성을 'NOT NULL'로 만들겠습니까? 또는 속성을 조회 테이블에 연결 하시겠습니까? 또는 어떤 응용 프로그램도 정수가 될 속성에 문자열을 입력 할 수 없습니까? –

1

xml 또는 json 형식의 모든 필드를 저장하는 TEXT 필드가 다른 방법으로 사용됩니다. 프로젝트에서 우리는 xml을 사용합니다. 속성으로 검색해야하기 때문입니다. ExtractValue mysql 함수를 사용하여 모든 속성으로 검색 할 수 있습니다.

http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html#function_extractvalue

를 참조하지만 당신은 검색 할 필요가없는 경우 JSON은 더 빠르게 될 것입니다.

1

문제 : Entity - Attribute - Value입니다. 더 나은 확장 성을 위해 속성에 대한 테이블과 값에 대한 테이블 중 하나를 제품에 사용해야합니다. 당신이 썼던 것처럼 :

product_properties

  • pprID (PK)
  • pprName

product_properties_values ​​

  • pprID (PK)
  • proID (PK)
  • ppvValue

mysql 왼쪽 join 문을 사용하여 테이블을 쉽게 쿼리 할 수 ​​있습니다. 예를 들어 제품 X 속성은 무엇입니까?

select ppr.pprName, ppv.ppvValue 
from products as pro 
left join product_properties_values as ppv on pro.proID=ppv.proID 
left join product_properties as ppr on ppr.pprID=ppv.pprID 
where pro.proName='X' order by ppr.pprName desc