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

SQL Database design for statistical analysis of many-to-many relationship

这是我第一次使用数据库,所以我花了很多时间阅读和观看视频。我正在分析的数据是一组有限的马拉松数据,目标是对每个 运行ner.

进行统计

我正在寻找有关我的数据库设计以及如何生成统计数据的意见和建议。请查看此图片以了解我提出的设计:

基本上,我认为 Races 和 Runners 之间存在多对多关系:一场比赛中有多个 运行ners,一个 运行ner 可以有 运行 多种族。因此,我有一个名为 Race_Results 的桥 table 来存储给定比赛中给定 运行 选手的时间和年龄。

统计数据 table 是我最终想要得到的。图片中只是一些我可能想要计算的随机值。

所以我的问题是:

  1. 这样的设计有意义吗?您可以做出哪些改进?

  2. 将使用哪些类型的 SQL 查询来计算这些统计信息?我是否必须在两者之间做一些其他的 tables - 例如,要找到 运行ner 在第一名的 10 分钟内完成的时间百分比,我是否必须先做一个 table 那场比赛的所有 运行ner 数据,然后做一些查询,或者有更好的方法吗?我应该查看有关计算这些统计数据的更多链接吗?

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

谢谢!

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

2) 如果您要使用 Oracle 或 MSSQL,我会说您可以使用一些聚合函数和常见的 table 表达式。在 MySQL 中,您将不得不使用 group by 和子查询。使整个方法有点复杂,但完全可行。 如果您在评论中询问特定指标,我可能会建议一些代码,尽管我的专业知识更多的是 Oracle 和 MSSQL。

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

我认为你的设计很好,尽管 Race_Results.Age 是多余的 - 注意你是否更新了跑步者的出生日期或比赛日期。

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

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