powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Вопрос по структуре
12 сообщений из 12, страница 1 из 1
Вопрос по структуре
    #39207651
glaz99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Никак не могу победить следующую проблему.

Схема такая:
в компании работают сотрудники (t_employees)
Компания выполняет разные проекты (t_projects)
Для выполнения каждого проекта набирается проектная команда со своим куратором, координатором, и т.п. (t_projteams)
Для каждого проекта формируются задачи (этапы) выполнения (t_tasks)
На выполнение каждой из этих задач выделяются один или более сотрудников из сформированной проектной команды (t_empltasks)
Сотрудники выполняют работы в рамках этих заданий (t_work)

Проблема возникает на этапе выбора сотрудников для выполнения поставленных задач. Нужно, чтобы была возможность выбирать сотрудников только из сформированной по данному проекту команды, а данная схема дает возможность выбора вообще любого сотрудника.
Понимаю что ошибка где-то рядом с (t_employees - t_empltasks), но если вместо связи (t_employees - t_empltasks) создать связь (t_projteams - t_empltasks), то опять же получится какая-то ерунда, т.к. в таблице t_projteams есть записи одних и тех же сотрудников от разных проектов.

Может есть какие-то стандартные решения подобных проблем?

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
Вопрос по структуре
    #39207904
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>т.к. в таблице t_projteams есть записи одних и тех же сотрудников от разных проектов.
но пара сотрудник-проект, выбранная вами как первичный ключ уникальна. Ссылайтесь на нее в таблице t_empltasks.
Код: sql
1.
2.
3.
4.
5.
create table t_employees (id_emp int primary key, empname varchar(100))
create table t_projects (id_proj int primary key, projname varchar(100))
create table t_task (id_task int primary key, id_proj int references t_projects, projname varchar(100))
create table t_projteams (id_proj int not null references t_projects, id_emp int not null references t_employees, is_curator bit, is_coordinarot bit, is_archivist bit primary key (id_proj, id_emp))
create table t_empltasks (id_proj int references t_projects, id_emp int references t_employees, primary key (id_proj, id_emp), foreign key (id_proj, id_emp) references t_projteams)


>Может есть какие-то стандартные решения подобных проблем?
Вам будет легче если для таблицы t_projteams вместо составного первичного ключа вы введете суррогатный id_t_projteams. Тогда t_empltasks может на него ссылаться.
Код: sql
1.
2.
create table t_projteams (id_t_projteams int primary key, id_proj int not null references t_projects, id_emp int not null references t_employees, is_curator bit, is_coordinarot bit, is_archivist bit)
create table t_empltasks (id_t_projteams int primary key references t_projteams)
...
Рейтинг: 0 / 0
Вопрос по структуре
    #39207907
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
упс.
я пропустил поле id_task в таблице t_empltasks
...
Рейтинг: 0 / 0
Вопрос по структуре
    #39208411
glaz99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257>т.к. в таблице t_projteams есть записи одних и тех же сотрудников от разных проектов.
но пара сотрудник-проект, выбранная вами как первичный ключ уникальна. Ссылайтесь на нее в таблице t_empltasks.

Да, спасибо, это кажется ближе к тому, что требуется.
Правда, здесь выпадает таблица t_tasks, а нужно, чтобы записи в t_empltasks также ссылались на t_tasks.
Суть в том, что сначала задачи проекта создаются безотносительно к сотрудникам проектной команды и заносятся в t_tasks, а потом уже распределяются - кому что выполнять. Может еще одну связь добавить (t_tasks - t_empltasks)?

И еще вопрос. Я давно не работал с MSSQL, много уже успел забыть, например в чем разница указания references просто в описании столбца
(link_prj int references t_projects) от того, когда мы его ставим в описании внешнего ключа
(foreign key (link_prj, link_emp) references t_projteams)?
Спасибо.
...
Рейтинг: 0 / 0
Вопрос по структуре
    #39208557
glaz99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257>т.к. в таблице t_projteams есть записи одних и тех же сотрудников от разных проектов.
но пара сотрудник-проект, выбранная вами как первичный ключ уникальна. Ссылайтесь на нее в таблице t_empltasks.
Код: sql
1.
create table t_empltasks (id_proj int references t_projects, id_emp int references t_employees, primary key (id_proj, id_emp), foreign key (id_proj, id_emp) references t_projteams)




Не, все равно не понимаю. Вот даже здесь (запишу более наглядно):
Код: sql
1.
2.
3.
4.
5.
6.
7.
create table t_empltasks 
(
link_prj int references t_projects, 
link_emp int references t_employees, 
primary key (link_prj, link_emp), 
foreign key (link_prj, link_emp) references t_projteams
)


Какой смысл ссылаться на t_projects и t_employees? Почему нельзя привязать только к t_projteams?
То есть зачем первые два references - ведь в t_projteams уже есть уникальные пары сотрудник-проект.
И как правильно привязать t_tasks? Что-то окончательно запутался.
...
Рейтинг: 0 / 0
Вопрос по структуре
    #39208612
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Какой смысл ссылаться на t_projects и t_employees? Почему нельзя привязать только к t_projteams?
Ну не ссылайтесь, кто же неволит.В варианте 2 (с суррогатным id_t_projteams) этого как раз нет

>И как правильно привязать t_tasks?
Код: sql
1.
2.
3.
4.
5.
-- вариант с составным  primary key
create table t_empltasks (id_proj int, id_emp int, id_task int references t_task
 primary key (id_proj, id_emp, id_task), foreign key (id_proj, id_emp) references t_projteams)
-- вариант с суррогатными  primary key
create table t_empltasks (id_t_projteams int references t_projteams, id_task int references t_task primary key (id_t_projteams, id_task))



>например в чем разница указания references просто в описании столбца от того, когда мы его ставим в описании внешнего ключа
Для составного fk его нельзя указать в references просто в описании столбца
...
Рейтинг: 0 / 0
Вопрос по структуре
    #39208736
glaz99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257, Спасибо!

Вот вроде совсем близко, но смущает одна деталь - при данной связи ничто не мешает например добавить в таблицу t_empltasks строку, в которой id_proj и id_emp относятся к одному проекту, а id_task относится к другому проекту.
Мне кажется, дело в том, что идентификатор проекта id_prj "распараллеливается" по двум независимым направлениям (таблицам -t_tasks и t_projteams). А строки в t_empltasks могут ссылаться на проект "с двух сторон".
Не будет ли правильнее например вместо:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table 
t_empltasks 
(
	id_proj  int, 
	id_emp 	int, 
	id_task  int references t_task
 	primary key (id_proj, id_emp, id_task), 
	foreign key (id_proj, id_emp) references t_projteams
)


сделать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table 
t_empltasks 
(
	id_proj int, 
	id_emp 	int, 
	id_task  int
 	primary key (id_proj, id_emp, id_task), 
	foreign key (id_proj, id_emp) references t_projteams
	foreign key (id_proj, id_task) references t_tasks
)



То есть id_proj будет частью внешних ключей с каждой стороны?
...
Рейтинг: 0 / 0
Вопрос по структуре
    #39208740
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда уж переопределите определение первичного ключа в t_tasks как id_proj, id_task
...
Рейтинг: 0 / 0
Вопрос по структуре
    #39208743
glaz99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257Тогда уж переопределите определение первичного ключа в t_tasks как id_proj, id_task
Точно!
В результате, после некоторых переименований, получилась такая структура.
...
Рейтинг: 0 / 0
Вопрос по структуре
    #39210867
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glaz99,
твой вопрос вовсе не обязан решаться средствами структуры бд.
Можно решать это правилами редактирования данных, триггерами или процедурами.

это называется бизнес логика и она не обязана быть реализована именно в структуре бд.
...
Рейтинг: 0 / 0
Вопрос по структуре
    #39210875
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glaz99,
тебе достаточно сделать ссылку в empltask не на employee, а на project team. двумя полями.
...
Рейтинг: 0 / 0
Вопрос по структуре
    #39211084
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glaz99
И еще вопрос. Я давно не работал с MSSQL, много уже успел забыть, например в чем разница указания references просто в описании столбца
(link_prj int references t_projects) от того, когда мы его ставим в описании внешнего ключа
(foreign key (link_prj, link_emp) references t_projteams)?
Спасибо.


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


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