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

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

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

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

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

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

2 ответов


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

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

  • один стол для messages себя (минимальное требование: столбцы ID, UserID и message-content)
  • один стол для tags (минимальное требование здесь: столбцы ID и tag-name)
  • и последний стол tagMessagesRelations чтобы сделать соединения между сообщениями и тегами (через иностранные ключи!--8--> и 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


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

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

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

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

SELECT * FROM hTags WHERE Value = 'swag'

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