Какова наилучшая практика хранения "сохраненного поиска" в базе данных

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

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

Я мог бы:

1) Сериализуйте объект "SavedSearch" в строку и сохраните его в базе данных, затем десериализуйте по мере необходимости.

2) Введите список столбцов в tblSavedSearch, соответствующий критериям поиска - price/zip/# bedrooms/etc.

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

Как другие решили эту проблему?

Ответ 1

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

Итак, если у вас есть поисковая программа под названием search.action, вы запросите поиск следующим образом:

search.action?price=20000&rooms=3

Вы можете сохранить часть price = 20000 & rooms = 3 в базе данных. Чтобы получить этот поиск, просто добавьте строку запроса на URL-адрес и снова запросите страницу поиска.

Единственное предостережение - это как изменение действия поиска, которое вы должны сделать для интеллектуальных значений по умолчанию, чтобы не нарушать старые поисковые запросы. Например, предположим, что вы начинаете поиск по цвету, ни один из старых поисковых запросов не будет иметь цветовые критерии, поэтому вашему поисковому действию придется удовлетворить это, и убедитесь, что вместо этого используется что-то разумное, например, ВСЕ цвета.

Ответ 2

таблица

таблица Критерии (= список предоставленных критериев поиска)

таблица SavedSearch (подробная информация о пользователях)

таблица SavedSearchCriteria, деталь SavedSearch, ссылка на критерии, столбец SearchValue содержит значение, введенное пользователем для каждого из введенных критериев

Ответ 3

Я бы пошел с №1. Если вас действительно беспокоит изменение критериев, вы можете сохранить его с атрибутом "поисковой версии" и массировать сериализованное представление, когда это необходимо.

# 2 не будет масштабироваться до какой-либо полезности. Например, если вы хотите сделать какую-либо логическую группировку критериев поиска, ваша схема БД загорится и начнет кричать в лес.

Я обычно решаю проблемы поиска, вытягивая индексирование/поиск из базы данных. Это может быть излишним для того, о чем вы говорите, но RDBMS не так хороши для поиска.

Ответ 4

Вы можете сохранить динамический SQL в базе данных в виде текстовой строки. Тогда вам не придется выполнять все махинации воссоздания WHERE и IN и другого SQL из сохраненных пар ключ-значение.

Вы можете использовать сохраненный SQL и запускать его при создании электронной почты.

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

Ответ 5

Я думаю, что оба подхода имеют смысл, и все зависит от требований (текущих и перспективных).

Например, если количество запросов велико, и если вам нужно их проанализировать (например, отвечать на такие вопросы, как "Как часто люди ищут каждое количество спален?" ), сохранение поисков и их критериев в реляционной форме (ваш вариант № 2) будет более чем уместным.

Но если у вас нет каких-либо неотложных требований, которые диктуют использование опции № 2, нет ничего плохого в сериализации, ИМХО. Просто убедитесь, что вы НЕ нарушаете совместимость с существующими данными, поскольку структура ваших критериев поиска изменяется с течением времени. (BTW, проблемы обратной совместимости не относятся к опции №1 - они могут возникать даже при использовании опции № 2.) Ключевым моментом является то, что вы всегда можете переключиться с опции № 1 на вариант № 2, и вы можете откладывать с такой перестановкой до тех пор, пока это будет считаться практичным.

Ответ 6

Я бы добавил также видимость данных к решению... а также Пользователи таблицы - содержат пользователей Роли таблицы - содержат роли n db Таблица UserRoles - один пользователь может иметь одну или несколько ролей на сеансе Таблица MetaColumns - содержит метаинформацию для всех столбцов/представлений в db Table ControllerMetaColumns - видимость для MetaColumns на UserRole, пользователям всегда приходилось получать доступ к фактическим данным через этот (INNER JOIN) Таблица TableViewToSearch - таблица или представление для выполнения поиска по Таблица SavedSearch - имеет атрибуты ControllerMetaColumnsId, TableViewToSearchId, SavedSearchString - если Роль не имеет доступа к атрибуту, ей будет предоставлен пустой набор результатов

Ответ 7

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

XML должен быть самым масштабируемым решением, и я буду избегать передачи параметров URL в действие. Это может быть простое решение, но будет иметь следующие проблемы.

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

  • Сохранение сложных критериев поиска будет проблемой. Что делать, если я хочу сохранить комплекс и условие. (В XML, поскольку он уже является иерархическим, я мог бы просто хранить всю необходимую мне информацию).

  • Решение может быть масштабируемым и также будет дезинфицировать ваше приложение от атак Sql.

  • Так как XML - это зрелая технология, вы можете использовать его для выполнения валидации перед тем, как передать его в конец.

Ответ 8

Если я могу предложить, введите html-страницу с результатами поиска (если она содержит умеренное количество записей). И сохраните путь к нему вместе с критериями поиска в DB

Это позволит избежать запросов к БД.

Изменить: я предполагаю, что записи не будут меняться так часто. Если это так, лучше хранить критерии поиска в базе данных и запрашивать его при запросе пользователя.