【发布时间】:2010-12-02 10:56:01
【问题描述】:
这个问题与another question I asked. 相关。在我的另一个问题中,我向人们询问了关于我可以构建数据库的 3 种不同方式的意见。我能想到的最简洁的方法是选项 2:
Location [Table]
- Id
- Name
- HasLogger
- LoggerRFID
- LoggerUpperLimit
- LoggerLowerLimit
Sensor [Table]
- Id [PK]
- LocationId [FK]
- UpperLimit
- LowerLimit
SensorReading [Table]
- Id [PK]
- SensorId [FK]
- Value
LoggerReading [Table]
- LocationId [FK]
- Value
Alert [Table]
- Id [PK]
AlertCorrectiveAction [Table]
- AlertId [FK]
- CorrectiveActionId [FK]
- ByUserId [FK]
AlertAcknowledgement [Table]
- AlertId [FK]
- ByUserId [FK]
SensorAlertReading [Table]
- AlertId [FK]
- SensorReadingId [FK]
LoggerAlertReading [Table]
- AlertId [FK]
- LoggerReadingId [FK]
现在这个选项的问题是它允许将来自多个传感器和多个位置的读数“链接”到单个警报。
为了解释为什么会出现这个问题,我将解释系统是如何工作的:
一个位置可以包含许多“实时传感器”,但只能包含 1 个记录器。出于这个原因,我将记录器属性放入位置表中(实际上是一对一的关系)。记录器收集读数,直到后来被收集,实时传感器立即通过网络传达读数,并且它们具有额外的属性,例如具有网络地址属性的网络从站..与记录器完全不同(我曾经尝试将记录器视为传感器,没有效果不好)。
当传感器或记录器超出范围(由读数指示)时,系统会生成警报。该警报仅针对该传感器,并被视为处于活动状态,直到该传感器(或记录器)的读数表明它已回到范围内。在此之前,将传感器进一步超出范围的读数“链接”到同一警报。
如您所见,单个警报实际上应该只有同一个传感器的读数链接到它,但是我上面的设计允许来自不同传感器和记录器的不同读数与同一个警报相关联 - 我是否应该对此感到困扰我没有以某种方式限制它?另一个问题是它允许警报在没有任何读数的情况下存在。
因此我的问题;一个人应该在多大程度上受到约束或弯曲设计以适应这些约束?我喜欢上面的设计,因为它很简单 - 警报可以有传感器读数和记录器读数,所以链接它们是一个简单的关系。
我不禁想我也错过了一个技巧 - 有没有更好的方法来做这个设计?我已经用它转了很多年,似乎总有一种妥协(除非我针对不同的阅读类型重复所有警报表)。
谢谢。
【问题讨论】:
标签: database database-design constraints