Вы можете вставлять только одну таблицу за раз.
Одним из решений является использование триггеров, а другим - использование транзакции.
Первый может использоваться с любым движком, последний требует 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 $$
Теперь вы можете просто вставить статью с тегами в одном выражении:
INSERT INTO bh_newarticle (title, body, tag1, tag2, tag3)
VALUES ('$title','$body','$tag1','$tag2','$tag3');
Вернуться к вашему вопросу
Я прав? Причина, по которой я спросил, состоит в том, что я видел, как люди ловили теги как массив и сравнивали. Для меня это очень медленно, и убивает производительность, особенно для ОБНОВЛЕНИЯ.
Теги полезны только в том случае, если их количество ограничено. Если вы добавите (уникальный) индекс в tag.name
, поиск тега будет очень быстрым, даже с 10.000 тегами. Это потому, что вы ищете точное совпадение. И если вы действительно торопитесь, вы всегда можете сделать таблицу тегов memory
таблицей с hash index
в поле name
.
Я сомневаюсь, что вам нужно беспокоиться о медлительности поиска тегов.
Просто убедитесь, что вы не допускаете слишком много тегов на статью. 5 кажется хорошим началом. 10 будет слишком много.
Ссылки
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
http://dev.mysql.com/doc/refman/5.0/en/blackhole-storage-engine.html