Для мене, чи ви ходите однорядно або EAV, залежить від того, як ви їх хочете споживати.
Потужність EAV полягає в тому, що нові дані можна додавати без зміни структури. Це означає, що якщо ви хочете нове значення конфігурації, ви просто додаєте його до таблиці та витягаєте його там, де ви хочете його в коді, і вам не потрібно додавати нове поле до домену, схеми, відображення, запитів DAL тощо.
Його недолік полягає в тому, що він має лише найпростішу структуру, що вимагає від вас поводження з даними песимістично. Кожне використання будь-якого значення конфігурації повинно очікувати, що значення не буде чи не у належному форматі, і поводитись відповідно, коли воно не є. Значення конфігурації може не піддаватися подвійному чи інертному чи знаковому знакам. Це може бути недійсним. взагалі може не бути рядка для значення. Шляхи цього зазвичай вимагають існування єдиного дійсного значення "за замовчуванням" для всіх значень конфігурацій певного типу коду ( вкрай рідко; частіше значення за замовчуванням настільки ж проблематичне для використання коду, як і взагалі жодного) або зберігайте твердокодированний словник значень за замовчуванням (який потрібно змінювати щоразу, коли додається новий стовпець, що робить основну перевагу зберігання EAV досить суперечливою).
Один широкий ряд - це навпаки. Ви зіставляєте його в одному екземплярі об'єкта Конфігурація з полем / властивістю для кожного існуючого значення конфігурації. Ви точно знаєте, який тип цих значень повинен бути під час компіляції, і ви «швидко провалюєтесь» у DAL, якщо стовпчик конфігурації не існує або не має значення належного типу, що дає вам одне місце для вилучення винятків на основі про проблеми з конфігурацією / гідратацією.
Основним недоліком є те, що для кожної нової величини потрібні структурні зміни; новий стовпчик БД, новий стовпчик у DAL (або відображення, або запити SQL / SP), новий стовпець домену, все необхідне для належного тестування використання.
Правильна ситуація, в якій використовувати будь-яке з них, - це ситуація, в якій недоліки пом'якшуються. Для мене більшість ситуацій для кодування конфігурації вимагають реалізації однорядного. Це головним чином тому, що якщо ви вводите абсолютно нове значення конфігурації, яке регулює поведінку певної частини вашої програми, вам вже доведеться змінити код, щоб використовувати нове значення конфігурації; чому б не перескочити на об’єкт config та додати значення, яке буде використано?
Коротше кажучи, схема EAV для зберігання конфігурації насправді не вирішує проблему, яку вона вирішує вирішити, і більшість обхідних проблем, які вона представляє, порушують DRY.