“传感器系统”的最佳数据库设计

时间:2009-10-09 16:27:36

标签: mysql database model schema data-modeling

我正在做一个功课......

我必须做一个车辆跟踪系统。我想到了这三个设计。你觉得怎么样?

我的数据库模式

(png at ImageShack ~99KB)

评论

3 个答案:

答案 0 :(得分:3)

  • 如果您始终在一个测量会话中测量并存储所有参数,请转到设计1

    如果很少存储和/或很少需要属性,那么将属性移动到单独的表中是有意义的。

  • 如果您有位置和温度的独立传感器,请转到设计3

    这是最有可能的,因为位置是由GPS跟踪器测量的,温度和油位由车辆传感器测量,车辆传感器是独立的设备,测量在不同的时间进行。

    您甚至可能需要为每个传感器添加一个单独的表(即,如果不同的传感器在不同时间测量气体和温度,则为它们制作两个表)。

  • 如果您使用的液体清单在设计时间内未知(即某些第三种液体,如氢气),则将liquid移动到单独的表格中(如在设计2中)是有意义的或氦-3或其他任何他们将发明的东西将由车辆使用,您将需要跟踪它而无需重新设计数据库。)

    当然,这不是一种可能的情况。

答案 1 :(得分:1)

如果你同时从传感器上读取第二个设计对我来说太过分了。如果您在不同时间阅读该信息,那么将信息分开是有意义的。

我会建议第一个设计。

答案 2 :(得分:0)

您的应用需要处理两类事情

  • 传感器 =哪种类型,引擎中的位置,甚至是轮询频率等参数..
  • 读取 =来自一个(或几个?)传感器的单个带时间戳的录音。

有几点需要考虑:
- 我们如何找到抽象传感器概念的方法?我们的想法是,我们可以通过其属性识别和处理传感器实例,而不必知道它们在数据库中的位置。
- 最好将给定时间戳的所有测量值保存在单个“读取”记录中,或者每次读取时每个传感器保留一个记录,即使多个测量值都是成套的。

对最后一个问题的快速回答是,每条记录的单次阅读事件似乎更灵活;我们将能够以同样的方式处理同时进行系统轮询的两组测量,以及与前者不同的其他测量。即使现在,所有测量都是立即进行的,因此可以轻松添加传感器,而无需更改数据库模式 以便以类似方式处理它们。

也许以下设计更贴近您的需求:

tblSensors
     SensorId   PK
     Name       clear text description of the sensor  ("Oil Temp.")
     LongName   longer description   ("Oil Temperarure, Sensor TH-B14 in crankshaft")
     SensorType enumeration  ("TEMP", "PRESSURE", "VELOCITY"...)
     SensorSubType   enumeration   ("OIL", "AIR"...)
     Location   enumeration  ("ENGINE", "GENERAL", "EXHAUST"...)
     OtherCrit  other crietrias which may be used to identify/seach for the sensor.


tblReads
     Readid   PK
     DateTime   
     SensorId   FK to tblSensors
     Measurment  INTeger value
     Measurement2    optional extra meassurement (maybe to handle say, all
                     of a GPS sensor read as one "value"
     Measurement3 ... also may have multiple columns for different types of 
              variables (real-valued ?)

除了上述内容之外,您还有一些表格,其中定义了各种类型传感器的“枚举”,并且应用程序逻辑的搭配将通过类似助记符的“键”来实现。这些枚举。例如

SELECT S.Name, R.DateTime, R.Measurement
FROM tblReads R
JOIN tblSensors S ON S.SensorId = R.SensorID
WHERE S.SensorType IN ('Temp', 'Pres')
  AND S.Location = "ENG"
  AND R.DateTime > '04/07/2009'
ORDER BY R.DateTime

这不会阻止您通过其ID调用传感器,也不会阻止您在同一结果行上对读取进行分组。例如

SELECT R1.DateTime, R1.Measurement AS OilTemp, R2.Measurement AS OilPress,
       R3.Measurement AS MotorRpms
FROM  tblReads R1
LEFT OUTER JOIN tblReads R2  ON R1.DateTime = R2.DateTime
LEFT OUTER JOIN tblReads R3  ON R1.DateTime = R3.DateTime
WHERE R1.SensorId = 17 
  AND R2.SensorId = 11 
  AND R3.SensorId = 44 
  AND R1.DateTime > '04/07/2009' AND R1.DateTime < '04/08/2009'
ORDER BY R3.Measurement DESC -- Sorte by Speed, fastest first