Вопрос: Дизайн таблицы для SystemSettings, лучшая модель


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

ID | IsAdmin | ImagePath
------------------------------
12 | 1 | \ Путь \ к \ изображений
34 | 0 | \ Путь \ к \ изображений

Недостатком этого является каждый раз, когда мы хотим, чтобы новое имя параметра (или тип) меняло таблицу (через sql) и добавляло новое имя / тип установки (столбца). Затем обновите строки (чтобы каждый клиент теперь имел значение для этой настройки).

Новое предложение по дизайну стола. Предложение состоит в том, чтобы иметь столбец для установки имени и другого столбца для настройки.
ID | SettingName | SettingValue
----------------------------
12 | IsAdmin | 1
12 | ImagePath | \ Путь \ к \ изображений
34 | IsAdmin | 0
34 | ImagePath | \ Путь \ к \ изображений

То, что они сделали, было то, что добавление нового параметра было так же просто, как простой оператор insert в строку, без добавленного столбца.

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


5


источник


Ответы:


Это вариация " Значение атрибута Entity "схема ( Joel  а также случайный вопрос SO )

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


2



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

  • Держите свои ключевые строки статичными, никогда не переименовывайте.
  • Убедитесь, что каждый раз, когда вы загружаете словарь настроек, вы обновляете его до последней версии (обычно добавляя ключи и устанавливая значения по умолчанию / запрашивая пользователя).
  • Трудно смешивать строку и, например, десятичные данные, вам нужно будет выбрать один или предоставить несколько столбцов с нулевым значением, чтобы вы могли хранить данные в соответствующем формате. Храните эти метаданные где-то.
  • Код, который имеет дело со словарем, должен обернуть его строго типизированным способом, никогда не выставлять его в качестве реального словаря (в смысле структуры данных), вместо этого предоставляйте класс.

1



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


0