Как мы даем ограничение на столбец внешнего ключа на основе количества элементов ERD? - PullRequest
1 голос
/ 16 февраля 2020

Допустим, у меня есть 2 таблицы, как показано ниже:

Отдел :

DeptId   Name

Сотрудник :

EmpId  Name    DeptId

Здесь у меня есть отношение 0-ко-многим между Department и Employee таблицей.

Теперь, когда я читаю отношение от Department до Employee, оно говорит, что 1 отдел может иметь 0 или более сотрудников.

Означает ли это, что при создании таблицы Employee я установлю DepartmentId (внешний ключ) как ноль из-за нуля или множества связей?

И как мы представляют 1 или многие отношения, например, например, если в ERD говорится, что в 1 отделе может быть 0 или более сотрудников, то DepartmentId (внешний ключ) будет не обнуляться в таблице Employee?

В основном я просто пытаюсь чтобы понять, как мы устанавливаем ограничение на внешний ключ на основе кардинальности ERD (отношение 1 ко многим, отношение 1 к нулю или более).

Может кто-нибудь помочь мне устранить эту путаницу? Я действительно очень ценю это:)

ERD

Ответы [ 3 ]

1 голос
/ 17 февраля 2020

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.

1 голос
/ 16 февраля 2020

Я установлю DepartmentId (внешний ключ) как ноль из-за нуля или множества отношений?

Нет , Foreign key должно быть не нулевым. Представьте, что в таблице нет сотрудника Сотрудник с DeptId = 1. Таким образом, это означает, что Департамент имеет нулевые отношения.

В противном случае таблица Employee содержит несколько элементов с DeptId = 2, поэтому она представляет отношения 1-n между Department и Employee таблицей.

0 голосов
/ 13 марта 2020

Это не будет нулевым, потому что у каждого сотрудника есть отдел. В отделе может быть ноль сотрудников, то есть его идентификатор не указан ни в одной из строк сотрудников.

...