Разработка базы данных для приложений с использованием "хэштегов"

вопрос дизайна базы данных здесь.

Скажем, у нас был webapp или что-то, что использует хэштеги для 20-40 слов. Каков наилучший способ хранения пользовательских хэштегов.

Например, если пользователь ввел. "I like to have #lunch at #sizzler" мы будем хранить предложение как текст, и мы могли бы хранить хэштеги как JSON, список, разделенный запятыми, или какой-либо другой механизм.

Также стоит отметить, что теги должны быть доступны для поиска, например, сколько людей отметили хэш-теги и т.д.

Посоветуйте по этому вопросу было бы здорово, я всегда немного зацикливаюсь, когда речь идет о хранении входных данных переменной размера в mysql. Может быть бесконечное количество хэштегов на заметку, что лучший способ их сохранить?

Ответ 1

Я бы посоветовал использовать типичные отношения "многие-ко-многим" между сообщениями и тегами.

Это означало бы, что вам нужно 3 таблицы.

  • Одна таблица для самих messages (минимальное требование: столбцы ID, UserID и message-content)
  • Одна таблица для tags (минимальное требование здесь: столбцы ID и tag-name)
  • И одна последняя таблица tagMessagesRelations для установления соединений между сообщениями и тегами (через внешние ключи messageID и tagID)

Таким образом, вы не храните тег несколько раз, но только создаете новое отношение к сообщению (если этот тег уже существует в таблице тегов, конечно).

Затем вы можете

  • легко подсчитать количество тегов (SELECT COUNT(*) FROM tags)
  • вы сохраните только один тег, и поиск тегов можно легко проиндексировать
  • или подсчитать, сколько раз для каждого пользователя использовался определенный тег (например:

SELECT COUNT(*) FROM tags INNER JOIN tagMessagesRelations ON tags.ID = tagMessagesRelations.tagID INNER JOIN messages ON tagMessagesRelations.messageID = messages.ID GROUP BY messages.UserID

Ответ 2

Моим новым измененным предложением было бы создать две таблицы: одну для тегов и одну для сообщений.

поместите все использованные теги в таблицу с именем hTags, которая имеет 3 столбца и ID, значение и идентификаторы mID, которые будут содержать все идентификаторы сообщений, содержащие тег, разделенные запятой.

Таким образом, когда тег повторно используется, он не будет помещен в базу данных как дубликат, он просто добавит идентификатор сообщения, в котором используется тег.

Теперь, чтобы выбрать все сообщения, содержащие тег swag, вы могли бы просто сделать

SELECT * FROM hTags WHERE Value = 'swag'

затем используйте результат этого запроса, используйте explode для разделения идентификаторов и используйте цикл for, чтобы выбрать каждое сообщение, которое использовало тег.