Ответ 1
Посмотрите на эти вопросы/сообщения
Я разработал сайт, который использует теги (ключевые слова), чтобы классифицировать фотографии. Сейчас у меня в моей базе данных MySQL есть таблица со следующей структурой:
image_id (int)
tag (varchar(32))
Каждый раз, когда кто-то теряет изображение (если тег действителен и имеет достаточно голосов), он добавляется в базу данных. Я думаю, что это не оптимальный способ делать то, что теперь, когда у меня есть более 5000 изображений с тегами, таблица тегов содержит более 40000 записей. Я боюсь, что это начнет влиять на производительность (если это уже не влияет на нее).
Я подумал, что эта другая структура думает, что быстрее будет получать теги, связанные с определенным изображением, но тогда это выглядит ужасно, когда я хочу получить все теги или наиболее популярные, например:
image_id (int)
tags (text) //comma delimited list of tags for the image
Есть ли правильный способ сделать это или оба способа более или менее одинаковы? Мысли?
Посмотрите на эти вопросы/сообщения
Используйте таблицу "многие-ко-многим", чтобы связать запись 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;
Вы можете создать таблицу tags
, которая представляет собой только id
и tag
с уникальным ограничением на tag
, а затем photo_tags
таблицу с tag_id
и photo_id
. Вставьте тег в таблицу tags
только в том случае, если он еще не существует.
Затем вы будете запрашивать pk вместо сравнения текста varchar при выполнении запросов, например, сколько фотографий помечено определенным тегом.