みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

タグを記録したテーブルの書き換えに関する質問です。

タグを記録したテーブルの書き換えに関する質問です。

このようなテーブルがあるとします。
tag_table
id | tag | entry
1 | foo | 1
2 | bar | 1
3 | hoge| 1
4 | foo | 2
5 | foo | 3
6 | bar | 3

entry1に付けられたタグは"foo","bar","hoge"、entry2に付けられたタグは"foo"、entry3に付けられたタグは"foo"と"bar"という状態です。
entryについて記録したテーブルは当然別にあります。

質問は、こうしたテーブル設計において、tag_tableの書き換えはどのように行えばいいかについてです。

例えばentry1が編集され、タグが「foo」「bar」「hoge」から「foo」「bar」に変更されたとします。
この時、考えられる処理はどういうものになるでしょうか?

私が思いついたのはentry1のレコードはいったんすべて削除してしまい、それからまた新たに編集後のタグをINSERTするというものでした。
つまりどういう処理内容だったとしても、既存のレコードはいったんすべて削除してしまい、それから再びINSERTし直すというような方法です。
これが妥当なのかどうか、他にもっとも良い方法があるのならそれを教えていただきたいのです。

どうぞよろしくお願い致します。

投稿日時 - 2010-10-13 13:12:52

QNo.6247076

困ってます

質問者が選んだベストアンサー

まず条件が必要。

(1)idがint not nullでprimaryもしくはuniqueでauto_incrementであること
(2)tag,entryの組合せがuniqueであること

insertでデータを流し込み、条件に合致しないデータをdeleteすると効率的です。

insert ignore into tag_table (tag,entry) values('foo',1),('bar',1);
delete from tag_table where entry=1 and not(tag IN ('foo','bar'));

やっていることは全部消して、新規で投入するのとさほど変わりませんが
上記のようにやると登録済みのデータに対して最小限の更新にとどめられる分
無駄が減ります。(idに余計な付番がなくなります)

投稿日時 - 2010-10-13 13:36:21

お礼

いつも言葉足らずな質問を的確に答えていただきありがとうございます。
まさに求めていた答えでした。
本当にありがとうございました。
感謝してもしきれません。

投稿日時 - 2010-10-13 21:24:30

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

>例えばentry1が編集され、タグが「foo」「bar」「hoge」から「foo」「bar」に変更されたとします。
(1)entry1って何ですか?
何の説明もなくいきなり出てきた語句で、意味不明です。
(2)どうして「hoge」が無くなったんですか?
「id=3のレコードのentryが2になったから」などの
説明が抜けています。
>この時、考えられる処理はどういうものになるでしょうか?
(1)この時って何の話でしょうか?
変更処理自体のことですか?変更後の話ですか?

このページを見ている人はアナタの側で付ききりになって
見ているわけではないので、条件とか用語とか丁寧に説明
しないと、何が何だかサッパリ分かりませんよ。

投稿日時 - 2010-10-13 13:35:41

あなたにオススメの質問