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

标签 mysql sql database database-design many-to-many

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

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

My Design

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

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

所以我的问题是:

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

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

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

谢谢!

最佳答案

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

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

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

关于mysql - 用于多对多关系统计分析的SQL数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31809259/

相关文章:

mysql - MySQL UTF8 排序规则是否适合日文和韩文字符?

javascript - 从 mysql 中提取数据并在 javascript 中使用它们

不同数据库上的 SQL 删除索引

database - 在数据库中存储国际地址的 "best"方式是什么?

java - Android 应用程序带有数据库以便人们可以共享数据?

php - 如何使用 commit() 查找记录插入到 mysql

sql - LEFT JOIN 子查询表参数是否被多次评估?

MySQL 存储过程不适用于 SELECT(基本问题)

php - MySQL更新特定列

mysql - 动态添加mysql表列