Организация базы данных предложений и ключевых слов
Нужно организовать реляционную базу данных для хранения и поиска в ней следующего.
Есть придложения с ключевыми словами:
Предложение1(ключевое слово1, кс2, кс3)
Предложение2(кс2, кс3, кс4)
…
Далее нужно по набору ключевых слов выбрать те предложения, где больше всего найдено совпадений.
Например по запросу: кс2, кс4:
Предложение2, совпадений: 2
Предложение1, совпадений 1
Как вы считаете лучше организовать такую структуру? Как лучше и быстрее всего искать?
SELECT
offer_name,
matching_count
FROM
(
SELECT
offer_id,
offer_name,
COUNT(*) AS matching_count
FROM
words
JOIN matching USING(word_id)
JOIN offers USING(offer_id)
WHERE
word_name = 'KC1'
OR word_name = 'KC2'
GROUP BY
offer_id,offer_name
) AS mt
ORDER BY
matching_count DESC
Если хочется очень быстро — можно сфинксом попробовать
Вы предлагаете связь многие ко многим, один ко многим не будет ли тут быстрее?
Сфинкс тут нельзя использовать, задача именно на реляционные базы данных.
Elfet можно конечно использовать один ко многим, но тогда поиск по тегам нужно будет вести по текстовому полю, что скажется на производительности при большом количестве данных. Поэтому предложенный выше вариант наиболее оптимален.
У вас есть предложение, каждое предложение — это одна запись в таблице offers
набор минимальных полей
offer_id — идентификатор
offer_name — имя
Далее вы можете добавить одно поле words и перечислить из через разделитель. Но в этом случае прийдется искать предложения, учитывая разделители по текстовому полю words. Это уже заведомо не правильно. Следовательно лучше всего сделать еще одну таблицу, в которой слова связаны с предложением words
word_id
offer_id
word_name
Уже лучше и так довольно просто посчитать количество, выборка будет быстрее. Но поле word_name у нас избыточное. То есть мы будем хранить лишнюю информацию (одинаковые слова) Поэтому лучше всего создать две таблицы — список слов (теги) и соответствие предложений и тегов.
words
word_id
word_name
matching
matching_id
offer_id
word_id
Тем самым мы пришли к самому первому варианту. Так понятней почему именно так посоветовали?)