我是数据库设计的初学者,研究实现时间序列数据的方法。 基本上,我想设计一个存储电池指标的数据库,即用户的电流,电压和时间。 我想的越多,我就越开始迷惑自己。请帮我指出方向。到目前为止,我想出了以下伪代码:
Table: User
Column 1: UserID( Primary Key )
Column 2: UserName
Table: Battery
Column 1: BatteryID ( Primary Key )
Column 2: ManufactureSerial
Column 3: ManufactureDate
Column 4: UserID (Foreign Key )
Table: BatteryLog
Column 1: Voltage
Column 2: Current
Column 3: SOC
Column 4: DateTime
Column 5: BatteryID (Foreign Key)
现在,我的问题是:什么应该是BatteryLog表的主键? batterylog可以在内部的指定时间包含数百万个时间序列行。 我现在正在使用SqlServer关系数据库。它有优化设计吗?
感谢您对我的研究的帮助!
答案 0 :(得分:1)
您可以为BatteryLog
表格创建自动增量主键:
[BatteryLogID] [int] IDENTITY(1,1) NOT NULL
这将用于每条记录的唯一标识符。
或者,您可以在BatteryID
和[DateTime]
上创建复合主键,如果它们对每条记录也是唯一的(通常情况下是时间序列)
答案 1 :(得分:0)
为什么不使用现成的时间序列数据库,这些数据库经过精心设计和优化,可以有效地存储和分析带时间戳的观测值。
答案 2 :(得分:0)
我可以为关系数据库建议的唯一优化是:
Table: BatteryLog
Column 1: SOC
Column 2: DateTime
Column 3: BatteryID (Foreign Key)
Column 4: Voltage00
Column 5: Current00
Column 6: Voltage01
Column 7: Current01
...
Column 124: Voltage59
Column 125: Current59
基本上,该表的每一行包含一分钟的电流和电压测量值。您可以将数据缓存在设备上,并仅在一分钟内将其发送到数据库。缺点是该方案仅适用于一种分辨率(在这种特定情况下为1秒)。它可以调整以支持可变分辨率,但它不支持可变分辨率或稀疏时间序列。
实时时间序列数据库更易于处理,而且它们具有更好的性能特征。