Дизайн таблицы базы данных «Пользовательские настройки»
Я хочу создать таблицу для пользовательских предпочтений и не могу придумать лучший способ сделать это. То, как ASP.NET делает это по умолчанию, кажется чрезвычайно неудобным, и хотелось бы этого избежать. В настоящее время я использую одну строку для каждого пользователя, где у меня есть разные столбцы для каждого пользовательского предпочтения (я знаю, что не нормализовано).
Итак, другая идея, которую я придумал, заключалась в том, чтобы разделить сами настройки в отдельную таблицу, а затем создать строку PER-предпочтения для каждого пользователя в таблице пользовательских настроек; однако это будет означать, что каждое предпочтение должно быть одного и того же типа данных, что также не кажется мне слишком привлекательным.
Итак, мой вопрос: каков наилучший / наиболее логичный способ создания базы данных для хранения значений пользовательских предпочтений?
Ответов (4)4
Очень быстро, один метод:
User(UserID, UserName, ...)
PreferenceDataType(PreferenceDataTypeID, PreferenceDataTypeName)
PreferenceDataValue(PreferenceDataValueID, PreferenceDataTypeID, IntValue, VarcharValue, BitValue, ...)
Preference(PreferenceID, PreferenceDataTypeID, PreferenceName, ...)
UserHasPreference(UserID, PreferenceID, PreferenceDataValueID)
Я обычно так делаю:
Users table (user_id, .... etc.)
.
Options table (option_id, data_type, ... etc.)
(list of things that can be set by user)
.
Preferences table (user_id, option_id, setting)
Я использую новый тип данных SQLVARIANT для поля настроек, поэтому это могут быть разные типы данных, и записывать тип данных параметра как часть определения параметра в таблице параметров, чтобы вернуть его к правильному типу при запросе.
Некоторые из идей, которых я стараюсь избегать при работе с базами данных, - это дублирование данных и ненужное усложнение. Вы также хотите избежать « аномалий при вставке, обновлении и удалении ». Сказав это, сохранение пользовательских предпочтений в одной таблице с каждой строкой = один пользователь и столбцы, различные доступные предпочтения имеют смысл.
Теперь, если вы видите, что эти предпочтения используются в любой другой форме или моде в вашей базе данных, например, несколько объектов (не только пользователей), использующих одни и те же предпочтения, тогда вы захотите пойти по второму маршруту и ссылаться на предпочтения с помощью FK / PK пары.
Что касается того, что вы описали, я не вижу причин, по которым первый маршрут не сработает.
Если вы сохраните все свои пользовательские настройки в одной строке таблицы User, вас ждет кошмар обслуживания!
Используйте одну строку на предпочтение для каждого пользователя и сохраните значение предпочтения как varchar (длина, скажем, 255 или какое-то значение, достаточно большое, чтобы удовлетворить ваши требования). Очевидно, вам придется преобразовывать значения в / из этого столбца.
Единственная ситуация, когда это не сработает легко, - это если вы хотите сохранить некоторые большие двоичные данные в качестве предпочтений пользователя, но я не обнаружил, что это является общим требованием.