簡體   English   中英

SQL數據庫設計用於統計分析多對多關系

[英]SQL Database design for statistical analysis of many-to-many relationship

這是我第一次使用數據庫,所以我花了很多時間閱讀和觀看視頻。 我正在分析的數據是一組有限的馬拉松數據,目標是為每個跑步者提供統計數據。

我正在尋找有關我的數據庫設計的建議和建議,以及我如何制作統計數據。 請參閱此圖片以了解我提出的設計:

我的設計

基本上,我認為Races和Runners之間存在多對多關系:一場比賽中有多名參賽者,跑步者可以參加多場比賽。 因此,我有一個名為Race_Results的橋牌表來存儲給定賽跑者在特定比賽中的時間和年齡。

統計表是我最終想要達到的目的。 在圖像中只是我可能想要計算的一些隨機事物。

所以我的問題是:

  1. 這個設計有意義嗎? 你可以做些什么改進?

  2. 將使用哪種SQL查詢來計算這些統計信息? 我是否必須在其間制作一些其他表格 - 例如,要找到跑步者在第一名的10分鍾內完成的時間百分比,我是否必須先為該比賽制作所有跑步者數據的表格,然后再做一些查詢,還是有更好的方法? 我應該查看有關計算這些統計數據的更多鏈接嗎?

  3. 我是否應該使用python或其他語言來獲取這些統計信息而不是SQL? 我的理解是SQL有可能將幾百行的python代碼減少到一行,所以我想我會試着用SQL來試一試。

謝謝!

1)你的3個桌子Races,Race_Results和Runners的設計非常有意義。 這里沒什么可改進的。 統計數據有所不同。 如果您設法以一種可以在視圖中使用的方式編寫那些可能稍微復雜的查詢,那么您應該這樣做並避免保存每天需要重新計算的統計信息。 只要性能足夠,只要需要,就可以在需要時即時計算這樣的東西比保存它更好。

2)如果你將使用Oracle或MSSQL,我會說你可以使用一些聚合函數和公用表表達式。 在MySQL中,您必須使用group by和子查詢。 使整個方法更復雜,但完全可行。 如果你在評論中要求一個特定的指標,我可能會建議一些代碼,盡管我的專業知識更多地在Oracle和MSSQL中。

3)如果可以,請將您的代碼放入數據庫中。 這樣,您就可以避免在編程語言和數據庫之間頻繁切換上下文。 這種方法通常是所有數據庫系統中最快的。

我認為你的設計很好,雖然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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM