请问有人可以为我提供有关此表格设置的建议。
这是第一次设计数据库。这将是其中的一部分。
它是一个报告编写应用程序。可以分配多位工程师参加任何工作/报告,多位工程师可以撰写报告和参加会议。
这是执行此操作的最佳方法。我将需要能够在应用程序中分别搜索参与者和作者。
非常感谢您的帮助。
答案 0 :(得分:0)
我相信您有两个包含实体的表。实体是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