关于这张table的布置,有人能给我提个建议吗。这是第一次设计数据库。这将是它的一部分。这是一份写报告的申请书。可以指派多个工程师参加任何工作/报告,多个工程师可以编写报告,也可以参加。这是最好的方法吗。我需要能够搜索与会者和作者分别在应用程序中。非常感谢你的帮助。
ezykj2lf1#
我相信,您有两个包含实体的表。实体是 employee 以及 report .这些实体具有两种不同的多对多关系: author 以及 attendee .你的table是这些
employee
report
author
attendee
employee report-------- -----employee_id (PK) report_id (PK)surname titlegivenname releasedatewhatever whatever
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_idreport_id PK, FK to report.report_id
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 / \
+---------------------+\ /+-------------+\ /+-----------------------+
| +-----+ 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
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设计有一个局限性。对于许多类型的报告(例如科学论文),作者的顺序至关重要(你想开始一场学术性的食物大战吗?按错误的顺序列出论文的作者。)所以您可以创建一个表,其中可能还包含一个序数值。
LEFT JOIN
JOIN
author------employee_id PK, FK to employee.employee_idreport_id PK, FK to report.report_idordinal INT
ordinal INT
您的报表查询将包含这一行。
GROUP_CONCAT(e.surname ORDER BY e.ordinal SEPARATED BY ',')surnames
1条答案
按热度按时间ezykj2lf1#
我相信,您有两个包含实体的表。实体是
employee
以及report
.这些实体具有两种不同的多对多关系:
author
以及attendee
.你的table是这些
那你有两个many:many relationship 彼此具有相同列的表。一个是
author
另一个是attendee
.请注意复合(两列)主键。
当您确定某个员工是某个报表的与会者时,可以在“与会者”表中插入一行,其中包含正确的员工和报表。
例如,如果希望每个报表的所有作者都可以这样做:
这个
LEFT JOIN
操作允许您的查询查找没有作者的报表。普通内胎JOIN
操作将从结果集中抑制这些行。这种严格的e:r设计有一个局限性。对于许多类型的报告(例如科学论文),作者的顺序至关重要(你想开始一场学术性的食物大战吗?按错误的顺序列出论文的作者。)
所以您可以创建一个表,其中可能还包含一个序数值。
您的报表查询将包含这一行。