2009-08-08 3 views
1

나는 옷 웹 애플리케이션을 개발 중이며, MySQL 데이터베이스에 데이터를 구성하는 방법에 대한 조언을 주시면 감사하겠습니다.다양한 속성을 가진 항목의 데이터베이스 구조

모든 제품 (의류 품목)은 여러 가지 방법으로 사진으로 찍히며 '모드'라고 부릅니다. 예를 들어, 셔츠는 단추로 찍히거나 단추가없는 채로 촬영되거나/또는 집어 넣을 수 있습니다. 한 쌍의 바지는 다른 가능한 속성 집합을 갖습니다. 이러한 항목을 사진에 찍는 방법에 대한 정보를 저장하여 나중에 해당 정보를 특정 방법으로 옷의 항목을 표시하는 데 사용할 수 있습니다.

그래서 하나의 방법은 하나의 테이블에있는 모든 가능한 속성을 저장하는 단지 것, 뭔가 같은 :

productId에 (FK, PK) modeId 이 isTuckedIn 크기 HasSmthUnderneath을 isLoose (PK)

여기서 속성은 다른 테이블에 정의 된 값이나 코드이거나 특정 모드에 적용되지 않는 경우 NULL 일 수 있습니다.

특정 productId와 modeId가 주어진다면, 적용되지 않는 속성에 대해 NULL 값을 필터링하고 관련 값만 사용할 수 있다고 상상해 봅니다.

그러나 한 가지 방법으로 만 촬영되는 바지 한 켤레와 같이 NULL 값이 많기 때문에 이러한 종류의 값을 저장하는 가장 이상적인 방법인지는 확실하지 않습니다. EAV 모델에 대해 들어 봤어?

속성 수는 사용자가 아닌 사용자가 결정하므로 상당히 변경해서는 안됩니다. 내 최종 목표는 특정 모드의 속성을 추출하여 응용 프로그램에서 해당 데이터를 사용할 수 있도록하는 것입니다.

불명의 점이 있으면 죄송합니다.

답변

5

나는

Mode Table 

id | mode_style 
--------------- 
1 | buttoned 
2 | unbuttoned 
3 | tucked in 
4 | untucked 

Clothes Table 

id | name  | description 
---------------------------- 
1 | shirt  | mans shirt... 
2 | dress  | short sleeve 

Clothes_mm_Mode Table (Junction/Map table) 

mode_id | clothes_id 
-------------------- 
1  | 1 
1  | 2 
3  | 3 

그럼 당신은 쉽게 옷의 특정 유형이 항상 표시되는 경우 속박 표시

SELECT 
    c.id, 
    c.name, 
    c.description 
FROM 
    Clothes c 
INNER JOIN 
    Clothes_Mode cm 
    ON c.id = cm.clothes_id 
WHERE 
    cm.mode_id = 2 

이 그 옷을 조회 할 수 있습니다 다음과 같은 정규화 된 스키마 설계를 유혹 할 것이다 모든 셔츠에 항상 버튼이 있고 단추가없는 디스플레이가있는 동일한 방식으로, Clothes_mm_Mode 표를 꺼내고 모드를 일반 모드 ID에 매핑하는 공통 모드 표를 도입 할 수 있습니다

(210)
Common_Modes Table 

id | name   | description 
-------------------------------------------------- 
1 | Men's Shirt | Common Modes for a Mens shirt 
2 | Women's Shirt | Common Modes for a Womens shirt 

Common_Modes_mm_Mode Table (Junction/Map table) 

common_mode_id | mode_id 
-------------------------------------------------- 
1    | 1 
1    | 2 
2    | 1 
2    | 2 

다음이 디자인의 장점은 의류의 새로운 항목을 추가 할 때, 하나의 레코드 만이 일반에 입력 할 필요가 없다는 것이다 공통 모드 유형

Clothing_Common_Modes Table 

clothing_id | common_mode_id 
---------------------------- 
1   | 1 

와 의류의 각 항목을 연관 해당 의류 항목을 의류 유형에 공통된 모드와 연관시키는 모드 표. 물론 원래의 Clothes_mm_Mode 테이블에 적절한 레코드를 삽입하는 절차를 통해 공통 모드 테이블없이 처리 할 수 ​​있지만 데이터베이스에 관계를 유지함으로써 더 눈에 잘 띄고 눈에 쉽게 띄게됩니다 유지하다.

1

디자인이 괜찮다고 생각합니다. 또는 당신에게 다음과 같은 디자인을 제공 할 수있는, 그것을 database normalization을 적용 할 수있을 것입니다 :

  1. 이 속성 당 하나 개의 테이블 (아이디, propvalue) 쌍 각이있다. 속성이 실제로 적용되는 항목에 대해서만이 테이블에 행을 추가하십시오.
  2. 은 일반 테이블 (id, propname, propvalue)을 가질 수 있습니다. 속성 데이터 유형 (부울, 숫자, 문자열) 당 하나의 테이블 일 수 있습니다.

귀하의 설명과 함께, 나는 어느 쪽이 잔인하다고 생각합니다. 유일한 예외는 속성이 여러 값을 갖는 경우입니다 (예 : 사용 가능한 색상 목록)

1

개인적으로이 유형의 일반 키/값 쌍은 과소 평가됩니다. 따라서 더 많이 제어 할 수 있다면 응용 프로그램 자체에서 다음과 같은 작업을 수행 할 수도 있습니다.

create table ProductStates 
(
    ProductId int PK 
    ModeState nvarchar(200) PK 
) 

내 마음에 좋고 단순합니다. 여분의 null 값을 얻지 못합니다. 제품에 해당 모드가있는 경우 행이 있고 행이없는 경우 또한 새로운 상태 인 경우 스키마 변경이 필요하지 않음을 의미합니다. 원하는 경우 무결성이 문제가 될 것이라고 생각한다면 ModeState 대신 ModeStates 조회 테이블에 연결할 수 있습니다.

create table ProductStates 
(
    ProductId int PK 
    ModeStateId int PK 
) 

create table ModeStates 
(
    ModeStateId int PK 
    ModeStateDescription nvarchar(500) 
    (...whatever else you might need here) 
) 

...그것은 아마도 중복됩니다.

나 자신을 그렇게 할 수 있을지 확실하지 않은 대안입니다 (간략한 내용에 따라 다름). 사양을 제대로 얻었습니까?