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

Задача такая: есть две таблицы, связанные [1:N] обычным FK. Допустим, список отделов и список сотрудников в них.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE departments (
  dep_id   INT NOT NULL,
  name     VARCHAR( 100 ) NOT NULL,

  PRIMARY KEY (dep_id)
);

CREATE TABLE employees (
  dep_id    INT,
  emp_id    INT NOT NULL,
  surname   VARCHAR( 100 ) NOT NULL,

  PRIMARY KEY (dep_id, emp_id),
  FOREIGN KEY (dep_id) REFERENCES departments (dep_id)
    ON UPDATE CASCADE
    ON DELETE SET NULL
);

Необходимо навесить к ним дополнительное условие — если в отделе есть сотрудники, один ( и только один ) из них должен быть как-то отмечен. Например, пусть эта метка будет означать начальника отдела.

Как это реализовать?

Мысль первая — добавить поле
Код: plaintext
1.
  is_boss    BOOLEAN NOT NULL
в таблицу employees , и следить, чтобы только одна запись для данного dep_id содержала в нем TRUE. Как это обеспечить?

Мысль вторая — наоборот, добавить поле
Код: plaintext
1.
  boss_id    INT
в таблицу departments , которое будет указывать на emp_id соответствующего сотрудника. Ожидается, что такой emp_id существует, и например, при удалении сотрудника в таблице отделов boss_id устанавливался в NULL.

Хотелось бы что-то вроде в departments :
Код: plaintext
1.
2.
3.
  FOREIGN KEY (boss_id) REFERENCES employees -- упс, а как ж его референсить на номер сотрудника?
    ON DELETE SET NULL
);

Вот такая вот проблема. Или прослоечную таблицу сделать? Не знаю, какую.

Вообще, можно ли обеспечить целостность, обойдясь без триггеров?

Помогите, pls!
...
Рейтинг: 0 / 0
Взаимозависимые свойства
    #36679264
zenk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xarg,

Это уже не целостность, а бизнес-правила.

Промежуточная таблица в дальнейшем позволит расширить функциональность, например, хранить период руководства отделом.

Триггер поможет контролировать соблюдение этого бизнес-правила.

Но реально всё это надо делать на клиенте.

"Вы удаляете сотрудника, являющегося начальником отдела. Необходимо назначить нового начальника!"

Или у вас новый начальник будет выбираться случайным образом? :-)
...
Рейтинг: 0 / 0
Взаимозависимые свойства
    #36679539
xarg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zenkИли у вас новый начальник будет выбираться случайным образом? :-)
Эх, не хотел вдаваться в подробности, просто на примере изложить, а получилось только хуже :) Да, в моем случае система должна сама выбирать «начальника» — запись с наибольшим emp_id для данного dep_id. Так что этот момент выносить в клиента нельзя.

Видимо, надо использовать триггер?

zenkПромежуточная таблица в дальнейшем позволит расширить функциональность, например, хранить период руководства отделом.
Что-то я никак не соображу, какой она должна быть. Подскажите, пожалуйста.

Спасибо за помощь!
...
Рейтинг: 0 / 0
Взаимозависимые свойства
    #36679737
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xargЧто-то я никак не соображу, какой она должна быть.
Как вариант...

Тип действияКодНазвание
Движение нач.отделовКодДатаКод сотрудникаКод действия
...
Рейтинг: 0 / 0
Взаимозависимые свойства
    #36679813
zenk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xarg,

Id, Dep_Id, Emp_Id, DBegin, DEnd

И повесить уникальные индексы на (Dep_Id, DBegin) - в каждый момент времени отдел может иметь не более 1 начальника;
и на (Emp_Id, DBegin) - в каждый момент времени сотрудник может руководить не боле чем 1 отделом.
...
Рейтинг: 0 / 0
Взаимозависимые свойства
    #36680314
xarg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa, zenk,

спасибо! Правда, появится лишняя функциональность, но она не помешает. Теперь уже сам разберусь :)
...
Рейтинг: 0 / 0
Взаимозависимые свойства
    #36680470
zenk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xarg,

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


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