首页 文章

SQL数据库设计用于多对多关系的统计分析

提问于
浏览
3

这是我第一次使用数据库,所以我花了很多时间阅读和观看视频 . 我正在分析的数据是一组有限的马拉松数据,目标是为每个跑步者提供统计数据 .

我正在寻找有关我的数据库设计的建议和建议,以及我如何制作统计数据 . 请参阅此图片以了解我提出的设计:

My Design

基本上,我认为Races和Runners之间存在多对多的关系:比赛中有多个跑步者,跑步者可以参加多场比赛 . 因此,我有一个名为Race_Results的桥牌表来存储给定赛跑者在给定比赛中的时间和年龄 .

统计表是我最终想要达到的目的 . 在图像中只是我可能想要计算的一些随机事物 .

所以我的问题是:

  • 这个设计有意义吗?你可以做些什么改进?

  • 将使用哪种SQL查询来计算这些统计信息?我是否必须在其间制作一些其他表格 - 例如,要找到跑步者在第一名的10分钟内完成的时间百分比,我是否必须首先为该比赛制作所有跑步者数据的表格然后做一些查询,还是有更好的方法?我应该查看有关计算这些统计数据的更多链接吗?

  • 我是否可能使用python或其他语言来获取这些统计信息而不是SQL?我的理解是SQL有可能将几百行的python代码减少到一行,所以我想我会试着用SQL来试一试 .

谢谢!

2 回答

  • 1

    我认为你的设计很好,虽然Race_Results.Age是多余的 - 注意你是否更新跑步者的DOB或比赛日期 .

    为每个统计信息创建视图应该相当容易 . 例如:

    CREATE VIEW Best_Times AS
    SELECT Race_ID, MIN(Time) AS Time,
    FROM Race_Results
    GROUP BY Race_ID;
    
    CREATE VIEW Within_10_Minutes AS
    SELECT rr.*
    FROM Race_Results rr
    JOIN Best_Times b
    ON rr.Race_ID = b.Race_ID AND rr.Time <= DATE_ADD(b.Time, INTERVAL 10 MINUTE);
    
    SELECT
        rr.Runner_ID,
        COUNT(*) AS Number_of_races,
        COUNT(w.Runner_ID) * 100 / COUNT(*) AS `% Within 10 minutes of 1st place`
    FROM Race_Results rr
    LEFT JOIN Within_10_Minutes w
    ON rr.Race_ID = w.Race_ID AND rr.Runner_ID = w.Runner_ID
    GROUP BY rr.Runner_ID
    
  • 1

    1)你的3个 table Races,Race_Results和Runners的设计非常有意义 . 这里没什么可改进的 . 统计数据有所不同 . 如果您设法以一种可以在视图中使用的方式编写那些可能稍微复杂的查询,那么您应该这样做并避免保存每天需要重新计算的统计信息 . 只要性能足够,只要需要,就可以在需要时即时计算这样的东西比保存它更好 .

    2)如果你将使用Oracle或MSSQL,我会说你可以使用一些聚合函数和公用表表达式 . 在MySQL中,您必须使用 group by 和子查询 . 使整个方法更复杂,但完全可行 . 如果您在评论中要求特定的指标,我可能会建议一些代码,尽管我的专业知识更多地在Oracle和MSSQL中 .

    3)如果可以,请将您的代码放入数据库中 . 这样,您就可以避免在编程语言和数据库之间频繁切换上下文 . 这种方法通常是所有数据库系统中最快的 .

相关问题