Давайте представим, что у меня есть видео, и каждое видео может иметь несколько тегов (максимум 10 тегов на видео).
Я спланировал свою схему SQL, и она выглядит так:
videos
: id
, title
, path
,
tag_rels
: id
, tag_id
, item_id
(это будет указывать на videos
. id
),
tags
: id
, tag
;
Хорошо, мне кажется, хорошо.
Тогда я написал SELECT
, который должен получить видео плюс теги для него.
SELECT `videos`.`id`, `videos`.`title`, `videos`.`path`, `tags`.`tag`
FROM `videos`
JOIN `tag_rels`
ON `tag_rels`.`item_id` = `videos`.`id`
JOIN `tags`
ON `tags`.`id` = `tag_rels`.`tag_id`
Это не проверено или около того, потому что все на уровне ума.
И огромная проблема - это запрос INSERT
(запросы, я думаю).
Насколько я понимаю:
- Запрос № 1: вставить видео в
videos
. Это вернет первичный ключ (videos
. id
), верно?
- Запрос # 2: выберите тег # 1 из базы данных и получите его первичный ключ,
- Запрос № 3: если такой записи нет (на основе имени тега (
tags
. tag
), выполните запрос вставки и вставьте его. Цель - получить первичный ключ этого тега,
- Запрос # 4: вставить запись в
tag_rels
с видео pk и тегами pk ;
Итак, это один запрос на видео как есть, плюс 2 или 3 запроса для каждого тега .
Это означает, что если видео содержит 10 тегов и (в худшем случае) любой из этих тегов не сохраняется в базе данных, это будет стоить мне 1 + 10 * 3 ... em .... 31 запрос?!
Должен быть лучший способ! Большое спасибо!
P.S. Я не хочу повторяющихся записей в базе данных, и я хотел бы иметь столбец от used_in
до tags
с количеством видео, которые используют тег. В будущем ...