Позволит ли эта (нормализованная) структура базы данных осуществлять поиск по тегам, как я намереваюсь?

Я пытаюсь настроить нормализованную базу данных 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, учитывая соответствующую настройку.

Ответы на вопрос(6)

Ваш ответ на вопрос