У меня есть следующие таблицы в реляционной базе данных:
[Sensor]
LocationId [PK / FK -> Location]
SensorNo [PK]
[AnalogSensor]
LocationId [PK/FK -> Sensor]
SensorNo [PK/FK -> Sensor]
UpperLimit
LowerLimit
[SwitchSensor]
LocationId [PK/FK -> Sensor]
SensorNo [PK/FK -> Sensor]
OnTimeLimit
[Reading]
LocationId [PK/FK -> Sensor]
SensorNo [PK/FK -> Sensor]
ReadingDtm [PK]
[ReadingSwitch]
LocationId [PK/FK -> Reading]
SensorNo [PK/FK -> Reading]
ReadingDtm [PK/FK -> Reading]
Switch
[ReadingValue]
LocationId [PK/FK -> Reading]
SensorNo [PK/FK -> Reading]
ReadingDtm [PK/FK -> Reading]
Value
[Alert]
LocationId [PK/FK -> Reading]
SensorNo [PK/FK -> Reading]
ReadingDtm [PK/FK -> Reading]
По сути, ReadingSwitch и ReadingValue - это подтипы Reading, а SwitchSensor и AnalogSensor - подтипы Sensor. Показание может быть либо значением SwitchReading, либо значением ValueReading - они не могут быть обоими, а датчик может быть либо аналоговым, либо SwitchSensor.
Единственный способ, с которым я столкнулся до сих пор, - это здесь .
Наверняка должен быть лучший способ делать такие вещи.
Единственный другой способ, который я могу придумать, - это не иметь подтипов, а полностью расширять все:
[SwitchSensor]
LocationId [PK/FK -> Location]
SensorNo [PK]
[AnalogSensor]
LocationId [PK/FK -> Location]
SensorNo [PK]
[SwitchReading]
LocationId [PK/FK -> SwitchSensor]
SensorNo [PK/FK -> SwitchSensor]
ReadingDtm
Switch
[AnalogReading]
LocationId [PK/FK -> AnalogSensor]
SensorNo [PK/FK -> AnalogSensor]
ReadingDtm
Value
[AnalogReadingAlert]
LocationId [PK/FK -> AnalogReading]
SensorNo [PK/FK -> AnalogReading]
ReadingDtm [PK/FK -> AnalogReading]
[SwitchReadingAlert]
LocationId [PK/FK -> SwitchReading]
SensorNo [PK/FK -> SwitchReading]
ReadingDtm [PK/FK -> SwitchReading]
Что может быть не так плохо, но у меня также есть таблицы, которые ссылаются на таблицу предупреждений, поэтому их тоже придется продублировать:
[AnalogReadingAlertAcknowledgement]
...
[AnalogReadingAlertAction]
...
[SwitchReadingAlartAcknowledgement]
...
[SwitchReadingAlartAction]
и т. д.
Есть ли у кого-нибудь смысл в этой проблеме ??