1

我正在开发一个存储传感器数据的系统。大多数传感器测量单个值,但有些传感器可以测量每个采样周期的多个值。我试图使我的数据库尽可能地标准化,而不会因查找大量样本数据而遇到性能问题。我的问题是如何设计传感器数据表来考虑可选的测量数据值。例如,传感器 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

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

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

4

1 回答 1

2

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

我可以想到一种不同的设计,其中包含两个表格:

**SensorRead**
Id (PK)
SensorId
Timestamp

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

如果您将查询该模式以获取给定 SensorId 和时间戳的值,那么它将导致 10 行之间的连接(假设传感器读取的 10 个数据点)。所以成本几乎为零。

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

于 2013-07-01T19:47:11.380 回答