Лучшая практика для хранения тегов в базе данных?

Я разработал сайт, который использует теги (ключевые слова) для классификации фотографий. Прямо сейчас в моей базе данных MySQL есть таблица со следующей структурой:

image_id (int)
tag      (varchar(32))

Каждый раз, когда кто-то маркирует изображение (если тег является действительным и имеет достаточно голосов), оно добавляется в базу данных. Я думаю, что это не оптимальный способ сделать что-то, так как теперь, когда у меня есть более 5000 изображений с тегами, таблица тегов содержит более 40000 записей. Я боюсь, что это начнет влиять на производительность (если это еще не влияет на нее).

Я думал, что другая структура думает, что было бы быстрее выбрать теги, связанные с конкретным изображением, но тогда это выглядит ужасно, когда я хотите получить все теги или, например, самый популярный:

image_id (int)
tags     (text) //comma delimited list of tags for the image

Есть ли правильный способ сделать это или оба способа более или менее одинаковы? Мысли?

23
задан ROMANIA_engineer 1 December 2017 в 09:21
поделиться

2 ответа

Вы можете создать таблицу тегов , которая просто теги id и с уникальным ограничением для тега , а затем таблица photo_tags , имеющая tag_id и ] photo_id . Вставляйте тег в таблицу tags , только если он еще не существует.

Тогда вы будете запрашивать сравнение текста pk вместо varchar при выполнении таких запросов, как количество фотографий, помеченных определенным тегом.

2
ответ дан 29 November 2019 в 03:06
поделиться

Используйте таблицу "многие ко многим" для связи записи TAG с записью IMAGE:

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;

TAG

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;

IMAGE_TAG_MAP

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;
11
ответ дан 29 November 2019 в 03:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: