2012-05-27 4 views
0

주요 카테 고리 (상위 열)에 0이 포함되어 있고 하위 카테고리에 상위 카테고리의 ID가 포함되어있는 카테고리라는 표가 생성됩니다. 나는 그것이 Referencing이라고 불리는 것을 들었다. 내 질문 : 나는이 테이블을 제대로 strucutred 가지고 있습니까? 또는 순회 트리 또는 유사한 방법을 구현하는 것과 같은 더 좋은 방법이 있습니까?MySQL : 교차 테이블 범주 및 하위 범주에 대한 참조 (기본, 마스터, 이름)?

CREATE TABLE `categories` (
`primary_id` int(11) NOT NULL auto_increment, 
`master_id` int(11) NOT NULL default '0', 
`name` varchar(50) NOT NULL default '', 
PRIMARY KEY (`c_id`) 
) 

INSERT INTO `categories` (`primary_id`, `master_id`, `name`) VALUES 
(1, '0', 'Games'), 
(2, '0', 'Technology'), 
(3, '0', 'Science'), 
(4, '0', 'Pop Culture'), 
(5, '0', 'Jobs/Services'), 
(6, '0', 'Blogs'), 
(7, '1', 'Computer'), 
(8, '1', 'Game Console'), 
(9, '2', 'Cellphone'), 
(10, '2', 'Audio/Video/Photos'), 
(11, '2', 'Laptop'), 
(12, '2', 'Others >'), 
(13, '3', 'Human Body'), 
(14, '3', 'Ocean Life'), 
(15, '3', 'Plant Life'), 
(16, '3', 'Animal Life'), 
(17, '4', 'Artist'), 
(18, '4', 'Upcoming'), 
(19, '5', 'Jobs'), 
(20, '5', 'Tutoring'), 
(21, '5', 'Seminars'), 
(22, '5', 'Haircuts'), 
(23, '9', 'Iphone'), 
(24, '9', 'Android'), 
(25, '9', 'Windows Mobile'), 
(26, '11', 'Toshiba'), 
(27, '11', 'HP'), 
(28, '11', 'Apple'), 

답변

1

InnoDB 엔진을 사용하면 테이블에 대한 참조 무결성을 강화할 수 있습니다. 이 전략이 충분히 작동하지만

CREATE TABLE `categories` (
`primary_id` int(11) NOT NULL auto_increment, 
`master_id` int(11) NOT NULL default '0', 
`name` varchar(50) NOT NULL default '', 
PRIMARY KEY (`c_id`), 
KEY `fk_master_id1` (`master_id`), 
CONSTRAINT `fk_master_id1` FOREIGN KEY (`master_id`) REFERENCES `master` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

: 그런 식으로, 당신은 당신이 등, 부모를 삭제로 만들 문을 변경하는 경우 캐스케이드 아동 범주를 삭제, 당신은 결코 일치하는 부모 ID를 가지고 있지 않은 카테고리를 삽입 없는지 확인 할 수 있습니다 대부분의 경우에 트리 구조를 구현하기위한 다른 전략과이를 효과적으로 쿼리하는 데 따르는 과제를 살펴볼 수도 있습니다. MySQL에서 나무와 같은 구조를 저장하기위한 대체 설계에 대한 자세한 정보는 this 답변을 참조하십시오.

+0

감사합니다. 나는 너의 충고를 따를 것이다. – CodingWonders90

+0

어떻게하면 쿼리를 실행할 때 "# 1064 - SQL 구문에 오류가 있습니다 : 근처의 올바른 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인하십시오 'RESTRICT ON UPDATE RESTRICT) ENGINE = InnoDB DEFAULT CHARSET = latin1 'at line 7 " – CodingWonders90

+1

지금 사용해보십시오. 마스터 테이블의 실제 컬럼 이름과 일치하도록 조회를 편집하십시오. – Jeshurun

관련 문제