PHP / MYSQL сайт полнотекстового поиска с фильтрами

У меня есть вопрос концептуального программирования / базы данных (PHP / MYSQL) для проекта, над которым я работаю. Просто интересно, может ли кто-нибудь помочь с решением. Я годами ломал голову, пытаясь найти лучший способ решить эту проблему, и я почти уверен, что везде искал ответ на вопрос SO.

Я не могу быть особенно подробным о специфике того, что делает сайт, потому что концепция является собственностью кого-то другого. Но я постараюсь объяснить, что я могу …

У меня есть проект, который будет включать в себя большой объем данных, которые быстро запрашиваются. Мы говорим минимум о 2 миллионах записей … Это само по себе не является серьезной проблемой, но мне нужно запрашивать и взаимодействовать с этими данными.

Возьмем следующий пример рабочего процесса для этого сайта.

1) Пользователь посещает веб-сайт

2) Вход пользователя

3) Пользователь нажимает на ссылку «Случайный» — немного похоже на Google, «Я чувствую себя счастливым»

4) Пользователь случайно отображает элемент из базы данных, который он / она
не видел раньше из 2Mil + Список предметов в БД. Это должно иметь возможность фильтрации по местоположению / типу элемента.

5) Пользователь дает «отзыв» на отображаемый элемент, затем нажимает кнопку «Далее»

6) отображается следующий случайный элемент в таблице, и процесс повторяется

Хранение 2 миллионов записей не проблема. Реальная проблема в том, как мне хранить данные обратной связи, чтобы они не включались в систему Generate Link с этого момента для этого конкретного пользователя.

То есть как бы я сделал это так, чтобы пользователю не пришлось долго ждать между элементами, чтобы запрос завершился. Я понимаю, что можно использовать Splits and Joins, но это все еще не кажется быстрым, когда я попробовал.

Чтобы быть на 100% прозрачным в качестве примера, это самое близкое, что я нашел к решению, прежде чем остановиться.

Скажем, у нас есть пять таблиц:

item_list
- ItemId (int, inc, PK)
- ItemName (varchar)
- ItemCity (int, rel)
- ItemCountry (int, rel)

item_city
- LocationId (int, inc, PK)
- LocationName (varchar)

item_country
- LocationId (int, inc, PK)
- LocationName (varchar)

user_list
- UserId (int, inc, PK)
- UserName (varchar)

user_input
- InputId (int, inc, PK)
- UserId (int, rel)
- ItemId (int, rel)
- ItemFeedback (text)

Когда пользователь дает отзыв об элементе в item_list, в таблицу user_input добавляется запись с соответствующими UserId и ItemId.
Затем я мог бы сделать выбор на item_list, где ItemId не в таблице user_input против их UserId.
Это кажется мне плохим путем. Если у вас есть 2 миллиона элементов, это 1 пользователь с 2 миллионами записей в таблице user_input, если он завершит каждый элемент … Однако я ожидаю, что по крайней мере 50 пользователей, что равно 100 миллионам записей, если каждый пользователь даст отзыв о каждом элементе. То же самое касается списка значений, разделенных запятыми.

Я просто не знаю, как этого добиться без значительных замедлений или задержек, как только вы получите 1000+ отзывов от пользователя.

Я действительно надеюсь, что это имеет смысл, дайте мне знать, если у вас есть какие-либо вопросы, и я сделаю все возможное, чтобы ответить на них.

Спасибо
-Dave

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …