【发布时间】:2011-05-19 02:57:52
【问题描述】:
我最近问了一些关于数据库设计的问题,可能太多了 ;-) 但是我相信我的设计正在慢慢地触及问题的核心,并且正在慢慢地把它煮沸。关于如何将“警报”存储在数据库中,我仍在纠结几个决定。
在这个系统中,警报是一个必须被确认、采取行动等的实体。
最初我将读数与这样的警报相关联(非常减少):-
[Location]
LocationId
[Sensor]
SensorId
LocationId
UpperLimitValue
LowerLimitValue
[SensorReading]
SensorReadingId
Value
Status
Timestamp
[SensorAlert]
SensorAlertId
[SensorAlertReading]
SensorAlertId
SensorReadingId
最后一个表格将读数与警报相关联,因为读数指示传感器是否处于警报状态。
这种设计的问题在于,它允许将来自多个传感器的读数与单个警报相关联 - 而每个警报仅针对单个传感器,并且应该只具有与其关联的传感器的读数(我是否应该为数据库允许这样做吗?)。
我想简化一些事情,为什么还要麻烦 SensorAlertReading 表?相反,我可以这样做:
[Location]
LocationId
[Sensor]
SensorId
LocationId
[SensorReading]
SensorReadingId
SensorId
Value
Status
Timestamp
[SensorAlert]
SensorAlertId
SensorId
Timestamp
[SensorAlertEnd]
SensorAlertId
Timestamp
基本上我现在没有将读数与警报相关联 - 相反,我只知道警报在特定传感器的开始和结束时间之间处于活动状态,如果我想查找该警报的读数,我可以做.
显然,缺点是我不再有任何约束阻止我删除警报期间发生的读数,但我不确定约束是否必要。
现在作为开发人员/DBA 从外部看,这会让你想生病还是看起来合理?
我可能会想念另一种方法吗?
谢谢。
编辑: 这是另一个想法——它以不同的方式工作。它将每个传感器状态变化存储在一个表格中,从正常到警报,然后读数与特定状态简单关联。这似乎解决了所有问题——你怎么想? (我唯一不确定的是将表称为“SensorState”,我不禁想到有一个更好的名称(也许 SensorReadingGroup?):-
[Location]
LocationId
[Sensor]
SensorId
LocationId
[SensorState]
SensorStateId
SensorId
Timestamp
Status
IsInAlert
[SensorReading]
SensorReadingId
SensorStateId
Value
Timestamp
必须有一个优雅的解决方案!
【问题讨论】:
-
赏金似乎已经消失了。根据FAQ Bounty,我认为您可能必须再次取消选择/选择问题才能申请赏金。
标签: sql database database-design relational-database