Да, то, что вы делаете, это лучший способ сделать это. Вы создали отношение n к m, поскольку сообщение может иметь несколько тегов, и один и тот же тег может находиться в нескольких сообщениях. Вы не хотите хранить имя тега для каждого сообщения, поэтому сохраняете идентификатор.
Но вы должны -НЕТ- иметь эту избыточность хранения несколько раз одного и того же tag_id
для одного и того же пользователя. Это сильно ударит по вашему серверу, если у пользователей будет несколько тегов, и вам придется выполнить SELECT count(...)
для каждого из этих тегов. Вы понимаете, о чем я здесь говорю? Потому что прямо сейчас, как узнать, сколько раз пользователь A имеет тег B? Вы должны сделать SELECT count(*) FROM user_post_tag INNER JOIN tags ON (...) WHERE user_id=A and tag_id=B
.
Я предлагаю разделить user_post_tag
на две таблицы:
user_tags
, чтобы подсчитать, сколько раз у пользователя есть этот тег, первичный ключ будет user_id
и tag_id
, и у вас будет поле count
, которое вы будете просто обновлять с помощью count=count+1
каждый раз этот пользователь создает новое сообщение с тегом. Таким образом, вы можете просто сделать SELECT tag_text, count FROM user_tags INNER JOIN tags ON (...) WHERE user_id=A
, чтобы выбрать все теги (с количеством использованных раз) данного пользователя. Вы используете полностью проиндексированный запрос. Вы не просите MySQL пройтись по таблице, найти кучу строк и сосчитать их, вы говорите MySQL, перейдите эту строку в эту таблицу и в другую таблицу, присоединитесь к ним и быстро передайте мне. !
post_tags
, для хранения тегов, содержащихся в определенном сообщении, первичным ключом будет post_id
и tag_id
, дополнительные поля не требуются.
Полагаю, что tag_text должен
быть уникальный? Если эффективно, что я бегу
функция каждый раз, когда я отправляю новую
опубликовать, чтобы пройти через таблицу тегов
проверить, если тег уже существует, и если
да, верните его tag_id, чтобы я мог
вставьте его в таблицу user_post_tag.
Да, он должен быть уникальным. Лучше проверить, существует ли тег, прежде чем вставлять и вставлять, если он не существует, чем иметь избыточность и выполнять SELECT ... count (*), чтобы узнать, сколько раз тег использовался. Создание постов будет намного реже, чем выбор постов, поэтому, если вам нужно выбирать между интенсивным запросом при вставке и выделением, обязательно выберите вставку.
Кстати, если вы хотите подсчитать, сколько постов имеют один и тот же тег, как при переполнении стека, вам понадобится еще одна таблица с первичным ключом tag_id, а затем, как на user_tags
вы увеличиваете поле count
каждый раз, когда сообщение получает определенный тег.