Mysql
我應該如何對數據庫結構進行建模以保留計算結果?
我正在嘗試提高與我認為“奇怪”的一個表相關的查詢的性能,該表可以由下一個腳本創建:
CREATE TABLE `CalcTable` ( `id` int(11) NOT NULL AUTO_INCREMENT, `result` double DEFAULT NULL, `calc_dt` datetime DEFAULT NULL, `project_id` int(11) NOT NULL, `calculation_type_cd` varchar(32) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`));
目前,我們有 17 種不同的計算類型。計算類型可以是:
- “目前千瓦/小時”,
- “預計千瓦/小時”,
- “預測千瓦/小時”,
- 等等。
未來數據可能會增長到 250 種不同的計算類型。此外,可能出現的情況是客戶可以創建自己的計算類型,只要他/她想要……
因此,我試圖了解如何設計一個表結構以現在以最佳方式處理這些數據,並且將來不使數據庫崩潰(使用 250 多種新計算類型)。
您可以在下面找到目前數據樣本:
id result calc_dt project_id calculation_type_cd ------- ------ ------------------- ---------- ------------------- 1906901 0.1028 2016-01-18 15:00:00 188 TypeA 1906902 336.68 2016-01-18 15:00:00 188 TypeB 1906903 341.55 2016-01-18 15:00:00 188 TypeC 1906904 0.4531 2016-01-18 16:00:00 188 TypeD 1906905 368.39 2016-01-18 16:00:00 188 TypeA 1906906 38.080 2016-01-18 16:00:00 188 TypeB 1906907 420.34 2016-01-18 16:00:00 188 TypeF
所以你可以想像未來會發生什麼……數十行,其中一些列包含重複數據……
我正在考慮兩種選擇:
- 創建 250 列用於儲存不同計算類型的結果
- 為某些計算類型**組創建不同的表
你怎麼看待這件事?是否有意義?
也許你有更好的方法 - 請告訴我!
提前非常感謝。
我在 AWS 上使用 MySQL 5.7。
如果您不知道它將有多少列,它可能會一直變化到 250,並且條目可能很稀疏,我會:
- 使用EAV設計將計算類型儲存在單獨的行中。
- 出於報告/分析目的,創建一個視圖或匯總表,將行轉換為列並將它們“展平”。
有一天,您可能會通過索引快速獲取數據。三年,可能不會。對於第二種情況,您可能希望研究更側重於分析的東西,例如 Greenplum(本地)或 Redshift(AWS)。
這是減少“250”的兩個折衷方案:
計劃 A:具有多列的“每小時”表。“每天”的另一張表。等等。
計劃 B:3 列:目前/預期/預測
其他問題…
你真的需要
DOUBLE
嗎?您的範例輸出可以由FLOAT
.將執行什麼樣的查詢?如果計算類型的搜尋/聚合/等最少,則將它們折騰成 JSON 字元串。然後讓應用程序將其分解以進行顯示等。
而且,是的,想想匯總表。