У меня есть вопрос концептуального программирования / базы данных (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
Задача ещё не решена.
Других решений пока нет …