2012-02-21 3 views
2

に私は次のポストから構成されたMySQLのタグマッピングテーブルを持っている - タグIDとアイテムID - Recommended SQL database design for tags or tagging更新タグマッピングテーブルは、MySQL

私は2つの列を持っています。私はいくつかの項目を更新したい(タグを変更する)。たとえば、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個のタグがある場合は、間違いなく「最も単純」になります。簡単にするために、5つの値をすべて更新するだけで、タグ3,4,5がtag1、tag2、tag3に保存され、tag4とtag5がNULLとして保存されます。明らかにそれはスケーラビリティではありません - あなたは多数の(または潜在的に無制限の)タグでそれをしたくないでしょう。

次に最も単純なのは、すべてを削除して再挿入することですが、特に優雅ではありません。

私が考えることができる最もエレガントなやり方は、2つのクエリを実行することです。最初のタグは、新しいタグセットではないすべてのものを削除します。あなたの例を拡張して、2つの置換タグを追加することを示しました:(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);