MySQL - Советы по связыванию нескольких таблиц - это правильно? - PullRequest
0 голосов
/ 06 ноября 2018

Может, кто-нибудь не посоветует мне, пожалуйста, по поводу этой настройки стола.

Впервые проектирование базы данных. Это будет частью этого.

Это приложение для написания отчета. Несколько инженеров могут быть назначены для участия в любой работе / отчете, и несколько инженеров могут составлять отчет, а также посещать.

Это лучший способ сделать это. Мне нужно было бы искать участников и авторов отдельно в приложении.

Большое спасибо за помощь.

Link to table image

1 Ответ

0 голосов
/ 06 ноября 2018

Я полагаю, у вас есть две таблицы, содержащие сущности. Объектами являются employee и report.

Эти сущности имеют два разных отношения «многие ко многим»: author и attendee.

Итак, ваши столы такие

employee                report
--------                -----
employee_id (PK)        report_id (PK)
surname                 title
givenname               releasedate
whatever                whatever

Тогда у вас есть две многие: много таблиц отношений с одинаковыми столбцами друг с другом. Один - author, а другой - attendee.

author / attendee
------
employee_id PK, FK to employee.employee_id
report_id   PK, FK to report.report_id

Обратите внимание на составные (две колонки) первичные ключи.

+---------------------+\   /+-------------+\   /+-----------------------+
|                     +-----+   author    +-----+                       |
|                     |/   \+-------------+/   \|                       |
|    employee         |                         |     report            |
|                     |                         |                       |
|                     |\   /+-------------+\   /|                       |
|                     +-----+  attendee   +-----+                       |
+---------------------+/   \+-------------+/   \+-----------------------+


           \   /
           -----    means a many-to-many relationship
           /   \

Когда вы определяете, что сотрудник является участником определенного отчета, вы вставляете строку в таблицу участников с правильным сотрудником и отчетом.

Если вы хотите, например, всех авторов для каждого отчета, вы можете сделать следующее:

  SELECT r.title, r.releasedate, 
         GROUP_CONCAT(e.surname ORDER BY e.surname SEPARATED BY ',')surnames
    FROM report r
    LEFT JOIN author a ON r.report_id = a.report_id
    LEFT JOIN employee e ON a.report_id = e.report_id
   GROUP BY r.title, r.releasedate
   ORDER BY r.releasedate DESC

Операции LEFT JOIN позволяют вашему запросу найти отчеты без авторов. Обычные внутренние операции JOIN будут подавлять эти строки из вашего набора результатов.

Существует ограничение с этим строгим E: R дизайном. Для многих видов докладов (например, научных работ) порядок авторов является критически важным. (Вы хотите начать академическую борьбу за еду? Перечислите авторов статьи в неправильном порядке.)

Таким образом, ваша авторская таблица может также содержать порядковый номер.

author
------
employee_id PK, FK to employee.employee_id
report_id   PK, FK to report.report_id
ordinal     INT

, и ваш отчетный запрос будет содержать эту строку.

         GROUP_CONCAT(e.surname ORDER BY e.ordinal SEPARATED BY ',')surnames
...