테이블에 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);