Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / проектирование теория / 8 сообщений из 8, страница 1 из 1
04.10.2005, 12:27
    #33303369
_hike_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проектирование теория
Товарищи теоретики подскажите: при денормализации ограничения ссылочности перетаскиваются тоже или нет ?
Например: Таблица A ( Id PK), Таблица B ( Id PK)
Таблица C ( Id PK, A_Id FK, B_Id FK AK) - расскрывает много ко много Таблиц А,B.
Таблица D ( Id PK, C_Id FK)
в таблице D необходимо присутствие полей A_Id, B_Id.
Если сделать в С составной PK то вопрос решается но этот вариант не подходит.
Поэтому в Таблицу D добавляю поля A_Id, B_Id: D ( Id PK, C_Id FK, A_Id, B_Id), но делать ли их FK ???
Как по теории прально посоветуйте плиззз. Пасиб.
...
Рейтинг: 0 / 0
04.10.2005, 13:36
    #33303652
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проектирование теория
Общие соображения.
Если это вычисляемые поля, то прежде всего нужно подумать, а стоит ли их хранить. Уверены, что стоит - тогда нет смысла обкладывать
дополнительными ограничениями целостности в режиме RESTRICT.
За них должны отвечать процедры вычисления.

Правда, FK можно использовать для реализации каскадного изменения дочек например ON DELETE SET NULL, что может частично упростить процедуры.
...
Рейтинг: 0 / 0
04.10.2005, 15:11
    #33303992
_hike_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проектирование теория
ModelR
авторЕсли это вычисляемые поля...
это как ?

Ок давайте на конкретном примере:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table Фирмы (Id int primary key, ...)

create table Услуги (Id int primary key, ...)

create table Услуги_Фирм (Id int primary key, Firm_Id int, Purpose_Id)

alter table  Услуги_Фирм
   add constraint FK_Услуги_Фирм_REFERENCE_Услуги foreign key (Service_Id) references Услуги (Id)

alter table  Услуги_Фирм
   add constraint FK_Услуги_Фирм_REFERENCE_Фирмы foreign key (Firm_Id) references Фирмы (Id)

alter table Услуги_Фирм
   add constraint AK_KEY_Услуги_Фирм unique  (Firm_Id, Service_Id)

create table Клиенты (Id int primary key, ...)
как теперь наиболее корректно спроектировать: "Клиент воспользовался услугой фирмы" при этом отобразив Услугу и Фирму в таблице Клиенты:

1.
alter table Клиенты add Firm_Service_Id int

alter table Клиенты add constraint FK_Клиенты_REFERENCE_Услуги_Фирмы foreign key (Firm_Service_Id) references Услуги_Фирм (Id)

alter table Клиенты add Firm_Id int
alter table Клиенты add Service_Id int

2.
то же что и 1 только добавив FK constraint на Firm_Id и на Service_Id
3.
то же что и 2 забрав
constraint FK_Клиенты_REFERENCE_Услуги_Фирмы
следя за целосностью програмно
4.
Ваш вариант ...
...
Рейтинг: 0 / 0
04.10.2005, 15:13
    #33303996
_hike_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проектирование теория
...
Код: plaintext
create table Услуги_Фирм (Id int primary key, Firm_Id int, Service_Id)
...
Рейтинг: 0 / 0
05.10.2005, 10:59
    #33305562
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проектирование теория
1. Бизнес-правила.
-Услуги_Фирм очевидно не не должны содержать дублирующихся записей.
UNIQUE (Firm_Id int, Service_Id)

- Клиент может воспользоваться только одной Услуги_Фирм (довольно странно, но пусть так).

- Если клиент воспользовался некоторой Услуги_Фирм то мы хотим хранить
и ссылку на первичный ключ и значения атрибутов Услуги_Фирм в Клиенты.

Первый вопрос: в чем смысл хранения атрибутов ? Ведь мы их всегда можем вычислить запросом. Возможные ответы:
Да они вычисляемые, а денормализация предпринята для сокращения времени запросов. Тогда см. ответ выше.
Нет, это значения на тот момент, когда был создан Клиент, и при изменении данных в Услуги_Фирм соответсвующие атрибуты в Клиенты не меняются (они не вычисляемые). Тогда надо думать в сторону исторических (темпоральных) данных.
...
Рейтинг: 0 / 0
05.10.2005, 11:10
    #33305617
_hike_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проектирование теория
ModelR1. Бизнес-правила.
-Услуги_Фирм очевидно не не должны содержать дублирующихся записей.
UNIQUE (Firm_Id int, Service_Id)
я описал это в скрипте выше.
ModelR- Клиент может воспользоваться только одной Услуги_Фирм (довольно странно, но пусть так).

упростил
ModelRВедь мы их всегда можем вычислить запросом. Возможные ответы:
Да они вычисляемые, а денормализация предпринята для сокращения времени запросов. Тогда см. ответ выше.
наконец то я понял что Вы подразумеваете под термином вычисляемые :))
...
Рейтинг: 0 / 0
05.10.2005, 11:10
    #33305619
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проектирование теория
Есть еще такой трюк:
Код: plaintext
1.
2.
alter table  Услуги_Фирм
   add constraint U2 UNIQUE (id, Firm_Id, Service_Id)
alter table Клиенты add constraint FK_2 foreign key (Firm_Service_Id, Firm_Id, Service_Id) references Услуги_Фирм (Id,Firm_Id, Service_Id)
Однако писать процедуры вычисления придется все равно.
Поэтому все же подумайте, а для чего денормализаия?
...
Рейтинг: 0 / 0
05.10.2005, 11:16
    #33305650
_hike_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проектирование теория
авторПоэтому все же подумайте, а для чего денормализаия?
странный вопрос ...., для ускорения запросов.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / проектирование теория / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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