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

StackOverflow https://stackoverflow.com/questions/1200340

Вопрос

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

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

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

Это было полезно?

Решение

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

Модель сущности-атрибута-значения, о которой упоминает HLGEM, подходит для этого из «простой эволюции»; в перспективе, но, как он говорит, это будет иметь очень плохую производительность.

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

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

что бы вы ни делали, избегайте использования структуры entity-attrivute-value для этого ( http: //en.wikipedia.org/wiki/Entity-Attribute-Value_model ), если вам не нужна очень плохо работающая система. Вызов одной таблицы с 50 столбцами будет намного быстрее, чем вызов одной таблицы, к которой нужно присоединиться 50 раз, чтобы получить всю необходимую информацию.

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

Я не знаю, буду ли я вообще хранить в базе данных такую ​​информацию, как настройки пользователя.Похоже, вам захочется просмотреть многие (если не все) пользовательские настройки, как только пользователь войдет в систему;если вы в конечном итоге выполните кучу запросов к базе данных, ваша система будет работать довольно медленно.Вместо этого я бы рекомендовал сохранять ВСЕ настройки пользователя в одном файле (или где-то в одной записи), поглощать их целиком и кэшировать, как только пользователь входит в систему.

Если предположить, что пользовательские данные уже хранятся в базе данных, то я не вижу реальной проблемы хранить их все в одной строке, особенно если вам может потребоваться выполнять запросы, основанные на данных, т.е. выберите всех пользователей с предпочтением A ИЛИ B и т. д.

Я бы, однако, загрузил его в класс и сохранил этот класс с помощью какого-то механизма кэширования.

Если вам не нужно искать предпочтения, вы всегда можете сохранить предпочтения в формате XML и сохранить их в " Предпочтении " колонка. Должно облегчить добавление новых настроек в будущем;)

Другой вариант, который вы могли бы сделать (если вам не нужны ваши элементы, хранящиеся в БД, например, для проверки статистики для вещей (кто что делает и т. д.)), вы можете просто поместить все их настройки в файл cookie и сохранить это на их машине.

Конечно, с куки приходит все предостережения от использования куки. но просто другая идея ...

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

В целом пользовательские предпочтения, как правило, очень статичны (то есть являются привычкой), не путайте пользовательские данные, которые более изменчивы, с предпочтениями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top