2012-02-21 3 views
2

에서 나는 다음과 같은 게시물에서 구조의 MySQL의 태그 매핑 테이블이 - TagID 및 항목 ID - Recommended SQL database design for tags or tagging업데이트 태그 매핑 테이블은 MySQL의

나는 두 개의 열이 있습니다. 일부 항목을 업데이트 (태그 변경)하고 싶습니다. 예를 들어 tagID의 1,2,3이있는 ID가 1 인 항목이 있습니다. 하지만 ID가 3,4,5 인 사용자가 원하는 태그 만 업데이트하십시오. 분명히 "1"과 "2"를 제거하고 "3"을 유지하고 "4"와 "5"를 추가해야합니다.

MySQL의 INSERT INGORE, ON DUPLICATE UPDATE 또는 일부 다른 "기능"을 사용하는 가장 간단한 방법은 무엇입니까?

모두 삭제하고 "새"태그를 모두 삽입하거나 모두 통과하고 별도로 삭제/삽입합니까? 최소 1, 최대 5 개의 태그가됩니다. 또는 태그/작업의 작은 숫자에 대해 실제로 중요하지 않습니다?

답변

5

테이블에 tag1, tag2, tag3, tag4, tag5를 포함하여 최대 다섯 개의 태그가 확실히 "가장 간단"할 것입니다. 추가 단순화를 위해 모든 5 개의 값을 업데이트 할 수 있으므로 태그 3,4,5는 tag1, tag2, tag3에 저장되고 tag4 및 tag5는 NULL로 저장됩니다. 분명히 확장 성이 없습니다. 많은 수의 (또는 잠재적으로 무제한) 태그를 사용하여이를 수행하기를 원하지 않을 것입니다.

다음으로 가장 간단한 것은 모두를 삭제하고 다시 삽입하는 것입니다. 그러나 특별히 우아하지는 않습니다.

제가 생각할 수있는 가장 우아한 방법은 두 가지 쿼리를 실행하는 것입니다. 첫 번째 태그는 새로운 태그 집합이 아닌 모든 것을 제거합니다. 두 개의 대체 태그 추가를 보여주기 위해 예제를 확장했습니다 : (3,4,5,6,7). 다음은 새 태그를 모두 삽입하지만 TagID와 ItemID의 UNIQUE 결합 색인에 따라 중복을 무시합니다.

#This creates the table and UNIQUE index, so you can understand how the next queries work 
CREATE TABLE `taglinks` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `ItemID` int(11) NOT NULL, 
    `TagID` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `Linkindex` (`ItemID`,`TagID`) 
); 

#This inserts example data 
INSERT INTO `taglinks` (`ItemID`, `TagID`) VALUES (1,1),(1,2),(1,3),(1,4),(1,5); 

#This removes tags 1 and 2 
DELETE FROM `taglinks` WHERE `ItemID` = 1 AND `TagID` NOT IN (3,4,5,6,7); 

#This adds two new tags (6 and 7). Tags 3, 4 and 5 are unaffected 
INSERT IGNORE INTO `taglinks` (`ItemID`, `TagID`) VALUES (1,6),(1,7),(1,3),(1,4),(1,5);