繁体   English   中英

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

[英]How do you handle database normalization design for optional columns?

我正在一个存储传感器数据的系统上工作。 大多数传感器只能测量一个值,但有些传感器可以在每个采样周期内测量多个值。 我试图使我的数据库尽可能地规范化,而不会因为查找大量样本数据而遭受性能问题。 我的问题是如何设计传感器数据表以考虑可选的测量数据值。 例如,传感器A仅读取一个值,而传感器B读取5个值。 如何将两组数据存储在数据表中?

选项1是使用一个表,该表具有一堆列(值1,值2,值3 ...值N等)和一个记录使用多少列的字段来创建平面结构。 我认为实用但糟糕的设计:

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)一起使用。

我认为即使数据库将包含数百万行,使用选项2也不错。 您只需要在SensiorId和Timestamp上建立索引。

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

**SensorRead**
Id (PK)
SensorId
Timestamp

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM