lamer350
@lamer350
กำลังสูงสุด

Поможете сформировать правильно структуру БД?

Не могу придумать как минимизировать количество записей в БД (utf-8).
Математика следующая:
имеется 1 млн страниц на сайте (id - 10 знаков)
имеется 1 млн пользоватлей на сайте (зарегестрованных)
Каждому пользователю выводим РАНДОМНО страницу, больше он ее не должен увидеть. Если я правильно посчитал, что приближаясь к миллиону просмотренных страниц - сохраняя только id, получится набор данных примерно 200кб на каждого пользователя.
При выводе новой страницы для пользователя нужно проверить смотрел он ее или нет, тоисть подгружается массив данных в 200кб... при нагрузке 30к пользователей на сайте: требуется 6 гиг RAM только на обработку этих запросов...
Как можно изменить логику структуры БД?
Была идея разбивать на таблицы где id 0-50тис, 50-100, 100-150 и тд, таким образом при генерации числа проверяли в каком диапазоне лежит число и обращались нужную таблицу для проверки смотрел ли пользователь страницу с таким id, таким образом масив бы был уже не 200кб, а максимум 10...
А вторая идея - выгружать данные в кеш пользователя при первой генерации, и работать уже с кешем. Хранить все только в кеш нельзя, так как регистрация для того и создана - чтоб можно было заходить с разных устройств.
Но возможно я изобретаю велосипед и все это придумано уже давно. Поделитесь опытом, ссылками и советами. спасибо.
  • Вопрос задан
  • 2218 просмотров
Пригласить эксперта
Ответы на вопрос 1
Не понимаю, должен признаться... Пусть есть таблицы User и Page, сохраняем для каждого пользователя список страниц, которые он уже видел. Сделаем таблицу View с колонками:

  • user - id пользователя,
  • page - id страницы,
  • time - время просмотра.


Чтобы просмотреть миллион страниц из расчёта секунда на страницу пользователю потребуется 1000000/3600 = 277.77 часов = 11.5 суток непрерывного просмотра = 34.7 суток просмотра из расчёта 8 часов в день, 7 дней в неделю. Не видел случаев, когда такое нужно, ну да ладно; вам виднее. Ну и пусть в этой таблице будут миллионы записей, и что? Вы можете использовать partitioning, - MySQL его поддерживает.

Что касается выборки очередной страницы для просмотра: зачем вам загружать это всё в память? Это делается средствами SQL (если выборка страницы действительно случайна).

И потом, вам действительно надо случайную выборку или можно показывать страницы просто по порядку? Без понимания предметной области это не понятно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы