Я нахожусь на ранних стадиях разработки своей базы данных, поэтому пока ничего не является окончательным, и я использую дизайн с тремя таблицами "TOXI" для моих потоков, которые имеют дополнительные теги, но я не могу не чувствовать, что объединение не является действительно необходимым, и, возможно, мне нужно просто положиться на простой столбец тегов в моей таблице posts
, где я могу просто хранить varchar чего-то вроде <tag>, <secondTag>
.
Итак, резюмируем:
- стоит ли тратить лишние левые объединения на 2 таблицы тегов вместо того, чтобы просто иметь столбец тегов в моей таблице
posts
.
- Есть ли способ оптимизировать мой запрос?
Схема
CREATE TABLE `posts` (
`post_id` INT UNSIGNED PRIMARY AUTO_INCREMENT,
`post_name` VARCHAR(255)
) Engine=InnoDB;
CREATE TABLE `post_tags` (
`tag_id` INT UNSIGNED PRIMARY AUTO_INCREMENT,
`tag_name` VARCHAR(255)
) Engine=InnoDB;
CREATE TABLE `post_tags_map` (
`map_id` INT PRIMARY AUTO_INCREMENT,
`post_id` INT NOT NULL,
`tags_id` INT NOT NULL,
FOREIGN KEY `post_id` REFERENCES `posts` (`post_id`),
FOREIGN KEY `post_id` REFERENCES `post_tags` (`tag_id`)
) Engine=InnoDB;
Пример данных
INSERT INTO `posts` (`post_id`, `post_name`)
VALUES
(1, 'test');
INSERT INTO `post_tags` (`tag_id`, `tag_name`)
VALUES
(1, 'mma'),
(2, 'ufc');
INSERT INTO `posts_tags_map` (`map_id`, `post_id`, `tags_id`)
VALUES
(1, 1, 1),
(2, 1, 2);
Текущий запрос
SELECT
posts.*,
GROUP_CONCAT( post_tags.tag_name order by post_tags.tag_name ) AS tags
FROM posts
LEFT JOIN posts_tags_map
ON posts_tags_map.post_id = posts.post_id
LEFT JOIN post_tags
ON posts_tags_map.tags_id = posts_tags.tag_id
WHERE posts.post_id = 1
GROUP BY post_id
Результат
IF есть теги:
post_id post_name tags
1 test mma, ufc