2009-07-11 3 views
1

Я ищу помощь по схеме базы данных, а не фактическое «облако».PHP Tag Cloud

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

Я думал

ID - int(11), unique, auto_incremenet 
tag - varchar(20) 
imageID - int(11) 

так полагаю, я загрузить изображение, и пометить его «ТОРОНТО, суши, лето».

запрос будет:

INSERT INTO tags (tag, imageID) VALUES ('$tag[0]', $imageID); 
INSERT INTO tags (tag, imageID) VALUES ('$tag[1]', $imageID); 
INSERT INTO tags (tag, imageID) VALUES ('$tag[2]', $imageID); 

Затем, чтобы получить, я бы выбрать * из тегов, где ImageID = $ imagID.

Есть ли недостаток в этом?

ответ

3

У вас должно быть отношение HABTM (имеет и принадлежит многим) между двумя таблицами для изображений, одно для тегов и третья таблица с комбинациями идентификаторов изображений и идентификаторов тегов. Таким образом, вы не ограничиваете количество тегов, которые могут иметь изображение, или количество изображений, к которым может принадлежать тег, и у вас нет дублирования.

+0

Я закончил это. В основном потому, что я чувствую, что это так, как делает SoF, что позволило мне добавить дополнительные столбцы в эту таблицу, например, какой пользователь создал этот тег первым и т. Д. – sqram

3

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

Одна крошечная оптимизация, которую я бы рассмотрел, это порядок ваших столбцов. Группируйте 'int вместе, так как они имеют фиксированную ширину для MySQL, что означает, что они могут быть найдены более медленно в этом порядке, чем int varchar int.

1

Я хотел бы использовать отдельный тег таблицы: Таблица теги: tag_id- INT (11), уникальный, auto_incremenet тег - VARCHAR (20)

TABLE image tags: 
ID - int(11), unique, auto_incremenet 
tag - varchar(20) 
imageID - int(11) 

Тогда я хотел бы посмотреть, если тег уже там и будут вставлять только идентификаторы

INSERT INTO теги (tag, imageID) VALUES ('$ tag_id [0]', $ imageID); INSERT INTO теги (tag, imageID) VALUES ('$ tag_id [1]', $ imageID); INSERT INTO теги (tag, imageID) VALUES ('$ tag_id [2]', $ imageID);

Таким образом, изображения с одинаковыми тегами будут легче найти, поскольку они делят один тег tag_id, а не только один и тот же файл varchar. Конечно, вы должны перенести теги в нижний регистр и заменить специальные символы и т. Д.

2

Изменилось ли поле тега на символ (20) также повысить производительность? Вся таблица стала фиксированной, а запросы, выполняемые на таблицах с фиксированной шириной, обычно бывают более быстрыми, поэтому я убежден в своем недавнем исследовании дизайна БД.

Исправлено до 20 символов, что приведет к небольшим накладным расходам с точки зрения объема пространства, которое занимает таблица, но это такая маленькая таблица. В любом случае, я не вижу большого размера файла, являющегося огромной проблемой.

Сказав это, поскольку сам факт крошечный стол, я думаю, вам понадобится много строк данных, прежде чем вы увидите разницу между varchar (20) и char (20).

Просто мысль. :)

 Смежные вопросы

  • Нет связанных вопросов^_^