[英]Database design with rectangular data
我正在嘗試學習SQL和數據庫設計,在這種情況下,需要一些幫助來選擇數據庫的良好設計。 我正在使用C#和MySQL。
我在本課中輸入的數據包括電表,所有電表都有唯一的標識號,每個電表每小時輸出一個值。 我擁有2013年及以后的數據,在不確定的將來還會繼續使用。 最好的猜測是未來5年。 大約有25000米,因此每天將有25e3 * 24 = 600 000個數據點。 我每天通過文件獲取一次此數據。 電表的數量將以緩慢的速度變化,因此每年將增加和刪除電表約500次。 另外,我想知道何時將值添加到數據庫中以計算收集系統的某些性能指標。 因此,這是每個儀表的輸入數據:
每個儀表都提供一種數據類型,因此我可以存儲具有該數據類型的表,因此數據本身將由匿名十進制值組成。 這是我的問題開始的地方。 我嘗試了一些不同的設計方法:
將數據添加到數據庫時,上述所有解決方案都會導致性能下降。
如果我在Stack Overflow以及其他地方搜索具有大量列的數據庫設計,我總是會找到答案“ Normalize!”,但由於我是新手,所以我不知道這種情況。 我具有唯一的值(valuetime),並且具有唯一的儀表ID,這就是為什么我將數據稱為矩形的原因。
有人可以引導我走正確的道路嗎?
對於您輸入的數據:
儀表表:
ID int PK IDENTITY(1, 1)
MeterName varchar
ReadingsTable:
ID int PK IDENTITY(1, 1)
MeterID int FK
Value decimal
TimeStamp datetime
DateAdded date
您應該用ETL填充-制作SSIS包或其他東西。 我認為絕對比C#應用更好。
接下來,您可以創建聚合表:
DailyAggTable:
ID int PK IDENTITY(1, 1)
MeterID int FK
SumOfValue decimal
Date date
您可以在ETL之后填充它。 您可以制作每周,每月,每季度,每年等匯總表,並相應地安排其人口。 這將提高報告性能。
基於Stan Shaw的答案...
如果數據是CSV文件,則只需每晚使用LOAD DATA
。 您可能應該加載到臨時表中,對數據進行按摩,然后復制到實際表中。 可能不需要任何C#代碼。
DateAdded
似乎沒有用,並且使表DateAdded
。 完全刪除,或構建另一個表來記錄上載。
不要打擾主表上的ID; (MeterID,時間戳記)是“自然” PRIMARY KEY
。 同樣,這節省了空間。
我只會在一個匯總表中建立每日匯總行。 該表可能足夠快以處理每周/每月查詢。 僅當它不夠快時,才應考慮摘要的摘要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.