1

我需要设计一个能够在不同时间尺度上记录不同数据的Sql 服务器数据库。

基本上我必须记录的是随时来自大量电池的电池数据。

这是数据库的基本模型。图像上的数据类型不是我使用的那种。

我对它们中的大多数使用 tinyInt(2 个字节)

  • 时间为 3 个字节
  • 日期为 2 个字节

数据库基本模型

所以想象一下:

每 24 小时发出 1 个单元报告文件。但:

单元格的每个属性不会以相同的频率刷新。

例如 :

  • 时间属性每秒刷新一次
  • 安培属性每秒刷新一次
  • Temp1 属性每分钟刷新一次
  • 每天刷新日期

并且该单元多年来一直在报告 24/7。

如果全世界有 1000 个电池链接到数据库,每个电池有 20 个电池。

20 000 个细胞报告 24/7

所以这里是问题:

如果只有一个属性更改,我不希望重新存储整行。如果是这样,对于 20 000 个细胞,我需要 1To 一年。(这是使用 Null 存储而不是未刷新的值)。

我希望解释足够清楚,不要犹豫,询问更多信息

像往常一样,我为我的英语道歉:/

谢谢你。

4

2 回答 2

1

您每秒需要 20k 次插入,这当然是可行的,但它显示了这是多少数据。以这种速度批量插入完全没有问题,但是您还必须将数据保留一段时间。这将是很多行和 TB。

我会考虑以自定义格式存储它:您可以在每个电池和每小时存储一个二进制 blob。在那个 blob 中,您可以随意对更改进行编码。您可以通过根本不存储它们来非常有效地存储不变的列。您还可以在存储之前压缩 blob。

该方案仍然为您提供电池和时间的索引。只是时间分辨率降低到一小时。您的应用必须解码 blob 并从中提取所需的数据。

数据将很容易压缩,因为它是如此冗余。对于压缩,有非常快的方案,如 LZO、LZ4 和 QuickLZ。您可以使用 7z 之类的东西获得更多压缩。

于 2013-02-07T10:46:39.727 回答
1

可能是一个带有KeyValue列的简单表格。

例如。

RowID  BattID  Dt                   Key   Value
1      1       07/02/2013 10:00:01  Amps  1.852
2      1       07/02/2013 10:00:02  Amps  1.809
3      1       07/02/2013 10:00:03  Amps  1.758
4      1       07/02/2013 10:00:03  Tmp1  18.4
5      1       07/02/2013 10:00:04  Amps  1.725

键的数据类型可以是 tinyint 以节省空间。

一旦你有了这些数据,只要索引是正确的,你就可以使用 PIVOT 查询来重新构建你想要的数据。

于 2013-02-07T10:05:06.797 回答