我受命实施一个解决方案(应用程序和数据库),以存储来自巨大传感器阵列的数据样本。该阵列目前由大约20,000个传感器组成,但是很快就会增长到多达100,000个传感器。每个传感器每10秒发送一次数据样本,每个样本的大小为28个字节。
这样求和会导致:
- 每个传感器每天8640个样本
- 每个传感器每天242kB的数据
- 每天8.64亿个样本
现在,我一直在想最好的方法是存储/检索数据?在指定了软件之后,我“加入”了这个项目,因此需要使用SQL Server在Windows平台上实现它。
我目前的解决方案是创建一个具有两个表的数据库来存储数据样本。第一个用作第二个的索引,第二个以每个传感器每天的基础将整理后的样本存储在二进制字段中:
Table 1:
RecordID - BigInt - Identity
SensorID - BigInt - Primary Key
Date - DateTime - Primary Key (yyyy-mm-dd)
Table 2:
RecordID - BigInt - Primary Key (from an insert into Table 1)
Data - Binary
基本上,我会将所有传感器的样本写入临时文件(每个传感器1个)。每天结束时,我将在表1中创建一个条目,使用生成的RecordID并将文件转储到表2的“数据”字段中。
这样,我最终每天只向该表添加100,000个条目,而不是8.64亿个条目。数据应该在LAN或高速WAN上可用,因此可以全天检索传感器数据。
尽管必须存储所有数据,但大多数数据可能永远不会被读取。因此,在表上读取的数量将不会比写入的数量多得多。
我知道我可以通过仅存储数据文件的路径来使用文件系统来实现某些功能,但是我读到SQL Server的性能优于NTFS,而您的二进制字段则少了256kB。(在256kB和1MB之间存在一个灰色区域,而对于二进制大小> 1 MB,NTFS远远优于SQL Server)。
我还略微谨慎地将来自100,000个传感器的数据存储到自己的文件中,而不会在文件系统中引起问题,原因是文件夹中包含大量文件,或者每个文件夹中都有一些文件的复杂树结构,而没有甚至考虑到文件碎片。
有人可以向我提供有关上述内容的一些实用建议/意见吗?
我会陷入明显的陷阱吗?
样本数据确实压缩得很好。一个242 kB的文件压缩到大约85 kB。但是,我可以在数据库级别实施某种类型的压缩,以便自动压缩示例数据(列)吗?
对于该项目,SQL Server是否显然是错误的选择?
我对这两个表的设计是明智的,还是可以将它组合成一个仍会像两个表一样“高效”的表呢?