我设计了数据库,并具有3个表:
1)Authors
表具有ID,名称,姓氏和Paper_ID。
名字和姓氏组合是唯一的。
2)Topics
表具有TopicName,SOTAResult和Paper_ID。
TopicName,SOTAResult是唯一的。
3)Papers
表具有标题(唯一),结果,摘要。
我之所以这样设计,是因为一篇论文有多个作者和多个主题,但只有一个结果。 我的问题是,我想将论文表中结果列的最大值分配给主题表中SOTAResult列。 更明确地说,SOTAResult应该是一个主题的论文结果的最大值。 我也想知道我是否根据自己的需要正确构建了该数据库,还是应该专门更改某些内容?
答案 0 :(得分:0)
您希望作者与论文之间保持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;
答案 1 :(得分:0)
我将添加一个PapersAuthors表,以方便具有多个Papers的Author。我将添加一个TopicsPapers表,以便一个主题可以包含多个论文,并且一个论文可以位于多个主题中。如果一篇论文不应该包含在多个主题中,那么就没有TopicsPapers并将topic_id放在Papers中。
我不确定我是否理解您要使用SOTAResult实现的目标,但是我相信您想找到某个主题的“最佳论文”。在这种情况下,将SOTAResult移到Papers并使用“限制1子查询”找到它:
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;