2014-12-01 4 views
0

데이터베이스의 한 행에 대해 일대 다 관계를 올바르게 작성하는 방법을 알아 내려고합니다.여러 개의 일대 다 관계에 대한 스키마가 수정 되었습니까?

전 제품 테이블이 있습니다.

CREATE TABLE `product` (
`productID` int(11) NOT NULL AUTO_INCREMENT, 
`productName` varchar(45) NOT NULL, 
PRIMARY KEY (`productID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

제품에는 일대일 카테고리 관계 또는 일대 다 대응이있을 수 있습니다.

CREATE TABLE `category` (
`categoryID` int(11) NOT NULL AUTO_INCREMENT, 
`categoryName` varchar(45) NOT NULL, 
PRIMARY KEY (`categoryID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

내가 외국 키 조회 테이블을 만들었습니다,하지만 난 그것을 여러 다른 카테고리 그룹과 관련된 제품이있을 수 있기 때문에 작업을 거라고 생각하지 않습니다. 내 데이터베이스에 쿼리 수준에 따라 쿼리의 각 높은 수준이 이전 수준에 의존하는


CREATE TABLE `category_to_product` (
`categoryID` int(11) NOT NULL, 
`productID` int(11) NOT NULL, 
KEY `categoryID` (`categoryID`), 
KEY `productID` (`productID`), 
CONSTRAINT `category_to_product_ibfk_2` FOREIGN KEY (`productID`) 
REFERENCES `product` (`productID`) ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT `category_to_product_ibfk_1` FOREIGN KEY (`categoryID`) 
REFERENCES `category` (`categoryID`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

편집 할 수 있습니다. 수준 1은 기본 수준의 쿼리가되며 가장 일반적인 정보를 포함하므로이 범주는 전자 제품이라고 말할 수 있습니다.

레벨 2 쿼리는 약간 더 세련된 쿼리가 될 것이므로 electronics-> television과 같은 전자 장치의 하위 범주가됩니다. 빵 부스러기로 생각하십시오. 이것은 그 자체로하기가 힘들지만,이 경우 제품은 동일한 레벨 또는 다른 레벨을 포함 할 수있는 몇 가지 다른 카테고리 그룹과 관련 될 수 있어야합니다. 나는 이것이 의미가 있기를 바랍니다.


이 유형의 관계에 대해 데이터베이스를 어떻게 구성합니까? 처음에는 카테고리 테이블을 룩업 테이블의 각기 다른 열에서 분리 시켰습니다. 잘 작동했지만 너무 많은 NULL 값이있었습니다. 그룹에 대한

+0

나는이 문제를 이해하지 못한다. 우선, 이것은 일대 다 관계가 아니라 다 대다 관계 (제품 1에는 많은 카테고리가있을 수 있고 카테고리 빨간색에는 많은 제품이있을 수 있음)입니다. 당신의 접근 방식이 좋아 보인다. 'KEY categoryID (categoryID), KEY productID (productID)'를 결합 된 기본 키인'PRIMARY KEY (productID, categoryID)'로 대체하십시오. 실제로 당신의 질문/문제는 무엇입니까? –

+0

이 작업을 수행하는 방법에 대해 더 많은 연구를 마친 후 필자가 필요로하는 모델은 MYSQL에서 관리하기가 엉망인 것처럼 보이는 계층 구조와 유사합니다. 곧 명확한 설명과 다이어그램으로 질문을 업데이트 할 것입니다. – EternalHour

답변

0

매우 일반적인 접근 방식입니다. 제품에는 모델에서 고정 된 속성 (이름 제외)이 없지만 선택적 연관 속성 세트가 있습니다. 그래서 알려지지 않은 색과 물질의 바지가있을 수 있습니다. 또는 주석으로 만든면과 바지로 만든 컴퓨터. 20 가지 색상의 Xbox 미러와 경량 및 중량급의 자전거.

빨간색과 녹색이 색상이고 플라스틱과 금속이 재료라는 것을 알지 못합니다.

그래서 처음부터 시작해야합니다. 실제로 필요한 것은 무엇입니까? '컴퓨터'및 '세탁기'와 같은 제품 그룹이 없습니까?그런 다음 각 그룹에는 컴퓨터의 경우 CPU 및 세탁기의 에너지 클래스와 같은 필수 속성이있을 수 있습니다. 색상과 같은 선택 속성 (지정 가능하지만 필요하지는 않음) 또는 컴퓨터 화면 (예 : 아니. 그런 다음 각 제품은 제품 그룹에 속할 것이고 어떤 속성을 입력 할 수 있는지 또는 입력해야하는지 (어떤 속성에 따라 특정 제품을 필터링 할 수 있는지) 알 수 있습니다. |

  • CPU = 인텔 I5를 :

    그런 다음 당신이 어떤 속성에 대해 생각 Intel i7 | AMD FX = 하나의 CPU에 가능한 값 목록

  • color = white | 검은 색 | ... = 또한 목록이지만 제품 당 하나 이상의 색상이있을 수 있습니다.
  • mouse = yes | 아니오 = 부울 플래그
  • modelno은 = ____ = 무료 문자는

속성 그리고 이들에 대한 적절한 테이블 디자인 생각합니다.

color = luminous bright orange => bright orange => orange (모든 주황색 제품 또는 밝은 주황색 제품 또는 심지어 밝은 주황색 제품을 검색 할 수 있도록)과 같은 계층 구조 속성을 원한다면, 그것도 구조. 그러나 다음 : 빛나는 오렌지색 제품이나 밝은 색상의 제품을 찾아 볼 수 없어야합니까? 그러면 더 이상 계층 적 트리가되지 않습니다.

이 모든 것이 매우 복잡해 질 수 있습니다. 당신이 정말로 필요로하는 것을 생각하십시오. 필요에 따라 복잡하게 만드십시오.하지만 복잡하게 만드십시오.

+0

의견에 감사드립니다. 당신은 내가 더 다재다능한 더 나은 구조가 필요하다는 것을 깨달을 수있었습니다. 제품 그룹이 있습니다. 단지 제품 그룹간에 공통된 관계를 찾는 것입니다. 그러나 "깡통 바지"는 확실히 선택 사항이 아닙니다! – EternalHour

0

귀하의 예를 제 3 테이블을 지시하지만 먼저 당신이 당신의 category_to_product_table에 기본 키를 추가해야합니다 (* id INT (11) NOT NULL AUTO_INCREMENT)

세 번째 테이블 :

하는 테이블 만들기 category_to_product_groups ( id INT (11) NOT NULL AUTO_INCREMENT, categoryProductGroupName VARCHAR (40) category_to_product_id INT (11) NOT NULL, ) ENGINE = 이노 DEFAULT 문자셋 = UTF8

,617,

이 세 번째 테이블에는 그룹 이름 당 여러 행이 있습니다 (그룹은 단순히 하나 이상의 category_to_product 행이 될 수 있음).

+0

이것은 내가 가진 딜레마입니다. 카테고리를 분리 된 상태로 유지해야합니다. 그룹 테이블의 문제점은 제품 테이블의 모든 행이 다른 그룹을 갖게된다는 것입니다. – EternalHour

+0

왜 그룹이 달라야합니까? 나는 당신을 붙잡고있는 것이면 CONSTRAINTS와 REFS를 만드는 옵션을 제거 할 것입니다. 가능한 경우 스키마를 유연하게 만들고 스크립트 언어 (파이썬, PHP 등)를 통해 삭제 및 참조를 수행하십시오. 여기에 요점을 놓치고 있다면 알려주세요. –

+0

카테고리는 각 제품이 관련 될 수 있기 때문에 분리되어야합니다. – EternalHour