从多列重新格式化MySQL表

时间:2016-07-27 14:22:36

标签: mysql view triggers

我对MySQL世界很陌生,我已经被置于一个经常使用它的位置。我当前遇到的问题是,我们正在从包含许多列的多个不同站点接收数据,如下面的表1所示:

DateTime | Temperature1 | Temperature2 | Temperature3 | Ect.

我们的许多工程师都喜欢将这些数据导入excel表格,更具体地说是数据透视表,以便于操作。我们还有一些程序使用这些数据来生成图表等。这些程序特别要求数据格式如下:

DateTime | pValue | pName

pValue是温度列的值,pName是该值来自的列名。我尝试创建一个简单的视图以重新格式化上述格式的数据并没有太大的成功。相反,我采用了如下的极长视图;

SELECT `DateTime` AS `DateTime`,
       `Temperature1` AS `pValue`,
       'Temperature1' AS `pName` 
FROM `table1` 
UNION
SELECT `DateTime` AS `DateTime`,
       `Temperature2` AS `pValue`,
       'Temperature2' AS `pName` 
FROM `table1`

然后,代码会针对每个单独的温度列重复进行。当我们只有少量数据时它才有用,但随着数据的增加,我们的查询持续时间会减少,这也成为一个很大的问题。从我在线阅读的内容来看,使用视图可能不是这种大型数据集的方法,特别是考虑到我无法索引其中任何一个。我已经考虑过创建一个触发器来编写数据,因为它被插入到一个新的重新格式化的表中,但我不知道如何开始。

总而言之,我只是在寻找可能是重新格式化这些数据的最有效方法的一些指导。触发器是否会更好地实现此目的,或者我只需要更好的优化视图。或者还有第三种选择,我还没有想过呢?

1 个答案:

答案 0 :(得分:0)

不要将温度读数存储为多列。这被称为"重复组"并且它不是推荐的数据库设计,因为您现在遇到了困难。相反,每行存储一个温度。

您可以在接收仪器数据的表上创建一个触发器,以便 将多行插入到正确组织的表中。

CREATE TRIGGER FixDataInputs AFTER INSERT ON MyRepeatingGroupsTable
FOR EACH ROW
  INSERT INTO MyNormalizedTable (DateTime, Temperature, Instrument) 
  VALUES (NEW.DateTime, NEW.Temperature1, 1),
         (NEW.DateTime, NEW.Temperature2, 2),
         (NEW.DateTime, NEW.Temperature3, 3),
         (NEW.DateTime, NEW.Temperature4, 4);

现在您可以更轻松地查询新表格。