【问题标题】:Reformatting MySQL table from Multiple Columns从多列重新格式化 MySQL 表
【发布时间】: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`

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

总而言之,我只是在寻找有关重新格式化这些数据的最有效方法的一些指导。触发器会更好地服务于这个目的,还是我只需要一个更好的优化视图。或者有没有我还没有想到的第三种选择?

【问题讨论】:

  • 不要将您的温度读数存储为多列。这被称为“重复组”,它不是推荐的数据库设计,因为您现在遇到的困难。相反,每行存储一个温度。
  • 问题是用于收集和发送数据到我们数据库的程序只能以“重复组”的形式发送数据。它与时间戳同步有关,因为系统将在一个特定的时间戳收集数据,然后将所有收集的数据写入一个特定的行。除非我们将每条记录的数据偏移一两秒,否则我们无法实现每行一个温度读数。

标签: mysql view triggers


【解决方案1】:

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

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

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);

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

【讨论】:

  • 谢谢比尔,这看起来是一个很好的起点。唯一的问题是我不知道哪个温度是哪个。我可能以一种令人困惑的方式提出了这个问题。温度 1、温度 2 等。都是不同的温度传感器。所以我需要一个指示器来告诉我哪个温度来自哪个传感器。
  • 见上面的编辑。这只是一个例子。您可以使用其他值来指示传感器,只要对您有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 2016-02-27
  • 1970-01-01
相关资源
最近更新 更多