Это звучит как упражнение в денормализации. Все, что действительно необходимо, это таблица, которая может естественным образом поддерживать любой запрос, который у вас есть, путем повторения любой информации, которую вам в противном случае пришлось бы присоединиться к другой таблице, чтобы ее удовлетворить. Нормализованная база данных что-то вроде того, что у вас может выглядеть следующим образом:
Posts:
PostID | PostTitle | PostBody | PostAuthor
--------+--------------+-------------------+-------------
1146044 | Join-Free... | I'm working on... | Michael Stum
Tags:
TagID | TagName
------+-------------
1 | Archetecture
PostTags:
PostID | TagID
--------+------
1146044 | 1
Тогда Вы можете добавить столбцы для оптимизации запросов. Если бы это был я, я бы просто оставил только таблицы и Tags
и добавил дополнительную информацию в таблицу соединений PostTags
. Конечно, то, что я добавляю может зависеть немного о запросах я намерен работать, но, вероятно, я бы по крайней мере, добавить Posts.PostTitle
, Posts.PostAuthor
и Tags.TagName
, так что мне нужно работать только два запроса для показа сообщения в блоге,
SELECT * FROM `Posts` WHERE `Posts`.`PostID` = $1
SELECT * FROM `PostTags` WHERE `PostTags`.`PostID` = $1
И суммируя все сообщения для данного тега требуется даже меньше,
SELECT * FROM `PostTags` WHERE `PostTags`.`TagName` = $1
Очевидно, что недостаток денормализацию является то, что это означает, что вы должны сделать немного больше работы, чтобы сохранить денормализованные таблицы до настоящего времени. Типичный способ борьбы с этим состоит в том, чтобы поместить некоторые проверки здравомыслия в ваш код, который обнаруживает, что денормализованный запрос не синхронизирован, сравнивая его с другой информацией, доступной ему. Такая проверка может пойти в приведенном выше примере, сравнив заголовки сообщений в результирующем наборе PostTags
против заголовка в результате результата Posts
. Это не вызывает дополнительный запрос. Если есть несоответствие, программа может уведомить администратора, то есть путем регистрации несогласованности или отправки электронной почты.
Крепление легко (но дорогостоящим с точки зрения нагрузки на сервер), выкидывать дополнительные столбцы и восстанавливать их из нормализованных таблиц. Очевидно, вы не должны этого делать, пока не найдете причину синхронизации базы данных.
В конце концов, Нико прав. Мне понравилась идея Full-Text индексации Дэвида (+1 к этому), но в конце концов это не очень практично. –