Как реализовать ссылочную целостность в подтипах

У меня есть следующие таблицы в реляционной базе данных:

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

и т. д.

Есть ли у кого-нибудь смысл в этой проблеме ??

6
задан LuiShadow84 20 December 2013 в 08:01
поделиться