2012-02-21 4 views
2

У меня есть тег-таблица сопоставление MySQL со структурой из следующего поста - Recommended SQL database design for tags or taggingОбновления таблица тегов отображение в MySQL

У меня есть две колонок - TagID и ItemID. Я хочу сделать обновление для некоторого элемента (изменить его теги). Например, у меня был элемент с ID = 1 с tagID 1,2,3. Но при обновлении пользователь хочет только теги с ID 3,4,5. Очевидно, мне нужно удалить «1» и «2», сохранить «3» и добавить «4» и «5».

Что является самым простым способом/самым элегантным для этого (используйте INSERT INGORE'S, ON DUPLICATE UPDATE или некоторые другие «функции» MySQL)?

Удалить все и вставить все «новые» теги назад или просмотреть их все и удалить/вставить отдельно? Это будет мин. 1, максимум 5 тегов. Или это действительно не имеет значения для такого небольшого количества тегов/операций?

ответ

5

Если у вас определенно есть максимум пять тегов, включая их в таблице как tag1, tag2, tag3, tag4, tag5, безусловно, будет «простейшим». Для дополнительной простоты вы можете просто обновить все 5 значений, поэтому теги 3,4,5 сохраняются в tag1, tag2, tag3, а tag4 и tag5 сохраняются как NULL. Очевидно, что он не масштабируется - вы определенно не захотите делать это с помощью большого количества (или потенциально неограниченных) тегов.

Следующим простейшим было бы удалить все и повторно вставить, но это не особенно элегантно.

Самый элегантный способ, который я могу придумать, - запустить два запроса. Первый удалит все, что не является вашим новым набором тегов. Я добавил ваш пример, чтобы показать добавление двух замещающих тегов: (3,4,5,6,7). Следующий будет вставлять все ваши новые теги, но будет игнорировать дубликаты, основанные на объединенном индексе UNIQUE TagID и ItemID.

#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); 
Смежные вопросы