Mysql

我應該如何對數據庫結構進行建模以保留計算結果?

  • August 13, 2017

我正在嘗試提高與我認為“奇怪”的一個表相關的查詢的性能,該表可以由下一個腳本創建:

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

所以你可以想像未來會發生什麼……數十行,其中一些列包含重複數據……

我正在考慮兩種選擇:

  1. 創建 250 列用於儲存不同計算類型的結果
  2. 為某些計算類型**組創建不同的表

你怎麼看待這件事?是否有意義?

也許你有更好的方法 - 請告訴我!

提前非常感謝。

我在 AWS 上使用 MySQL 5.7。

如果您不知道它將有多少列,它可能會一直變化到 250,並且條目可能很稀疏,我會:

  1. 使用EAV設計將計算類型儲存在單獨的行中。
  2. 出於報告/分析目的,創建一個視圖或匯總表,將行轉換為列並將它們“展平”。

有一天,您可能會通過索引快速獲取數據。三年,可能不會。對於第二種情況,您可能希望研究更側重於分析的東西,例如 Greenplum(本地)或 Redshift(AWS)。

這是減少“250”的兩個折衷方案:

計劃 A:具有多列的“每小時”表。“每天”的另一張表。等等。

計劃 B:3 列:目前/預期/預測

其他問題…

你真的需要DOUBLE嗎?您的範例輸出可以由FLOAT.

將執行什麼樣的查詢?如果計算類型的搜尋/聚合/等最少,則將它們折騰成 JSON 字元串。然後讓應用程序將其分解以進行顯示等。

而且,是的,想想匯總表。

引用自:https://dba.stackexchange.com/questions/182456