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

Posted

技术标签:

【中文标题】MySQL - 链接多个表的建议 - 这是对的吗?【英文标题】:MySQL - Advice linking Multiple Tables - Is this right? 【发布时间】:2019-04-09 18:00:51 【问题描述】:

有人介意就这个表设置给我建议吗?

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

它是一个报告撰写应用程序。可以指派多名工程师参加任何工作/报告,并且多名工程师可以撰写报告并参加。

这是最好的方法吗?我需要能够在应用程序中分别搜索与会者和作者。

非常感谢您的帮助。

【问题讨论】:

您似乎有三个 Staff 表。您的设计是否需要三个单独的表格,或者您是否可以在一个表格中列出所有员工? 谢谢 O. Jones,好问题....我当然不想复制任何数据,但不确定如何在没有附加表格的情况下将多个作者和参与工程师分配给一份报告。自然我希望它尽可能高效,但不确定如何。在我的搜索中还没有发现类似这样的例子...... 听起来你正在尝试实现或将需要实现 SQL 表继承 ..***.com/questions/3579079/… .. 请注意链接已标记 sql server,但规则仍然适用于几乎每个 DBMS。 . 在 PostgreSQL 中你有一个更好的解决方案 PostgreSQL 支持开箱即用的本地表继承。 谢谢雷蒙德。我将调查这个选项。干杯马特 是的,您正在为继承/子类型化的情况使用常见的反模式。 PS嗨。请use text, not images/links, for text (including code, tables & ERDs)。使用链接/图像仅是为了方便补充文本和/或无法在文本中给出的内容。永远不要给出没有图例/键的图表。如果您有代表,请使用编辑功能内联,而不是链接 - 使您的帖子独立。 PS 这是一个常见问题解答,如果您在 Google 上搜索了许多关于您的问题/问题/目标的清晰、简洁、准确的措辞,您会找到答案。 【参考方案1】:

我相信,您有两个包含实体的表。实体是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

【讨论】:

非常感谢。我对连接过于熟悉,但想知道这里是否合适。非常感谢。我将消化然后实现这一点。谢谢 O. 琼斯。我已经代表你了,但我是新来的,所以可能不会出现。 不要忘记 GROUP_CONCAT 在默认安装/配置下的最大长度为 1024 个字符。因此,对于大型表或 GROUPS,这可能不会得到正确的结果。 谢谢雷蒙德。这个最大长度是指字符串中的连接值吗?或可搜索的连接行数或其他?

以上是关于MySQL - 链接多个表的建议 - 这是对的吗?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:多个表的注释

使用 MySQL 表加入 LibreOffice 基表的建议

mysql创建表的注意事项

mysql 1093错误

这是对多个链接列表进行排序的有效方法吗?

具有不同表的多个 MySQL 查询合二为一