Структура базы данных для сохранения результатов поиска

В настоящее время я работаю в социальной сети.

Моему начальнику недавно пришла в голову идея показывать результаты поиска случайным образом вместо обычных результатов (по дате регистрации). Проблема здесь проста и очевидна: если вы переходите с одной страницы на другую, она будет показывать вам разные результаты каждый раз, поскольку список каждый раз рандомизируется.

У меня возникла идея хранить результаты в базе данных + куки примерно так:

  • Файл cookie, содержащий сериализованную версию запроса $ _POST (необходим, если мы хотим выполнить повторную сортировку)
  • Таблица, которая будет служить базой для поиска id => search (id, user_id, creation_date)
  • Таблица, в которой будут храниться результаты и их порядок => search_results (search_id, order, user_id)

Блок-схема будет выглядеть примерно так:

  • После каждого поиска я сохраняю "где" в файле cookie или сеансе.
  • Потом стираю предыдущий поиск в "поисках"
  • Затем я удаляю предыдущие результаты в "search_results"
  • Затем вставляю строку в "поиски" по ключу
  • Затем я вставляю каждую пользовательскую строку в search_results
  • И, наконец, я перенаправляю пользователя на что-то вроде? Search_id = [search_key]

Здесь есть большой недостаток: производительность .... определенно возможно заставить систему ИЛИ выключиться ИЛИ очень медленно.

Есть идеи, что лучше всего это структурировать?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
320
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Что, если вместо случайного упорядочивания вы упорядочите какую-то функцию, в которой порядок известен и повторяем, просто неочевиден? Вы можете засеять такую ​​функцию некоторыми данными из поискового запроса, чтобы было еще менее очевидно, что она повторяется. Таким образом, вы можете пролистывать результаты вперед и назад и всегда получать то, что ожидаете. Музыкальные плееры используют эту функцию для своей функции перемешивания (так что, если вы нажмете назад, вы получите предыдущую песню, а если вы снова нажмете следующую, вы вернетесь с того места, где начали). Я уверен, что вы можете предугадать какую-то функцию для выполнения этого ... Значения идентификатора побитовое исключающее ИЛИ с некоторой константой (из запроса), а затем сортировки по полученному числу может быть достаточно. Я выбрал XOR произвольно, потому что это тривиально простая функция, которая даст вам повторяемые и неочевидные результаты.

Хм, это могло бы помочь. Мне нужно будет проверить, как MySQL отреагирует на это. (Спасибо за отзыв. Я в основном привык к непоточным форумам.

Erick 22.01.2009 00:54

Может быть, хм, но разве оператор xor не говорит только, если это исключающее ИЛИ? Я имею в виду, что, насколько мне известно, здесь нет математических операций.

Приношу свои извинения за путаницу. XOR - это как логический, так и побитовый оператор. Я обновил свой ответ ссылкой на объяснение. Кроме того, в StackOverflow не одобряется публикация ответа в качестве ответа на другой ответ. Вместо этого вам следует обновить вопрос или прокомментировать ответ.

rmeador 22.01.2009 00:43

Извините, я знаю, что это не помогает, но я не понимаю, зачем вашему боссу это нужно?

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

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

Ну, я с Мэттом спрашиваю "Почему?"

Думаю, у rmeador тоже есть хорошее предложение. Вы можете случайным образом отсортировать по другому полю или какому-то алгоритму. Просто из перестановок DESC / ASC в поле последнего обновления или в каком-либо другом поле результата.

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

Мои два цента.

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

Другие вопросы по теме