如何处理可选列的数据库规范化设计?

时间:2013-07-01 19:35:22

标签: sql database entity-framework normalization

我正在研究存储传感器数据的系统。大多数传感器测量单个值,但有些可以测量每个采样周期的许多值。我正在努力使我的数据库尽可能正常化,而不会因为查找大量样本数据而遇到性能问题。我的问题是如何设计传感器数据表以考虑可选的测量数据值。例如,传感器A只读取一个值,但传感器B读取5个值。如何在数据表中存储这两组数据?

选项1是创建一个平面结构,其中的表具有一堆列(value1,value2,value3 ... valueN等)以及一个记录使用了多少列的字段。我认为功能性但设计不好:

Sensor Data
  Sensor ID (Pk)
  Timestamp (PK)
  Columns Used
  Value 1
  Value 2
  Value 3
  ...
  Value n

另一个选项是高度规范化结构,并有一个数据表,使用复合键来存储单个数据值。它将跟踪传感器ID,时间戳和数据类型以保持唯一值。这是高度标准化的,允许每个样本无限数量的可选数据值,但复制了大量信息(特别是传感器ID和时间戳):

Sensor Data
  Sensor ID (Pk)
  Timestamp (Pk)
  Data Type (Pk)
  Value

对于几千个样本来说这不会那么糟糕,但是这个系统设计用于存储数百万个传感器样本,并且加入这些值可能会遇到性能问题(即WHERE传感器ID和时间戳相等但数据类型不同)。

任何人都有更好的想法来设计存储可选值的数据库?附注:设计必须与SQL Server和实体框架(EF)一起使用。

1 个答案:

答案 0 :(得分:2)

我认为使用选项2也不错,即使数据库有数百万行。您只需要SensiorId和Timestamp的索引。

我可以想到一个包含两个表的不同设计:

**SensorRead**
Id (PK)
SensorId
Timestamp

**SensorData**
Id(PK)
ReadId(FK)
Value
DataType

如果要查询该架构以获取给定SensorId和timestamp的值,那么它将导致10行之间的连接(假设传感器读取10个数据点)。所以成本几乎没有。

除了问题本身 - 我不确定,将多个列作为PK将与实体框架一起使用...从未尝试过,但如果您决定采用这种方式对此进行一些研究。