Как определить пользовательский тип данных с адресными элементами?

62
8

У меня необычная ситуация для моделирования в базе данных MS SQL Server: первичный ключ таблицы представляет собой многосегментный "естественный" ключ, состоящий из 5 внешних ключей (фиксированных размеров).


Я хотел бы иметь возможность определять пользовательский тип данных для реализации структуры данных на основе примитива CHAR (8) таким образом, что элементы адресуются как отдельные поля.


Например (в плохом псевдокоде):


UDT seggy
(
seg1 char(2),
seg2 char(1),
seg3 char(1),
seg4 char(2),
seg5 char(2)
)

create table yotable
(
pkfield seggy NOT NULL,
etc varchar(14), --whatever etc.
)
with pkfield as the primary key,
and also with seg1 as a foreign key to tableseg1,
and also with seg2 as a foreign key to tableseg2,
and so on


а затем выполните следующие действия:


insert into yotable (pkfield, etc) values ('abcdefgh','whatever')
select * from yotable where seg2 = 'c'
insert into yotable (seg1,seg2,seg3,seg4,seg5,etc)
values ('ab','c','d','ef','gh', 'whatever')

До сих пор все, что я нашел, это статья CodeProject, которая недостаточно продвинулась или предоставляет ссылки для дальнейшей информации, и эта рудиментарная Ссылка MSDN.


По-видимому, мой google-fu сегодня слаб, любые ссылки/подсказки очень ценятся!


Альтернативное название: как имитировать поля "overlay" в SQL SERVER?


MS SQL SERVER 2005 или более поздняя версия предполагается/предпочтительна.

спросил(а) 2008-12-17T00:52:00+03:00 12 лет, 3 месяца назад
1
Решение
62

Вы можете определить UDT CLR, у которого есть структура, которую вы хотите, но (1) вы не сможете хранить внешние ключи (внешние ключи должны быть на уровне столбца, а не поле в UDT в столбец) и (2) нетривиально реализовать CLD UDT (по крайней мере, по сравнению с тем, что находится в вашем псевдокоде). Кроме того, из вашего описания это похоже на то, что они действительно являются отдельными столбцами семантически, и то, что вы ищете, - это просто ярлык для удобства; IMO UDT, вероятно, не самый лучший подход в этом сценарии.

Я хотел бы предложить сохранить отдельные столбцы, но создать либо представление, в котором есть столбец, который объединяет поля вместе, либо вычисляемый столбец в таблице, который делает то же самое. Это позволит осуществлять поиск с использованием комбинированной или отдельной записи. Затем вы можете использовать триггер INSTEAD OF для разложения вставки/обновления в объединенной колонке в составные части.

ответил(а) 2008-12-17T02:24:00+03:00 12 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема