【问题标题】:SQL Database - Taking one columns max value for another table columnSQL 数据库 - 将一个列的最大值用于另一个表列
【发布时间】:2019-09-15 16:41:38
【问题描述】:

我设计我的数据库并有 3 个表:

1) Authors 表有 ID、Name、Surname 和 Paper_ID。 姓名和姓氏组合是唯一的。

2) Topics 表具有 TopicName、SOTAResult 和 Paper_ID。 TopicName、SOTAResult 是唯一的。

3) Papers 表有 Title(unique)、Result、Abstract。

我是这样设计的,因为一篇论文有多个作者和多个主题,但只有一个结果。 我的问题是,我想将 Papers 表中 results 列的最大值分配给 Topics 表中的 SOTAResult 列。 更清楚地说,SOTAResult 应该是一个主题的论文结果的最大值。 我也想知道我是否根据需要正确构建了这个数据库,还是应该专门更改一些内容。

【问题讨论】:

  • 我预计在 Authors 中包含 paper_id 会导致问题,尤其是因为姓名和姓氏组合是唯一的——这意味着作者只能拥有一篇论文。同样可能适用于主题。考虑为 paper_author 和 Paper_topics 添加联结表。
  • 应该如何处理 Authors-Papers 一对多的关系?
  • authors 表中删除paper_id,因为作者不只有一篇论文。而是将author_id 添加到papers 表中,因为每篇论文都属于一个作者,或者我理解这一点。但是主题与作者和论文有什么关系呢?是否应该与论文存在 m:n 关系,例如主题是“数学”、“物理”和“化学”,论文 #1 处理“数学”和“物理”,而论文 #2 处理“物理”和“化学”?
  • one-to_many 表也是 many_to_one 表,具体取决于您如何使用它。顺便说一句,我认为这个数据库主要是关于论文及其属性的,你的观点可能是它是关于作者和他们所做的事情,这会影响设计方法。
  • 是的,你完全正确!我应该寻找作者-论文和论文-主题关系的多对多关系。这种关系假设有论文 p1、p2 和 p3。还有作者 a1,a2,a3 和 a1 写 p1; a2 写入 p1,p3; a3 写入 p2,p3。此外还有主题 t1,t2,t3 和 p1 有主题 t1,t3; p2 有 t2,t3; p3 有 t1,t2,t3。此外,每篇论文只有 1 个结果(整数)。这个结果应该转移到本文的所有主题中,以便可以找到该主题的 SOTAResult。 t1 有 SOTA1,t2 有 SOTA2 等等。

标签: mysql database-design groupwise-maximum


【解决方案1】:

我会添加一个 PapersAuthors 表以方便拥有多篇论文的作者。我会添加一个 TopicsPapers 表,这样一个主题可以有多篇论文,一篇论文可以包含多个主题。如果一篇论文不应该出现在多个主题中,那么就没有 TopicsPapers 并在 Papers 中放置一个 topic_id。

我不确定我是否理解您想要通过 SOTAResult 实现的目标,但我相信您希望找到某个主题的“最佳论文”。在这种情况下,将 SOTAResult 移动到 Papers 并使用“limit 1 subquery”找到它:

SELECT t.*, (SELECT paper_id FROM Papers AS tp WHERE tp.topic_id=t.topic_id ORDER BY SOTAResult DESC LIMIT 1) AS top_paper FROM Topics AS t;

【讨论】:

  • 是的,我想展示最好的论文,但我必须将 SOTA 值保存在我的数据库中。 SOTA 是特定主题论文中所有结果的最高值。您建议将列 SOTAResult 添加到 Papers 但在这种情况下,我认为 Topic 不会有 SOTA 属性。
  • 这是否意味着 SOTAResult 列实际上是 SOTA 并且您需要 TopicsPapers 并在其中包含 SOTA 以便不同的论文可以针对不同的主题有不同的 SOTA?如果是这样,我会重写我的答案。
【解决方案2】:

您需要作者和论文之间的 m:n 关系:一位作者可以写多篇论文,而一篇论文可以由多位作者撰写。您可以通过桥接表实现此目的:

  • author (author_id, first_name, last_name, ...) first_name + last_name 具有唯一约束,主键是author_id
  • paper (paper_id, title, result, ...) tiltle 具有唯一约束,主键是paper_id
  • author_paper (author_id, paper_id) author_id + paper_id 具有唯一约束

您还需要论文和主题之间的 m:n 关系:

  • topic (topic_id, name, ...) name 具有唯一约束,主键是topic_id
  • paper_topic (paper_id, topic_id) paper_id + topic_id 具有唯一约束

您不会冗余地存储结果。如果您想知道某个主题达到的最大结果,请使用连接选择此选项,例如:

select t.name as topic_name, max(p.result) as max_result
from paper_topic pt
join paper p using (paper_id)
join topic t using (topic_id)
group by t.name
order by t.name;

【讨论】:

  • 非常详细和出色的设计。我想知道如何在主题表中插入新值?您是否有一个名为 sota 的列,或者您从 select 语句中获得它?
  • 如前所述,您不应该冗余存储数据。如果一个主题的 sota 是其所有论文的最大结果,那么只需选择它。它已经在数据库中(在纸表中),所以您所要做的就是选择它,如图所示。因此,插入一个新主题就是:插入主题表。然后你可以添加一些纸(在纸桌上插入)。然后你可以关联论文和主题(插入到 paper_topic 表中)。如果你想知道主题的sota,你可以通过加入表格来选择它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 2022-01-24
  • 2020-11-03
  • 2017-11-13
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
相关资源
最近更新 更多