我有一个数据记录器,每秒存储一个传感器的读数,如下表所示:
16:21:53 10.51 19.47 16.89 16.4
16:21:53 4.44 8.03 6.86 6.33
16:21:53 1.99 2.18 2.42 1.28
16:21:54 1.41 0.72 2.39 1.28
16:21:54 1.06 1.85 2.99 2.08
16:21:54 1.04 2.27 3.27 2.29
16:21:56 1 2.46 3.07 2.34
16:21:56 1.13 2.26 3.24 2.07
16:21:56 0.93 2.05 2.84 1.81
16:21:57 0.99 1.88 2.61 1.63
16:21:57 0.85 1.61 2.44 1.35
16:21:57 0.7 1.4 2.26 1.14
16:21:58 0.63 1.27 2.34 0.99
它不方便存储所有这些行的日期,因为它会占用内存中的大量空间,为所有这些行存储单个日期值的最佳方法是什么?我的观点是,而不是有一个名为datas和insert的新列 2015年2月25日16:21:53的行和16:21:54的行的另一个日期,依此类推,我想使用25/2/2015一次性所有行或任何其他有效的作为一般数据库设计的方法。
答案 0 :(得分:2)
在SQL Server中,datetime
占用8个字节,但如果您不打算在2079年之后使用数据记录器,则可以使用smalldatetime
,只需4个字节。
这比尝试使用整数存储日期和时间更好,这通常会导致使用超过4个字节加上头痛加上转换的CPU时间。我不了解其他 dbms ,但应该有类似的选项。
修改强>
我刚检查了MySql,看起来你可以使用timestamp
来保存日期和时间,并且它也存储在4个字节上。
请在此处阅读有关存储要求和限制的信息:
MySql DateTime Storage Requirements
MySql date and time data types
另一个例子:
在Oracle 11G中,推荐的数据类型为date
。尽管它是可以存储数据的最小类型,但它仍然需要7个字节(timestamp
需要12个字节,但可以存储小数秒)。
Oracle Datetime data types
答案 1 :(得分:1)
您可以使用多种技术以及处理时间序列传感器数据的各种打包解决方案。查看Process Historian和SCADA解决方案,流数据库和复杂事件处理(CEP)软件。如果您想了解自己可以实施的一些技术,还有一些关于这些主题的已发表的科学和数据管理理论材料。
答案 2 :(得分:0)
没有“标准”方法可以做到这一点。此外,技术上不可能,因为数据库表行没有固有的“顺序”。您的计划将取决于重建日期+时间的顺序。
在您插入每个1分钟时段(最大值,最小值,平均值等)的数据时,“汇总”是否切实可行,并将其存储在更短(1/60行)中,但略宽一些(更多列)表?
或者,保留最后一小时传感器读数的详细信息,但之后总结如上?