“Рассмотрим следующую реляционную схему. Сотрудник может работать более чем в одном отделе;”
В этой статье блога мы рассмотрим различные методы работы с реляционной схемой, в которой сотрудник может работать в нескольких отделах. Мы предоставим примеры кода для каждого метода, чтобы помочь вам понять и реализовать решение в ваших собственных проектах. Давайте погрузимся!
Метод 1: связь «один-ко-многим» с использованием соединительной таблицы
Одним из распространенных подходов к решению этого сценария является использование соединительной таблицы. Соединительная таблица действует как промежуточное звено между таблицами сотрудников и отделов, позволяя представить связь «многие-ко-многим» как две связи «один-ко-многим».
Вот пример того, как будет выглядеть схема:
Employee Table:
+----+-----------+
| ID | Name |
+----+-----------+
| 1 | John Doe |
| 2 | Jane Smith|
+----+-----------+
Department Table:
+----+--------------+
| ID | Department |
+----+--------------+
| 1 | Sales |
| 2 | Marketing |
| 3 | Engineering |
+----+--------------+
Employee_Department Table:
+----+-------------+------------+
| ID | Employee_ID | Department_ID |
+----+-------------+------------+
| 1 | 1 | 1 |
| 2 | 1 | 3 |
| 3 | 2 | 2 |
| 4 | 2 | 3 |
+----+-------------+------------+
Используя эту соединительную таблицу, сотрудник может быть связан с несколькими отделами, а в отделе может быть несколько сотрудников.
Метод 2: массив или столбец JSON
Другой подход — использовать массив или столбец JSON для хранения нескольких идентификаторов отделов непосредственно в таблице сотрудников. Этот метод подходит, когда количество отделов, в которых может работать сотрудник, относительно невелико и не меняется часто.
Вот пример использования столбца массива:
Employee Table:
+----+-----------+------------------+
| ID | Name | Departments |
+----+-----------+------------------+
| 1 | John Doe | [1, 3] |
| 2 | Jane Smith| [2, 3] |
+----+-----------+------------------+
Department Table:
+----+--------------+
| ID | Department |
+----+--------------+
| 1 | Sales |
| 2 | Marketing |
| 3 | Engineering |
+----+--------------+
В этом примере в столбце «Отделы» таблицы сотрудников хранится массив идентификаторов отделов, с которыми связан сотрудник.
Метод 3: значения, разделенные запятыми (CSV)
Простой метод — использовать столбец значений, разделенных запятыми (CSV), для хранения идентификаторов отделов в виде строки в таблице сотрудников. Этот метод прост, но может потребовать дополнительного анализа при запросе данных.
Вот пример использования столбца CSV:
Employee Table:
+----+-----------+------------------+
| ID | Name | Departments |
+----+-----------+------------------+
| 1 | John Doe | 1,3 |
| 2 | Jane Smith| 2,3 |
+----+-----------+------------------+
Department Table:
+----+--------------+
| ID | Department |
+----+--------------+
| 1 | Sales |
| 2 | Marketing |
| 3 | Engineering |
+----+--------------+
В этом примере в столбце «Отделы» таблицы сотрудников хранятся идентификаторы отделов в виде строки, разделенной запятыми.
Метод 4: отдельная таблица для каждого сотрудника
При таком подходе вы можете создать отдельную таблицу для каждого сотрудника для хранения связанных с ним отделов. Каждая таблица будет иметь отношение один ко многим с таблицей отдела.
Вот пример с отдельными таблицами для двух сотрудников:
Employee_1 Table:
+----+-------------+
| ID | Department |
+----+-------------+
| 1 | Sales |
| 2 | Engineering |
+----+-------------+
Employee_2 Table:
+----+-------------+
| ID | Department |
+----+-------------+
| 1 | Marketing |
| 2 | Engineering |
+----+-------------+
Department Table:
+----+--------------+
| ID | Department |
+----+--------------+
| 1 | Sales |
| 2 | Marketing |
| 3 | Engineering |
+----+--------------+
У каждого сотрудника своя таблица, а таблица отдела остается неизменной.