Я разработал сайт, который использует теги (ключевые слова) для классификации фотографий. Прямо сейчас в моей базе данных MySQL есть таблица со следующей структурой:
image_id (int)
tag (varchar(32))
Каждый раз, когда кто-то маркирует изображение (если тег является действительным и имеет достаточно голосов), оно добавляется в базу данных. Я думаю, что это не оптимальный способ сделать что-то, так как теперь, когда у меня есть более 5000 изображений с тегами, таблица тегов содержит более 40000 записей. Я боюсь, что это начнет влиять на производительность (если это еще не влияет на нее).
Я думал, что другая структура думает, что было бы быстрее выбрать теги, связанные с конкретным изображением, но тогда это выглядит ужасно, когда я хотите получить все теги или, например, самый популярный:
image_id (int)
tags (text) //comma delimited list of tags for the image
Есть ли правильный способ сделать это или оба способа более или менее одинаковы? Мысли?
Вы можете создать таблицу тегов
, которая просто теги id
и
с уникальным ограничением для тега
, а затем таблица photo_tags
, имеющая tag_id
и ] photo_id
. Вставляйте тег в таблицу tags
, только если он еще не существует.
Тогда вы будете запрашивать сравнение текста pk вместо varchar при выполнении таких запросов, как количество фотографий, помеченных определенным тегом.
Используйте таблицу "многие ко многим" для связи записи TAG
с записью IMAGE
:
DROP TABLE IF EXISTS `example`.`image`;
CREATE TABLE `example`.`image` (
`image_id` int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (`image_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `example`.`tag`;
CREATE TABLE `example`.`tag` (
`tag_id` int(10) unsigned NOT NULL auto_increment,
`description` varchar(45) NOT NULL default '',
PRIMARY KEY (`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `example`.`image_tag_map`;
CREATE TABLE `example`.`image_tag_map` (
`image_id` int(10) unsigned NOT NULL default '0',
`tag_id` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`image_id`,`tag_id`),
KEY `tag_fk` (`tag_id`),
CONSTRAINT `image_fk` FOREIGN KEY (`image_id`) REFERENCES `image` (`image_id`),
CONSTRAINT `tag_fk` FOREIGN KEY (`tag_id`) REFERENCES `tag` (`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;