【发布时间】:2016-07-27 14:22:35
【问题描述】:
我对 MySQL 世界还很陌生,而且我处于经常使用它的位置。我目前遇到的问题是我们正在从多个不同站点接收数据,这些站点包含许多列,例如下面的表 1:
DateTime | Temperature1 | Temperature2 | Temperature3 | Ect.
我们的许多工程师都喜欢将这些数据提取到 Excel 工作表中,更具体地说是数据透视表,以便于操作。我们还有一些程序可以使用这些数据来生成图表等。这些程序特别要求数据格式如下:
日期时间 | p值 |名字
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`
然后代码会针对每个单独的温度列重复。当我们只有少量数据时它起作用了,但是随着数据的增加,我们的查询持续时间减少了,这成为一个相当大的问题。从我在网上阅读的内容来看,使用视图可能不是处理诸如此类的大型数据集的方法,尤其是考虑到我无法对其中的任何一个进行索引。我考虑过创建一个触发器来写入数据,因为它被插入到一个新的重新格式化的表中,但我不知道如何开始。
总而言之,我只是在寻找有关重新格式化这些数据的最有效方法的一些指导。触发器会更好地服务于这个目的,还是我只需要一个更好的优化视图。或者有没有我还没有想到的第三种选择?
【问题讨论】:
-
不要将您的温度读数存储为多列。这被称为“重复组”,它不是推荐的数据库设计,因为您现在遇到的困难。相反,每行存储一个温度。
-
问题是用于收集和发送数据到我们数据库的程序只能以“重复组”的形式发送数据。它与时间戳同步有关,因为系统将在一个特定的时间戳收集数据,然后将所有收集的数据写入一个特定的行。除非我们将每条记录的数据偏移一两秒,否则我们无法实现每行一个温度读数。