Позволит ли эта (нормализованная) структура базы данных осуществлять поиск по тегам, как я намереваюсь?
Я пытаюсь настроить нормализованную базу данных MySQL, содержащую три следующие таблицы. Первая таблица содержит список элементов, которые могут быть описаны различными тегами. Третья таблица содержит различные теги, используемые для описания элементов в первой таблице. Средняя таблица связывает две другие таблицы друг с другом. В случае каждой таблицы идентификатор представляет собой первичный ключ с автоинкрементом (и каждый из них используется в качестве внешнего ключа в средней таблице).
+---------------+---------------------+---------------+
| Table 1 | Table 2 | Table 3 |
+---------------+---------------------+---------------+
|id item |id item_id tag_id|id tag|
+---------------+---------------------+---------------+
| 1 spaniel| 1 1 4| 1 bird|
| 2 tabby| 2 1 23| 4 pet|
| 3 chicken| 3 1 41|23 dog|
| 4 goldfish| 4 2 4|24 cat|
| | 5 2 24|25 reptile|
| | 6 3 1|38 fish|
| | 7 3 40|40 delicious|
| | 8 4 4|41 cheap|
| | 9 4 38|42 expensive|
| |10 4 41| |
| | | |
+---------------+---------------------+---------------+
Я хочу выполнить запрос от одного или нескольких тегов к трем таблицам, чтобы получить элементы, соответствующие ВСЕМ тегам.
Так, например, запрос «pet» вернул бы items (1) spaniel, (2) tabby и (4) goldfish, потому что все они помечены как «pet». Запрос о «дешевом» и «домашнем животном» вместе вернул бы (1) спаниеля и (4) золотую рыбку, потому что они оба помечены как «дешевый» и «домашнее животное». Табби не будет возвращен, так как он помечен только «домашнее животное», но не «дешево» (в моем мире кошки табби стоят дорого: P)
Запросы на "cheap", "pet" и "dog" вернут только (1) Spaniel, поскольку он единственный, соответствующий всем тэгам.
Во всяком случае, это желаемое поведение. У меня два вопроса.
Это лучший способ настроить мои таблицы для моих целей? Я все еще новичок в идеях нормализации баз данных, и я продолжаю это понимать - любой вклад в эффективность или даже если это подходящий макет для моей базы данных, был бы очень признателен.
При условии, что описанная выше настройка работоспособна, как я мог бы структурировать один запрос MySQL для достижения моей цели? * (То есть для серии тегов, возвращающих ТОЛЬКО элементы, которые соответствуют ВСЕМ указанным тегам). Я пробовал делать различные соединения / союзы, но ни один из них не дает мне желаемого эффекта (обычно возвращают ВСЕ элементы, которые соответствуют ЛЮБОМУ из тегов). Я потратил некоторое время, просматривая руководство по MySQL, но чувствую, что концептуально что-то упустил.
* Я говорю один запрос, так как, конечно, я мог бы просто выполнить серию простых запросов WHERE / JOIN, по одному для каждого тега, а затем объединить / отсортировать возвращаемые элементы в PHP или что-то по факту, но это кажется глупым и неэффективным способом сделать Это. Я чувствую, что есть способ, которым я должен быть в состоянии сделать это с одним запросом MySQL, учитывая соответствующую настройку.