Преобразование дизайна таблицы без влияния на код - PullRequest
0 голосов
/ 16 января 2020

Фон

У нас очень старый дизайн базы данных. Худшим примером является таблица конфигурации. Это одна строка с отдельным столбцом для каждого значения. Это должна быть настройка пары «ключ-значение» (очевидно). Он используется везде как в нашем старом унаследованном коде, так и теперь в нашем новом веб-коде. Ужасно, что теперь есть более 300 столбцов, и еще хуже добавляются время от времени.

Цель

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

Попытка решения

Обычно я использовал бы представление - но, учитывая, что лучший код для его отображения (отсюда: { ссылка }) - это Dynami c SQL, я открепился, когда я не могу использовать Dynami c SQL в представлении (мой поиск говорит мне, что представления не позволяют Dynami c SQL - я предполагаю, что это правильно?)

Пример таблицы

CurrentConfig

Key   Name         Address      etc.
1     My Company   My Address   etc.

WantedConfig

ID     Key     Value
1      Name    MyCompany
2      Address My Address
3      etc.    etc.

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

Ответы [ 2 ]

1 голос
/ 16 января 2020

Если проблема отображает конфигурацию new в устаревшем коде, используйте условное агрегирование:

create view oldconfig as
    select max(case when key = 'Name' then value end) as name,
           max(case when key = 'Address' then value end) as address,
           . . .
    from newconfig;

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

0 голосов
/ 16 января 2020

Вы можете использовать apply:

select tt.id, tt.Key, tt.Val
from table t cross apply 
     ( values (1, 'Name', Name), 
              (2, 'Address', Address), 
              (3, 'etc.', etc)
     ) tt(id, Key, Val)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...