MySQL-链接多个表的建议-对吗?

时间:2018-11-06 10:43:35

标签: mysql database join entity-relationship jointable

请问有人可以为我提供有关此表格设置的建议。

这是第一次设计数据库。这将是其中的一部分。

它是一个报告编写应用程序。可以分配多位工程师参加任何工作/报告,多位工程师可以撰写报告和参加会议。

这是执行此操作的最佳方法。我将需要能够在应用程序中分别搜索参与者和作者。

非常感谢您的帮助。

Link to table image

1 个答案:

答案 0 :(得分:0)

我相信您有两个包含实体的表。实体是employeereport

这些实体具有两种不同的多对多关系:authorattendee

所以你的桌子就是这些

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