powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Обеспечение целостности в нескольких таблицах
4 сообщений из 4, страница 1 из 1
Обеспечение целостности в нескольких таблицах
    #34058959
RealMaksimus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такая структура.

DataType(ID, Name, BaseUnitID)
Unit(ID, Value, BaseUnitID)
BaseUnit(BaseUnitID)

DataType, Unit связаны внешними ключами с BaseUnit. Между собой относятся как многие-ко-многим.

Мы можем построить вьюху (DataTypeID, UnitID), которая определяет допустимые сочетания типов данных и единиц измерения.

Очень бы хотелось построить внешний ключ на табличке Main(..., DataTypeID, UnitID), ссылающийся на такую вьюху, но нельзя. Или как-то все-таки можно? (SQL Server 2005). Или есть другой способ обеспечить подобную целостность без триггеров?


-------------------------------------------------------
Отладка есть процесс избавления программы от лажи.
...
Рейтинг: 0 / 0
Обеспечение целостности в нескольких таблицах
    #34059877
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно за счет избыточности в Main.

Main(..., DataTypeID, UnitID, BaseUnitID)
ФК1 (DataTypeID, BaseUnitID) ссылается на DataType
ФК2 (UnitID, BaseUnitID) ссылается на Unit
...
Рейтинг: 0 / 0
Обеспечение целостности в нескольких таблицах
    #34059896
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RealMaksimusОчень бы хотелось построить внешний ключ на табличке Main(..., DataTypeID, UnitID), ссылающийся на такую вьюху, но нельзя.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
create table BaseUnit ( BaseUnitID integer not null primary key ... ) ;

create table DataType ( 
  DataTypeID integer not null primary key,
  BaseUnitID integer not null references BaseUnit ( BaseUnitID )) ;

alter table DataType add constraint DataType_AK unique ( DataTypeID, BaseUnitID ) ;

create table Unit ( 
  UnitID integer not null primary key,
  BaseUnitID integer not null references BaseUnit ( BaseUnitID )) ;

alter table Unit add constraint Units_AK unique ( UnitID, BaseUnitID ) ;

create table MainData ( 
  ....
  DataTypeID integer not null,
  UnitID integer not null, 
  BaseUnitID integer not null
  .... ) ;

alter table MainData add constraint MainData_Unit_FK
  foreign key ( UnitID, BaseUnitID ) references Unit ( UnitID, BaseUnitID ) ;

alter table MainData add constraint MainData_DataType_FK
  foreign key ( DataTypeID, BaseUnitID ) references DataType ( DataTypeID, BaseUnitID ) ;
...
Рейтинг: 0 / 0
Обеспечение целостности в нескольких таблицах
    #34060309
RealMaksimus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так-то да... Мысли определенно сходятся :) Спасибо. Но я уж лучше тригерров, поддерживающих целостность понавешу, чем избыточность вводить буду. Тем более, что это я про одну табличку MainData написал. На самом деле сладкая парочка DataTypeID, UnitID по всей базе расползлась. И во всех таблицах добавлять избыточное поле. (Почему не сделать тогда суррогатный ключ на пару DataTypeID, UnitID? Потому что это лишний join в паре самых узких мест).


------------------------------------------------------
Отладка есть процесс избавления программы от лажи.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Обеспечение целостности в нескольких таблицах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]