我有一个数据库,用于存储来自多个仪表的读数。根据仪表的不同,该仪表可能每 1-5 分钟就会有多个读数的数据(即气象站,它存储 5 个不同的读数)。
我目前按日期存储数据。我将单个日期的特定仪表的所有内容分组在一起,并将其作为 xml 存储在文本列中。
将这些数据存储为单独的行会更有效吗?
我正在尝试确定哪个是长期最明智的解决方案(即每行数据更多的行更少,或者行更多,每行更小)。
这是一个阅读繁重的环境。
编辑:
通过“高效”,我最关心速度和资源使用情况(如果我提取一年的数据,这将是处理器/内存密集度最低的)。
我几乎完全使用这些数据为客户绘制图表。每个时间戳的读数数量是可变的,从 1 到 6 个读数。
该数据库当前是一个 INNODB。
编辑 2:
我更倾向于将数据保存在 MySQL 中以便于访问/更新。
我正在寻找更多的答案是将每个单独的时间戳(可能有多个读数)保存在单独的行中还是将多个时间戳(即最多一天的值)分组到一行中是否更聪明。
谢谢
这完全取决于您要对数据执行的操作 - 如果它仅用于绘图,并且您不需要高分辨率(例如,您不尝试使用1 年前一天的完整时间分辨率),您可能实际上想要查看RRDTool而不是关系数据库。
如果您需要对值进行分析(一个地方多久会超过 80°F?),您将需要存储离散值,而不是 XML 结构;但您也可以使用用于处理此类数据的平面文件结构(例如, CDF、NetCDF ...甚至可能是HDF)
更新:
我会将每次存储为单独的记录,因为这样可以更轻松地在绘图时调整粒度。例如,要提取每小时的高/低/平均值:
此外,它还允许您更改测量的节奏而无需更改表结构。
如果我理解正确的话,您目前有一个包含 3 个字段的表,日期时间、仪表和读数,其中读数是一个 XML 字符串。我本以为你最好将阅读材料分成额外的栏目。首先,字符串实现可能需要更多的物理空间。其次,进行任何类型的分组、聚合、过滤等都相对困难。
我想这取决于你的意思是我的“高效”。这可能还取决于您读取数据的内容和方式,以及数据的去向。如果将其存储为单独的字段,则网络流量可能会减少。还取决于读取数据的客户端需要用它做什么。
我特别使用 XML 字段的原因是因为我可能将一条记录与 XML 中的“Readings”元素相关联,而下一条记录可能具有“Telemetry”XML 元素(发明一些东西)......
实际上,对于我来说,我有不同的数据有效负载,但标头都是相同的,所以我更容易将其填充到 XML 中,因为我想要在按行表示的标头信息过滤后的有效负载,而且我可能在那个领域有不同数量的信息。例如,我的 XML 字段之一是记录编辑历史记录。这样我就可以为那条记录提供一个不断扩展的字段,并且它与它所代表的行整齐地打包在一起,而且我不必为那一组值创建一个单独的审计表。这可能不是最有效的方法,但它适合我和我的需要。