Ваше приложение должно иметь дело с двумя типами вещей
- Датчики = какой тип, где находится двигатель, и даже такие параметры, как частота опроса и т. Д.
- Считывание = отдельные записи с метками времени с одного (или нескольких?) Датчиков.
Есть несколько вещей, о которых стоит подумать:
- Как мы можем найти способы абстрагирования концепции сенсора ? Идея состоит в том, что мы могли бы затем идентифицировать и обрабатывать экземпляры датчиков через их свойства, а не знать, где они находятся в базе данных.
-Лучше всего сохранять все измерения для данной метки времени в одной записи «Чтение» или иметь по одной записи на датчик для каждого считывания, даже если несколько измерений идут в наборах.
Быстрый ответ на последний вопрос заключается в том, что единичное событие чтения для каждой записи выглядит более гибким ; мы сможем обрабатывать одинаковым образом как группы измерений, которые систематически опрашиваются одновременно, так и другие измерения, которые асинхронны по отношению к первым. Даже если сейчас все измерения выполняются одновременно, привлекательна возможность легкого добавления датчиков без изменения схемы базы данных и для их обработки аналогичным образом. *
Может быть, следующий дизайн будет ближе к тому, что вам нужно:
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
Это не помешает вам также вызывать датчики по их идентификатору и группировать показания в одной строке результатов. например.
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