数据库约束要走多远?

时间:2010-12-02 10:56:01

标签: database database-design constraints

这个问题与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对1关系)。记录器收集读数直到稍后收集,实时传感器通过网络立即传达读数,并且它们具有额外的属性,如具有网络地址属性的网络从属设备......与记录器完全不同(我尝试将记录器作为传感器处理一个点,没有运作得好。

当传感器或记录仪超出范围(由读数指示)时,系统会生成警报。警报仅针对该传感器,并且在该传感器(或记录器)的读数指示其返回范围之前被视为有效。在此之前,将传感器进一步超出范围的读数与相同的警报“链接”。

正如您所看到的,单个警报应该只有与其链接的相同传感器的读数,但是我的设计允许不同传感器和记录器的不同读数与同一警报相关联 - 我是否应该为此烦恼我不知道怎么办?另一个问题是它允许在没有任何读数的情况下存在警报。

因此我的问题;应该在多大程度上采用约束或弯曲设计以适应这些约束?我喜欢上面的设计,因为它很简单 - 警报可以有传感器读数和记录器读数,因此链接它们是一个简单的关系。

我不禁想到我也错过了一个技巧 - 是否有更好的方法来做这个设计?我已经和它一起玩了很多年了,现在似乎总是妥协(除非我重复所有不同阅读类型的警报表)。

感谢。

2 个答案:

答案 0 :(得分:3)

  

我应该感到困扰,因为我没有以某种方式限制它吗?

你犯了两个基本错误。

  1. 在移动的所有内容上粘贴Id个iot键。

    这阻碍了您对数据进行建模的能力,作为数据(不是没有意义的行,但具有人为强制的唯一性),并暴露了Identifers;和依赖关系(例如,传感器依赖于位置)。您正在使用包含数据的预设Row_Ids对电子表格进行建模。您需要将数据标准化为数据。

    这导致了您已发现的问题,但也存在其他问题。

    如果您对数据建模,标识符将会清除,而Index和FK约束将阻止此操作。什么数据是独立的;什么数据属于(依赖于)其他数据;什么数据对其他数据做了什么,以及这些行动的基础。

    然后(已经解决的主要问题)你只留下一些小的限制来处理次要区域。

  2. 否则,您无法在尝试的地方坚持添加约束并获得您想要的内容,但却永远无法实现目标。你知道你需要它们,所以你正在寻找它们。

  3. 错误的地方。我们需要备份到(1)。

    我已回复了其他问题,其中包含▶Sensor Data Model◀。这并没有解决您在此处发现的缺陷。但是,我刚刚看到这个问题,我明天将更新DM并包含这些表和列。

      

    ▶Link to IDEF1X Notation◀适用于不熟悉关系数据库建模标准的人。

    <强>问题

    1. 看起来你需要一个传感器参考表,即货架项,以保存UpperLimit和LowerLimit;而不是为每个位置重复它。或者是为每个位置设置,本地化。

    2. 想想Logger是SensorNo零。

    3. 为什么传感器没有RFID?

    4. 在每个LocationLogger是可选的,是1 :: 0-1?,

答案 1 :(得分:-1)

为什么没有:

Alert [Table]
- Id [PK]  
- SensorReadingId [FK]  
- LoggerReadingId [FK]  

然后填写SensorReadingId或LoggerReadingId。我想你的结构是一个简化的结构,但通常只有一个没有其他表的表,那么一个PK就是redundent。