Я перестраиваю большую базу данных хранилища, в которой изначально использовались натуральные ключи, и теперь я хочу перейти на суррогатные ключи.
Поэтому я рассматриваю возможность разделения базы данных на физический уровень и логический уровень .
На физическом уровне каждая таблица получает в основном два поля, подобных этому: (упрощенный случай)
tblProducts:
ProductKey bigint identity (1,1) not null primary key,
ProductID nvarchar(100) not null unique
tblSales:
RowKey bigint identity (1,1) not null primary key,
ProductKey bigint not null references tblProducts(ProductKey),
DateSold date,
UnitsSold decimal,
UNIQUE (ProductKey, DateSold)
- Поле «Ключ» всегда является первичным ключом, который также используется во всех отношениях внешнего ключа.
- Поле «ID» является уникальным nvarchar. Пользователи всегда будут работать с «ID» и никогда не увидят «ключ».
В логическом слое идея состоит в том, чтобы создавать представления для каждой таблицы, которая будет " скрыть "суррогатный ключ и позволит мне работать с идентификаторами. Даже администраторы базы данных должны, наконец, работать только с представлениями! Например:
Просмотр vwSales:
select
prd.ProductID,
sls.DateSold,
sls.UnitsSold
from tblSales sls inner join tblProducts prd on sls.ProductKey = prd.ProductKey
Теперь, если я хочу работать с этим представлением, мне нужно создать триггеры, которые обрабатывают все обновление / удаление / вставить и «перевести» его на физический уровень. Для создания всех этих представлений много работы. Итак:
- Есть ли способ «автоматически» создавать такие представления?
- Это хороший подход для разделения базы данных на физический и логический уровень вообще?