簡體   English   中英

矩形數據的數據庫設計

[英]Database design with rectangular data

我正在嘗試學習SQL和數據庫設計,在這種情況下,需要一些幫助來選擇數據庫的良好設計。 我正在使用C#和MySQL。
我在本課中輸入的數據包括電表,所有電表都有唯一的標識號,每個電表每小時輸出一個值。 我擁有2013年及以后的數據,在不確定的將來還會繼續使用。 最好的猜測是未來5年。 大約有25000米,因此每天將有25e3 * 24 = 600 000個數據點。 我每天通過文件獲取一次此數據。 電表的數量將以緩慢的速度變化,因此每年將增加和刪除電表約500次。 另外,我想知道何時將值添加到數據庫中以計算收集系統的某些性能指標。 因此,這是每個儀表的輸入數據:

  • 價值時間(日期時間)
  • 值(十進制數據)
  • 添加日期(日期時間)

每個儀表都提供一種數據類型,因此我可以存儲具有該數據類型的表,因此數據本身將由匿名十進制值組成。 這是我的問題開始的地方。 我嘗試了一些不同的設計方法:

  1. 一個大表,每行包括一個小時的數據,每米一列。 由於存在大量列而導致失敗,因此我需要一個單獨的具有“ Date_added”的大表。
  2. 每米一張表,列valuetime,value和date_add。 由於C#程序性能下降而失敗。
  3. 分區表(即table1 = meter以1開頭,依此類推)。 這仍然導致許多列。
  4. 分區表,其中表10 =米以10開頭,依此類推。 這仍然導致許多列。

將數據添加到數據庫時,上述所有解決方案都會導致性能下降。

如果我在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.

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