在檢查了很多關於stackoverflow的類似問題之後,似乎上下文會告訴哪種方式最適合保存數據。存儲數據的最佳方式:對於每天有10,000個新行的情況,許多列vs多行
小故事,我在僅包含3列的非常簡單的表格中添加了10,000多條新數據行。我永遠不會更新行,只做選擇,分組和平均。我正在尋找存儲這些數據的最佳方法,以便儘可能快地進行平均計算。
爲了把你放在上下文中,我正在使用FFT分析錄製的音頻文件(混音室中的粉紅噪聲播放)。單個音頻文件的結果總是採用相同的格式:頻率點的ID(整數)和以分貝(浮點值)表示的值。我想將這些值存儲在PostgreSQL數據庫中。
頻率(寬度= 8Hz)的每個頻段(頻段)以分貝爲單位獲得振幅。第一倉被忽略,所以它是這樣的(而不是實際的分貝值):
- 斌1:8HZ-16HZ,-85.0dB
- 斌2:16HZ-爲32Hz,-73.0dB
- 斌3:爲32Hz-40Hz的,-65.0dB
- ...
- 斌2499:20,000Hz-20,008Hz,-49.0dB
的目標是通過存儲來自8HZ每個倉的幅度20,008Hz(1 bin覆蓋8Hz)。
許多行接近
對每一個打開的音頻文件,將有2499行3列:「分析UID」,「賓ID」和「分貝」。
對於每個工作室(4),每天有一個記錄要附加到數據庫中(這是每天2,499 = 9,996個新行的4倍)。
在一個錄音室錄音後,新的2,499行用於顯示頻率響應圖。
我的問題是,我們還需要繪製一個工作室中每個箱子的平均dB值5-30天,以查看頻率響應是否會隨着時間顯着變化(從而告訴我們演播室需要校準)。
我想出了許多行的做法如下數據結構:
「分析」 表:
- analysisUID(串行)
- studioUID(外鍵)
- analysisTimestamp
「analysis_results」表:
- analysisUID(外鍵)
- freq_bin_id(整數)
- amplitude_dB(浮動)
這是存儲數據的最佳方式?一個表格每天保存近10,000個新行,並進行5次或更多次分析的平均值分析,按analysisUID和freq_bin_ids進行分組?這會給我2,499行(每個對應一個bin並給出平均的dB值)。
多列的方法:
我想我能做到這一點的其他方式,打破了頻點在4個表(低,中低,中高,高)。由於Postgres的文檔說列限是「250-1600取決於列類型」,所以製作包含大約625列(2,499/4)的4個表格是切合實際的,每列表示一個bin幷包含「dB」值,就像所以:
「低」 表:
- analysisUID(外鍵)
- freq_bin_id_1_amplitude_dB(浮動)
- freq_bin_id_2_amplitude_dB(浮動)
- ...
- freq_bin_id_625_amplitude_dB(浮動)
「med_low」 表:
- analysisUID(外鍵)
- freq_bin_id_626_amplitude_dB(浮動)
- freq_bin_id_627_amplitude_dB(浮動)
- ...
- freq_bin_id_1250_amplitude_dB(float)
等等
會的平均值來計算速度更快,如果服務器只能通過analysisUIDs有集團,使每一列的平均值?
我不知道我在哪裏得到的想法,10,000行是巨大的...我會考慮批量插入肯定的,因爲分析完成後,我想,以顯示其產生的立即繪製(沒有任何平均)。對於一個工作室的多天數據平均時間,我擔心性能。我不會特別針對大量頻率做任何特殊的事情,平均數對於所有頻率都是一樣的,所以我會明確地選擇多行方法。我在你的帖子後閱讀了關於fillfactor的內容,我明白現在是什麼。感謝索引! –