2013-11-19 3 views
1

Я работаю над веб-приложением в Python (Flask), которое по сути показывает пользовательскую информацию из базы данных PostgreSQL (через Flask-SQLAlchemy) в случайном порядке, причем каждый набор информации отображается на одной странице. Нажатие кнопки «Далее» направит пользователя к следующему набору данных, заменив все данные на странице новыми данными и т. Д.Лучший способ показать случайные данные пользователя из базы данных SQL?

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

Сайт не имеет пользовательской системы, и «уже увиденные» наборы данных следует забыть, когда они закрывают вкладку/окно или перемещаются.

Я также должен добавить, что я новичок в SQL в целом.

Каков наилучший способ для этого?

+0

@MarkRichman - Я не думаю, что это дубликат, так как я ищу случайную строку, которую пользователь еще не видел, а не только любую случайную строку. Я также использую SQLAlchemy, в отличие от реального SQL, для выполнения запросов –

+1

_My conundrum поставляется с созданием презентации по-настоящему случайным - не отображая пользователю одну и ту же информацию дважды, помня, что они видели, и не показывает им уже увиденные наборы данных снова. _ Просто nitpick: по определению вы делаете свои данные МЕНЬШЕ случайными, делая это.Возможно, это то, что вам нужно для вашего приложения, но вы бросаете людей, когда говорите, что пытаетесь сделать вещи _truly_ случайными, а затем описывайте что-то, что является _less_ случайным, чем просто выбор любого элемента. –

+0

Как сказал @MarkHildreth, то, что вы ищете, на самом деле не случайное. Тогда я бы спросил, нужно ли вам в качестве сложного решения для вашего варианта использования. Во-первых, как вы индексируете данные? Если это обычный автоматический индекс, начинающийся с 1, вы можете просто сохранить свой последний (также самый высокий индекс) и сделать случайное число в этом диапазоне. Пример: 'random_id = str (random.randint (1, latest_id))' then' SELECT * FROM data WHERE id = random_id'. Это будет немного быстрее, чем «заказ от RAND». Я считаю, что вы можете запросить последний идентификатор, когда началась фляга, и сохраните ее в памяти, а затем обновите ее, когда это необходимо. – Seberius

ответ

0

Вы можете вставлять данные «уже видели» в файл cookie сеанса. Выбор случайных данных SQL объясняется here

+1

Это не удастся для больших наборов данных и/или пользователей, просматривающих множество страниц. Прежде всего, решения «order by RAND()« очень медленные, потому что они требуют полного сканирования таблицы; и, кроме того, файлы cookie ограничены размером 4K, поэтому в зависимости от размера ключей, которые вы храните, вы, вероятно, можете хранить только около 1000 «уже увиденных» ключей. – publysher

+0

С учетом того, что приложение ожидает масштабирования, обязательно найдутся ситуации, когда мне нужно держать более 1000 ключей. –

+1

Лучший способ сделать это, на мой взгляд, - это следовать совету @ Mark, но с таблицей базы данных, в которой будут храниться сеансы и посещенные элементы. Никакой другой способ не будет хорош в долгосрочной перспективе –

1

Самый простой способ это сделать генерацию случайных чисел в JavaScript на стороне клиента ...

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

Таким образом, вы (на сервере) только должны иметь 2 базы данных доступа просмотров:

  1. главную страницу (которая дает JS, и самый высокий действующий идентификатор строки)
  2. отображения пункта (по id)

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

По соображениям производительности вы можете даже предварительно выбрать следующий элемент, как только текущий элемент загрузится, чтобы он мгновенно отображался, и загружает следующий в фоновом режиме, пока он смотрит на него. (jQuery .load() является вашим другом :-))

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

Надеюсь, это поможет! :-)

Смежные вопросы