Насколько эффективным может быть это решение для тегов?

Я работаю над сайтом обмена изображениями и хочу реализовать теги для изображений.

Я прочитал вопросы #20856 и #2504150

У меня мало проблем с подходом к приведенным выше вопросам. Во-первых, кажется, что связать изображение с тегом несложно. Однако получить изображения по соотношению тегов не так просто. Нелегко, потому что вам нужно будет получить отношение изображения к тегу из одной таблицы, а затем сделать большой запрос с кучей операторов ИЛИ (по одному ИЛИ для каждого изображения).

Еще до того, как я начал исследовать тему тегов, я начал тестировать следующий метод:

Эти таблицы в качестве примера:

Table: Image
Columns: ItemID, Title, Tags

Table: Tag
Columns: TagID, Name

Столбец Теги в таблице Изображение берет строку с несколькими идентификаторами тегов из таблицы Теги, заключенную в дефисы (- ).

Например:

-65-25-105- 

Связывает изображение с TagID 65, 25 и 105.

С помощью этого метода мне проще получать изображения по тегу, так как я могу получить TagID с помощью одного запроса и получить все изображения с помощью другого простого запроса, например:

SELECT * FROM Image WHERE Tags LIKE %-65-%

Итак, если я использую этот метод для тегов,

Насколько это эффективно?

Является ли запрос LIKE %-65-% медленным процессом?

С какими проблемами я могу столкнуться в будущем?


person Pablo    schedule 15.05.2010    source источник


Ответы (1)


Для этого вам понадобится 3 стола.

Table: Image
Columns: ImageId, ItemID, Title

Table: Image_Tag
Columns: ImageId, TagId

Table: Tag
Columns: TagID, Name

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

SELECT ImageId, Title 
FROM Image_Tag LEFT JOIN Image USING (ImageId)
WHERE TagId = $TagId

Это типичный способ обработки отношений «многие ко многим» в реляционной базе данных. Возможно, вам было бы полезно прочитать об http://en.wikipedia.org/wiki/Database_normalization.

Изменить: я вижу, что это уже было адресовано в других вопросах, на которые вы ссылались, поэтому я объясню дальше. Самая большая проблема, которую я вижу в том, что вы делаете это по-своему, заключается в том, что вы не можете воспользоваться преимуществами индексации столбцов идентификаторов, что делает ваши запросы менее эффективными. Также похоже, что было бы неуклюже обновлять. Я настоятельно рекомендую не пытаться сделать это таким образом, по крайней мере, попробуйте использовать решение с тремя таблицами. Как только это «щелкнет» для вас, вы поблагодарите меня.

person Syntax Error    schedule 15.05.2010
comment
Спасибо за ваш вклад, просто я читал много историй о том, что LEFT JOIN работает медленно. Я выберу три стола, кажется, людям это действительно нравится. - person Pablo; 15.05.2010