mysql-链接多个表的建议-是这样吗?

9vw9lbht  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(321)

关于这张table的布置,有人能给我提个建议吗。
这是第一次设计数据库。这将是它的一部分。
这是一份写报告的申请书。可以指派多个工程师参加任何工作/报告,多个工程师可以编写报告,也可以参加。
这是最好的方法吗。我需要能够搜索与会者和作者分别在应用程序中。
非常感谢你的帮助。

nbysray5

nbysray51#

我相信,您有两个包含实体的表。实体是 employee 以及 report .
这些实体具有两种不同的多对多关系: author 以及 attendee .
你的table是这些

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

那你有两个many:many relationship 彼此具有相同列的表。一个是 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

相关问题