ERD-инструменты великолепны, но самым мощным инструментом дизайна по-прежнему являются естественный язык, предикаты и ограничения. Поэтому, если есть сомнения, используйте простой текстовый редактор вместо инструмента ERD. Также не допускайте значения NULL на этапе проектирования.
All attributes (columns) NOT NULL
[p x] = predicate x
(c x.y) = constraint x.y
PK = Primary Key
AK = Alternate Key (Unique)
FK = Foreign Key
Начиная с отдела, эта часть не меняется.
[p 1] Отдел идентифицируется номером DEPT_ID
, имя DEPT_NAME
существует.
(c 1.1) Отдел идентифицируется по номеру отдела.
(c 1.2) Для каждого названия отдела такое название имеет только один отдел; для каждого отдела у этого отдела есть только одно имя.
department {DEPT_ID, DEPT_NAME} -- p 1
PK {DEPT_ID} -- c 1.1
AK {DEPT_NAME} -- c 1.2
Случай 1: Emp * ---- 1
Отдел
[p 2] Сотрудник, указанный номер EMP_ID
с именем EMP_NAME
, работает в отделе DEPT_ID
.
(c 2.1) Сотрудник идентифицируется по номеру сотрудника.
(c 2.2) У каждого сотрудника есть только одно имя; для каждого имени сотрудника это имя может иметь более одного сотрудника.
(c 2.3) Каждый сотрудник работает в ровно в одном отделе; для каждого отдела более одного сотрудника могут работать для этого отдела.
(c 2.4) Если сотрудник работает в отделе тогда этот отдел должен существовать.
employee {EMP_ID, EMP_NAME, DEPT_ID} -- p 2
PK {EMP_ID} -- c 2.1, c 2.2, c 2.3
FK {DEPT_ID} REFERENCES department {DEPT_ID} -- c 2.4
Случай 2: Emp * ---- 0..1
Отдел
[p 2] Сотрудник, идентифицированный по номеру EMP_ID
с именем EMP_NAME
существует.
(c 2.1) Сотрудник идентифицируется по номеру сотрудника.
(c 2.2) Каждый сотрудник имеет ровно одно имя; для каждого имени сотрудника это имя может иметь более одного сотрудника.
[p 3] Сотрудник, указанный по номеру EMP_ID
, работает в отделе, указанном по номеру DEPT_ID
.
(c 3.1) Каждый сотрудник работает в не более чем в одном отделе; для каждого отдела более одного сотрудника могут работать в этом отделе.
(c 3.2) Если сотрудник работает в отделе , тогда этот сотрудник должен существовать.
(c 3.3) Если сотрудник работает в отделе, то этот отдел должен существовать.
employee {EMP_ID, EMP_NAME} -- p 2
PK {EMP_ID} -- c 2.1, c 2.2
emp_dept {EMP_ID, DEPT_ID} -- p 3
PK {EMP_ID} -- c 3.1
FK1 {EMP_ID} REFERENCES employee {EMP_ID} -- c 3.2
FK2 {DEPT_ID} REFERENCES department {DEPT_ID} -- c 3.3
Случай 3: Emp * ---- *
Отдел
[p 2] Сотрудник, идентифицированный по номеру EMP_ID
с именем EMP_NAME
, существует.
( c 2.1) Сотрудник идентифицируется по номеру сотрудника.
(c 2.2) У каждого сотрудника есть только одно имя; для каждого имени сотрудника это имя может иметь более одного сотрудника.
[p 3] Сотрудник, обозначенный номером EMP_ID
, работает в отделе, обозначенном номером DEPT_ID
.
(c 3.1) Каждый сотрудник может работать в более чем в одном отделе; для каждого отдела более одного сотрудника могут работать в этом отделе.
(c 3.2) Если сотрудник работает в отделе , тогда этот сотрудник должен существовать.
(c 3.3) Если сотрудник работает в отделе, то этот отдел должен существовать.
employee {EMP_ID, EMP_NAME} -- p 2
PK {EMP_ID} -- c 2.1, c 2.2
emp_dept {EMP_ID, DEPT_ID} -- p 3
PK {EMP_ID, DEPT_ID} -- c 3.1
FK1 {EMP_ID} REFERENCES employee {EMP_ID} -- c 3.2
FK2 {DEPT_ID} REFERENCES department {DEPT_ID} -- c 3.3
Случай 4: Emp * ---- 1..*
Отдел
Этот хитрый, объедините случаи 1 и 3, введя концепцию домашнего (основного, по умолчанию) отдела.
[p 2] Сотрудник, идентифицированный по номеру EMP_ID
, названный EMP_NAME
, работает в домашнем отделе HOME_DEPT_ID
.
(c 2.1) Сотрудник идентифицирован по номеру сотрудника .
(c 2.2) Каждый сотрудник имеет только одно имя; для каждого имени сотрудника это имя может иметь более одного сотрудника.
(c 2.3) Каждый сотрудник работает только на один домашний отдел; для каждого домашнего отдела в этом домашнем отделе может работать более одного сотрудника.
(c 2.4) Если сотрудник работает в домашнем отделе, то этот отдел должен существовать.
[p 3] Помимо домашнего отдела, сотрудник, идентифицированный по номеру EMP_ID
, также работает в другом отделе, указанном по номеру DEPT_ID
.
(c 3.1) В дополнение к домашнему отделу, каждый сотрудник может работать на в более чем одном другом отделе; для каждого отдела более одного сотрудника могут работать для этого отдела.
(c 3.2) Если сотрудник работает в отделе , тогда этот сотрудник должен существовать.
(c 3.3) Если сотрудник работает в отделе, то этот отдел должен существовать.
employee {EMP_ID, EMP_NAME, HOME_DEPT_ID} -- p 2
PK {EMP_ID} -- c 2.1, c 2.2, c 2.3
FK {HOME_DEPT_ID} REFERENCES department {DEPT_ID} -- c 2.4
emp_dept {EMP_ID, DEPT_ID} -- p 3
PK {EMP_ID, DEPT_ID} -- c 3.1
FK1 {EMP_ID} REFERENCES employee {EMP_ID} -- c 3.2
FK2 {DEPT_ID} REFERENCES department {DEPT_ID} -- c 3.3
На проверьте уровень приложения, что для данного сотрудника HOME_DEPT_ID
не повторяется как EMP_ID
в emp_dept
.