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

Я новичек в проектировании БД, поэтому вопрос, может, несколько странный. В прикидке базы более 20 таблиц, поэтому для меня очень важно сейчас грамотно построить связи, чтобы потом дров не наломать.

Пример:

Таблица 1: Таблица 2:
Employees Contracts
---------------- ---------------------
ID ID
Employee_Name Salary
Birthday Place
---------------- ---------------------

Вопрос - как эти таблицы корректно связать - добавить в Employees поле Id_Contract или в Contracts Id_Employee?

Начинал со второго варианта, однако, когда начал писать приложение наткнулся на подводные камни. К примеру, добавление контракта проходит отлично и без проблем, но в программе также нужно выбирать статистику по сотрудникам без контрактов (к примеру на испытательном сроке или любой другой пример). Здесь уже возникают трудности при выборке - как связать их тогда?

Затем начал рассматривать первый вариант - в Employees поле Id_Contract. Здесь выборки не составят никаких проблем, но как мне добавить тогда контракт в таблицу контрактов, связав при добавлении с таблицей рабочих? Тогда нужно знать финальный ID, который получит добавленная запись.

Можно, конечно, решить это извращенными способами, вроде добавления в отдельное, не используемое поле ID работника, чтобы потом по этому полю проставить ID контракта самому работнику после добавления в базу. Или если взять второй способ то по нажатию кнопки запускать бешеные циклы для добавления в таблицу контрактов всех, хоть и пустых записях о работниках.

Однако, я уверен, что есть цивилизованные способы решения этого вопроса для грамотного проектирования БД, поэтому обращаюсь к вам за советом.
...
Рейтинг: 0 / 0
Правильная связь между таблицами
    #36425466
baracs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex IgОднако, я уверен, что есть цивилизованные способы решения этого вопроса для грамотного проектирования БД, поэтому обращаюсь к вам за советом.
Есть способы грамотного проектирования БД, с которыми вам необходимо ознакомиться.
Потом, постараться применить их на практике, т.е. спроектиовать БД.
Потом писать программу.
...
Рейтинг: 0 / 0
Правильная связь между таблицами
    #36425478
Alex Ig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
baracs, да, занаю.

Однако программа нужна очень срочно. "Наваять" я ее могу достаточно быстро, но работа с БД бужет ужасным зрелищем.

Поэтому опубликовал свой вопрос здесь - как правильно на приведенном примере построить связь. Далее по подобной аналогии построю другие цепочки
...
Рейтинг: 0 / 0
Правильная связь между таблицами
    #36425485
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> вопрос, может, несколько странный

Нормальный вопрос, не парьтесь.

> как эти таблицы корректно связать - добавить в Employees поле Id_Contract или в Contracts Id_Employee?

В букварях обычно приводится второй вариант. На практике используется третий.

> Здесь уже возникают трудности при выборке - как связать их тогда?

Здесь есть трудности другого рода. Но, если вы недавно начали проектировать, не заморачивайтесь, делайте, как пишут в учебниках.
...
Рейтинг: 0 / 0
Правильная связь между таблицами
    #36425498
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас связь "один ко многим"? просто надо посмотреть в какую сторону "один", а в какую "многие"
Например, если один сотрудник может иметь много контрактов (включая 0), то у таблицы контрактов нужно создать ссылочное поле на сотрудников.
а выбрать сотрудников без контрактом можно например так
Код: plaintext
1.
2.
3.
4.
select E.ID,E.Employee_Name
from Employees as E
left join Contracts as C on (E.ID=C.Id_Employee)
where C.Id_Employee is null
С уважением, Naf
...
Рейтинг: 0 / 0
Правильная связь между таблицами
    #36425528
Alex Ig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_20040621, спасибо большое!

Naf, по плану у 1 сотрудника может быть либо один контракт, либо вообще контрактов не быть (более одного контракта быть не может).

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

По поводу запроса большое спасибо! Пробовал писать несколько по-другому - без JOIN. Вроде бы все связи проставлял, однако получал декатрово произведение. Если честно, то не совсем также понятно как может быть выполнено условие E.ID=C.Id_Employee, если такого соответствия в БД вообще нет - запись о работнике есть, а контракт отсутствует вообще
...
Рейтинг: 0 / 0
Правильная связь между таблицами
    #36425537
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex IgЕсли честно, то не совсем также понятно как может быть выполнено условие E.ID=C.Id_Employee, если такого соответствия в БД вообще нет - запись о работнике есть, а контракт отсутствует вообще именно для этого и есть LEFT JOIN
то есть даже если условие связи не выполняется, запись из левой таблицы все равно попадает в выборку, соответствующие поля правой таблицы - NULL
...
Рейтинг: 0 / 0
Правильная связь между таблицами
    #36425552
Alex Ig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Naf, огромное спасибо! Теперь все четко встало на свои места!
...
Рейтинг: 0 / 0
Правильная связь между таблицами
    #36425601
Naf
Например, если один сотрудник может иметь много контрактов (включая 0), то у таблицы контрактов нужно создать ссылочное поле на сотрудников.
а выбрать сотрудников без контрактом можно например так
Код: plaintext
1.
2.
3.
4.
select E.ID,E.Employee_Name
from Employees as E
left join Contracts as C on (E.ID=C.Id_Employee)
where C.Id_Employee is null
С уважением, Naf

Без left join это можно переписать примерно так:
Код: plaintext
1.
2.
3.
select E.ID,E.Employee_Name
from Employees as E
where not exists(select C.Id_Employee from Contracts as C where E.ID=C.Id_Employee)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Правильная связь между таблицами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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