2014-01-29 114 views
1

我是数据库设计的初学者,研究如何实现时间序列数据。 基本上,我想设计一个数据库,存储电池指标,即电流,电压和用户的时间。 我越想越想,就越是开始迷惑自己。请帮助我指出正确的方向。到目前为止,我想出了下面的伪代码:时间序列数据库设计

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关系数据库。有没有针对它的优化设计?

谢谢你在我的研究中的帮助!

回答

1

您可以BatteryLog表创建一个自动增加的主键:

[BatteryLogID] [int] IDENTITY(1,1) NOT NULL 

这将成为唯一的标识符的宗旨,为每一个记录。

或者,您也可以在BatteryID[DateTime]创建一个复合主键,如果他们也是唯一的每个记录(这通常是时间序列的情况下)

+1

我喜欢复合主键的方法,因为它支持以下查询:在特定的BatteryID范围内选择特定时间段的行。谢谢。 – user2952473

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秒)。它可以调整以支持可变分辨率,但不能支持可变分辨率或稀疏时间序列。

实时时间序列数据库更容易处理,而且它们具有更好的性能特征。