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