一度に挿入できるのは1つのテーブルのみです。
1つの解決策はトリガーを使用することであり、もう1つはトランザクションを使用することです。
前者は任意のエンジンで使用でき、後者はInnoDBまたは同様のエンジンを必要とします。
必ずUNIQUE
フィールドにインデックスを付けてくださいtag.name
。
1-トランザクションの使用
START TRANSACTION;
INSERT IGNORE INTO tag (name) VALUES ('$example1', '$example2');
INSERT INTO article (title, body) VALUES ('$title','$body');
SET @article_id = LAST_INSERT_ID();
INSERT INTO tag_link (tag_id, article_id)
SELECT t.id, @article_id FROM tag t WHERE t.name IN ('$example1','$example2');
COMMIT;
2-ブラックホールテーブルでトリガーを使用する
blackhole
次のフィールドを使用して タイプのテーブルを作成します。
title: varchar(255)
body: text
tag1: varchar(50) DEFAULT NULL
tag2: varchar(50) DEFAULT NULL
...
add as many tags as you want.
AFTER INSERT
ブラックホールテーブルにトリガーを追加して、実際のストレージを実行します。
DELIMITER $$
CREATE TRIGGER ai_bh_newacticle_each AFTER INSERT ON bh_newacticle FOR EACH ROW
BEGIN
INSERT IGNORE INTO tag (name) VALUES (new.tag1, new.tag2,...,new.tag25);
INSERT INTO article (title, body) VALUES (new.title,new.body);
SET @article_id = LAST_INSERT_ID();
INSERT INTO tag_link (tag_id, article_id)
SELECT t.id, @article_id FROM tag t
WHERE t.name IN (new.tag1, new.tag2,...,new.tag25);
END$$
DELIMITER ;
DELIMITER $$
これで、タグ付きの記事を1つのステートメントに挿入できます。
INSERT INTO bh_newarticle (title, body, tag1, tag2, tag3)
VALUES ('$title','$body','$tag1','$tag2','$tag3');
質問に戻る
私は正しいですか?私が尋ねた理由は、人々がタグを配列としてキャッチして比較するのを見たからです。私にとっては非常に遅く、特にUPDATEの場合はパフォーマンスが低下します。
タグは、数が限られている場合にのみ役立ちます。タグの検索に(一意の)インデックスをtag.name
付けると、10.000個のタグがあっても非常に高速になります。これは、完全に一致するものを探しているためです。そして、本当に急いでいる場合は、いつでもタグテーブルをフィールド上にあるmemory
テーブルにすることができます。
ただし、タグ検索の速度の低下について心配する必要はないと思います。 hash index
name
記事ごとにあまり多くのタグを許可しないように注意してください。5は良いスタートのようです。10は多すぎます。
リンク
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.htmlhttp://dev.mysql.com/doc/refman/5.0/en/blackhole-storage-engine.html
_