powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / проектирование теория
8 сообщений из 8, страница 1 из 1
проектирование теория
    #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
проектирование теория
    #33303652
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Общие соображения.
Если это вычисляемые поля, то прежде всего нужно подумать, а стоит ли их хранить. Уверены, что стоит - тогда нет смысла обкладывать
дополнительными ограничениями целостности в режиме RESTRICT.
За них должны отвечать процедры вычисления.

Правда, FK можно использовать для реализации каскадного изменения дочек например ON DELETE SET NULL, что может частично упростить процедуры.
...
Рейтинг: 0 / 0
проектирование теория
    #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
проектирование теория
    #33303996
_hike_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Код: plaintext
create table Услуги_Фирм (Id int primary key, Firm_Id int, Service_Id)
...
Рейтинг: 0 / 0
проектирование теория
    #33305562
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Бизнес-правила.
-Услуги_Фирм очевидно не не должны содержать дублирующихся записей.
UNIQUE (Firm_Id int, Service_Id)

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

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

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

упростил
ModelRВедь мы их всегда можем вычислить запросом. Возможные ответы:
Да они вычисляемые, а денормализация предпринята для сокращения времени запросов. Тогда см. ответ выше.
наконец то я понял что Вы подразумеваете под термином вычисляемые :))
...
Рейтинг: 0 / 0
проектирование теория
    #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
проектирование теория
    #33305650
_hike_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПоэтому все же подумайте, а для чего денормализаия?
странный вопрос ...., для ускорения запросов.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / проектирование теория
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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