Лучший способ создать систему хэштегов - PullRequest
8 голосов
/ 14 февраля 2012

Это, возможно, проблема в том, что я потерял больше времени, чтобы подумать, как поступить правильно, думая наилучшим образом оптимизированным способом.

У меня есть таблица «Содержание», и мне нужно добавить опцию для привязки нескольких «хэштегов», «тегов» или «ключевых слов» к содержимому, например, содержимое типа «жареный картофель с кетчупом» имеет « клавиши ":" картофельные "," кетчуп "и" жареные ".

И когда я выполняю поиск по слову, например, «картофель», мне нужно показать содержимое, содержащее в нем теги этого слова.

Вопрос в том, какая структура лучше всего подходит для этого, учитывая скорость результатов, потому что таблица содержимого - это MyISAM, насчитывающая более 30 миллионов строк.

Я думаю, что в этом:

Создайте еще 2 таблицы: "contents_hashtags" (id(INT11), content_id(INT11), hashtag_id(INT11)) и "hashtags" (id(INT11), hashtag(VARCHAR(40))) 2 таблицы в InnoDB

Когда пользователь создает / изменяет содержимое таблицы, я выполняю поиск в таблице хэштегов и получаю идентификаторы, если хештег не существует, создаю его в хэштеге таблицы, если существует, получаю идентификатор, используя эти идентификаторы создайте вставки в таблице contents_hashtas asociating content <-contents_hashtas-> hashtahs

В поиске сделайте СОЕДИНЕНИЯ (ЧЕЛОВЕК ВПРАВО / ВПРАВО / ВНУТРЕННИЙ ..) и сделайте поиск по LIKE ?? точным (hashtag = "XXX") или ПОЛНЫМ ПОИСКОМ ТЕКСТА?

Является ли этот метод правильным / быстрым? Я не знаю, как запустить это с большим количеством строк и большим трафиком ..

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

Три таблицы сделают свое дело:

Содержимое, хэштеги и ConTag. ConTags будет соединительной таблицей, содержащей content.id и hashtags.id. Таким образом, вы можете приписать несколько хэштегов к каждому элементу в содержании.

SELECT * FROM Contents c, Hashtags h LEFT JOIN ConTags t ON c.Id = t.ConId AND h.Id = t.HashId

В качестве альтернативы, установите Hashtags Name и ContentId в качестве уникального ключа, и таблица соединений больше не нужна

2 голосов
/ 14 февраля 2012

На самом деле достаточно одной дополнительной таблицы

"хэштеги" (id (INT11), хэштег (VARCHAR (40))), content_id (int11))

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

SELECT hashtag FROM hashtable WHERE content_id=$content_id

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

SELECT ct.* from hashtable ht, contenttable ct WHERE ht.hashtag=$hastag and ct.id=ht.content_id

и так далее

...