[英]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.