Выделение части в отдельные таблицы

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Выделение части в отдельные таблицы

Сообщение Qwertiy » 12.02.2012 (Вс) 1:34

Есть некоторые общие данные, которые сохраняются в таблице. В зависимости от конкретного типа, есть дополнительные данные, помещаемые в другие таблицы (по таблице для каждого подтипа). Надо сделать так, чтобы каждой записи в основной таблице соответствовала запись в единственной уточняющей таблице. Общие данные нельзя поместить в уточняющие таблицы, т. к. на них есть ссылки в других таблицах.

Есть ли более хорошие варианты, чем
Код: Выделить всё
create table [Type]
(
[Id] integer not null primary key,
[Text] nvarchar(32) not null unique
);

insert into [Type] ([Id], [Text]) values (1, 'Подтип 1');
insert into [Type] ([Id], [Text]) values (2, 'Подтип 2');

create table [Main]
(
[Id] integer not null primary key identity(1,1),
[TypeId] integer not null,
[Text] nvarchar(32) not null,
unique ([Id], [TypeId]),
foreign key ([TypeId]) references [Type] ([Id])
);

create table [Way1]
(
[Id] integer not null primary key,
[TypeId] integer check ([TypeId]=1) not null default 1,
[Field1] integer not null,
foreign key ([Id]) references [Main] ([Id]),
foreign key ([Id],[TypeId]) references [Main] ([Id],[TypeId])
);

create table [Way2]
(
[Id] integer not null primary key,
[TypeId] integer check ([TypeId]=2) not null default 2,
[Field2] nvarchar(16) not null,
foreign key ([Id]) references [Main] ([Id]),
foreign key ([Id],[TypeId]) references [Main] ([Id],[TypeId])
);

PS: База данных SQL Server, но хотелось бы, чтобы решение от этого не зависело.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Выделение части в отдельные таблицы

Сообщение FireFenix » 12.02.2012 (Вс) 3:31

Если простая логика связей Таблица1 <- Таблица2, то достаточно в таблице2 ввести поле id_parent, которое бы соответствовало id элемента в тпблице1 (насколько я понял - так и сделано)

Можно сделать по другому - вынести связи в отдельную таблицу со столбцами id, id_parent, id_child (, если параметр один и тотжий, но просто разные таблицы, то можно взять ещё id_type = [0 .. количество таблиц])
В итоге получаем: Выборка из таблицы связей -> выборка из зависимых таблиц.

Ещё в помощь чудесная функция MSSQL для распиливания логических деревьев http://www.rsdn.ru/article/db/transactsql.xml
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Выделение части в отдельные таблицы

Сообщение HandKot » 24.02.2012 (Пт) 7:03

если я правильно понял, то в уточняющих таблицах нужно сделать констрейт, который проверял наличие такого идентификатора в других уточняющих таблицах
и при наличии запрещал ввод
или же, как сказал FireFenixб сделать еще одгу таблицу связей и связывать через неё
I Have Nine Lives You Have One Only
THINK!

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 24.02.2012 (Пт) 22:53

HandKot, а можно поподробнее?

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Выделение части в отдельные таблицы

Сообщение HandKot » 25.02.2012 (Сб) 16:57

тут посмотрел, нельзя напрямую в ограничении CHECk обращаться к другой таблице
и посмотрел предложенные Вами скрипты, мне кажется, указанные ограничения вполне справятся с задачей
и ненадо ничего больше придумывать
I Have Nine Lives You Have One Only
THINK!


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

    TopList