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