Что лучше?

Модераторы: kdv, CyberMax

Ответить
AnryGTR
Сообщения: 116
Зарегистрирован: 15 янв 2007, 15:58

Что лучше?

Сообщение AnryGTR » 12 окт 2007, 13:41

Есть таблица, в которой всего два поля и оба FK. Нужно чтобы все комбинации полей были уникальными - так вот что лучше создать ещё уникальный составной индекс, либо проверять это в триггерах?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 12 окт 2007, 13:47

запомни, пожалуйста, один раз и навсегда
в триггерах контролировать целостность типа уникальность или ссылка по FK НЕВОЗМОЖНО. Потому что триггеры работают в контексте транзакций клиента.

Индексы контролируют уникальность и ФК потому, что они "видят" все изменения любых транзакций.

так что кроме уникального составного индекса других вариантов нет.
С другой стороны, есть подозрения на проблемы в консерватории.

Обычная ситуация когда ПК состоит из n столбцов и каждый столбец из n может являться ПК.
Другое дело, когда у таблицы уже есть ПК, а два FK столбца пытаются сделать уникальными. Т.е. я не против альтернативных ключей, но в данной ситуации это подозрительно.

AnryGTR
Сообщения: 116
Зарегистрирован: 15 янв 2007, 15:58

Сообщение AnryGTR » 12 окт 2007, 13:58

Да я знаю что использовать триггеры для контроля FK по меньшей мере является плохим тоном. Я создал FK для этих полей, но у меня ситуевина следующая:
есть контора, в ней есть отделения - одна таблица
есть юзеры (персонал) - вторая таблица.
И у них один юзер(у них специализация позволяет) может относиться к нескольким отделам. Вот я и сделал третью таблицу из двух полей, и создал там ФК-шки. Тока нельзя же допустить, чтобы в таблице было более одной записи с одинаковыми значениями полей! 8)

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 12 окт 2007, 14:10

Задумчиво глядя на календарь: вопрос что лучше - он, сцуко, сложный. Зависит от имеющейся в наличии закуски в сильнейшей степени. Ну и от бюджета, канешна. Однако мОлодеш нынче предпочитает траву :cry: Наводящий вопрос - а какой в этой таблице M:N Primary Key?

AnryGTR
Сообщения: 116
Зарегистрирован: 15 янв 2007, 15:58

Сообщение AnryGTR » 12 окт 2007, 14:20

Таблица из двух полей - ссылка на ОТДЕЛ, ссылка на ЮЗЕРА, и все...

Код: Выделить всё

CREATE TABLE USERS (
  ID       INTEGER NOT NULL,
  ..., ...
);

ALTER TABLE USERS ADD CONSTRAINT
PK_ID_USERS
PRIMARY KEY (ID);

CREATE TABLE OTDELS (
  ID   INTEGER NOT NULL,
  ..., ...
);

ALTER TABLE OTDELS ADD CONSTRAINT
PK_ID_OTDEL
PRIMARY KEY (ID);


CREATE TABLE USER_OTDEL (
  ID_US    INTEGER NOT NULL,
  ID_OTDEL INTEGER NOT NULL
);

ALTER TABLE USER_OTDEL ADD CONSTRAINT
FK_ID_OTDEL
FOREIGN KEY (ID_OTDEL) REFERENCES OTDELS (ID) 
ON DELETE CASCADE 
ON UPDATE CASCADE;
ALTER TABLE USER_OTDEL ADD CONSTRAINT
FK_ID_US
FOREIGN KEY (ID_US) REFERENCES USERS (ID) 
ON DELETE CASCADE 
ON UPDATE CASCADE;

belov-evgenii
Сообщения: 52
Зарегистрирован: 28 сен 2007, 10:19

Сообщение belov-evgenii » 12 окт 2007, 15:24

У тебя идентифицирующие связи. Поэтому можно эти же FK сделать PK. Смотри таблицу EMPLOYEE_PROJECT в EMPLOYEE.FDB - там как раз типа этого и есть

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 12 окт 2007, 15:37

Гыыы, таблица без ПК :-D Я ж говорю - трава :-D

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 12 окт 2007, 16:08

OFF: Во дворе дрова, на дровах братва, у братвы трава. (ц)

AnryGTR
Сообщения: 116
Зарегистрирован: 15 янв 2007, 15:58

Сообщение AnryGTR » 12 окт 2007, 21:37

Всем спасибо! Просто раньше с этим не сталкивался...гыгы :D , аж самому стыдно! :oops:

Ответить