|
|
|
Правильная связь между таблицами
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Я новичек в проектировании БД, поэтому вопрос, может, несколько странный. В прикидке базы более 20 таблиц, поэтому для меня очень важно сейчас грамотно построить связи, чтобы потом дров не наломать. Пример: Таблица 1: Таблица 2: Employees Contracts ---------------- --------------------- ID ID Employee_Name Salary Birthday Place ---------------- --------------------- Вопрос - как эти таблицы корректно связать - добавить в Employees поле Id_Contract или в Contracts Id_Employee? Начинал со второго варианта, однако, когда начал писать приложение наткнулся на подводные камни. К примеру, добавление контракта проходит отлично и без проблем, но в программе также нужно выбирать статистику по сотрудникам без контрактов (к примеру на испытательном сроке или любой другой пример). Здесь уже возникают трудности при выборке - как связать их тогда? Затем начал рассматривать первый вариант - в Employees поле Id_Contract. Здесь выборки не составят никаких проблем, но как мне добавить тогда контракт в таблицу контрактов, связав при добавлении с таблицей рабочих? Тогда нужно знать финальный ID, который получит добавленная запись. Можно, конечно, решить это извращенными способами, вроде добавления в отдельное, не используемое поле ID работника, чтобы потом по этому полю проставить ID контракта самому работнику после добавления в базу. Или если взять второй способ то по нажатию кнопки запускать бешеные циклы для добавления в таблицу контрактов всех, хоть и пустых записях о работниках. Однако, я уверен, что есть цивилизованные способы решения этого вопроса для грамотного проектирования БД, поэтому обращаюсь к вам за советом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2010, 14:42 |
|
||
|
Правильная связь между таблицами
|
|||
|---|---|---|---|
|
#18+
Alex IgОднако, я уверен, что есть цивилизованные способы решения этого вопроса для грамотного проектирования БД, поэтому обращаюсь к вам за советом. Есть способы грамотного проектирования БД, с которыми вам необходимо ознакомиться. Потом, постараться применить их на практике, т.е. спроектиовать БД. Потом писать программу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2010, 15:07 |
|
||
|
Правильная связь между таблицами
|
|||
|---|---|---|---|
|
#18+
baracs, да, занаю. Однако программа нужна очень срочно. "Наваять" я ее могу достаточно быстро, но работа с БД бужет ужасным зрелищем. Поэтому опубликовал свой вопрос здесь - как правильно на приведенном примере построить связь. Далее по подобной аналогии построю другие цепочки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2010, 15:11 |
|
||
|
Правильная связь между таблицами
|
|||
|---|---|---|---|
|
#18+
> вопрос, может, несколько странный Нормальный вопрос, не парьтесь. > как эти таблицы корректно связать - добавить в Employees поле Id_Contract или в Contracts Id_Employee? В букварях обычно приводится второй вариант. На практике используется третий. > Здесь уже возникают трудности при выборке - как связать их тогда? Здесь есть трудности другого рода. Но, если вы недавно начали проектировать, не заморачивайтесь, делайте, как пишут в учебниках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2010, 15:13 |
|
||
|
Правильная связь между таблицами
|
|||
|---|---|---|---|
|
#18+
У вас связь "один ко многим"? просто надо посмотреть в какую сторону "один", а в какую "многие" Например, если один сотрудник может иметь много контрактов (включая 0), то у таблицы контрактов нужно создать ссылочное поле на сотрудников. а выбрать сотрудников без контрактом можно например так Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2010, 15:17 |
|
||
|
Правильная связь между таблицами
|
|||
|---|---|---|---|
|
#18+
guest_20040621, спасибо большое! Naf, по плану у 1 сотрудника может быть либо один контракт, либо вообще контрактов не быть (более одного контракта быть не может). Если судить с этой строны то добавив Employees.Id_Contract мы соответствуем этому правилу, хотя второй способ выглядит несколько логичнее. По поводу запроса большое спасибо! Пробовал писать несколько по-другому - без JOIN. Вроде бы все связи проставлял, однако получал декатрово произведение. Если честно, то не совсем также понятно как может быть выполнено условие E.ID=C.Id_Employee, если такого соответствия в БД вообще нет - запись о работнике есть, а контракт отсутствует вообще ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2010, 15:25 |
|
||
|
Правильная связь между таблицами
|
|||
|---|---|---|---|
|
#18+
Alex IgЕсли честно, то не совсем также понятно как может быть выполнено условие E.ID=C.Id_Employee, если такого соответствия в БД вообще нет - запись о работнике есть, а контракт отсутствует вообще именно для этого и есть LEFT JOIN то есть даже если условие связи не выполняется, запись из левой таблицы все равно попадает в выборку, соответствующие поля правой таблицы - NULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2010, 15:27 |
|
||
|
Правильная связь между таблицами
|
|||
|---|---|---|---|
|
#18+
Naf, огромное спасибо! Теперь все четко встало на свои места! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2010, 15:30 |
|
||
|
Правильная связь между таблицами
|
|||
|---|---|---|---|
|
#18+
Naf Например, если один сотрудник может иметь много контрактов (включая 0), то у таблицы контрактов нужно создать ссылочное поле на сотрудников. а выбрать сотрудников без контрактом можно например так Код: plaintext 1. 2. 3. 4. Без left join это можно переписать примерно так: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2010, 15:42 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36425485&tid=1542878]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
195ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 537ms |

| 0 / 0 |
