Разработка базы данных для приложений с использованием "хэштегов"
вопрос дизайна базы данных здесь.
Скажем, у нас был 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, чтобы выбрать каждое сообщение, которое использовало тег.