簡體   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