数据库设计过于重复?

时间:2010-08-30 19:13:33

标签: database database-design entity-relationship relational-database

我正在开发一个数据库架构,这让我有点生气,因为我似乎在重复相同的表来重现不同类型的行为。

基本上,该系统包括通过网络监控的实时传感器,以及通过手机收集的记录器。传感器和记录器分为多个位置,位置分为多个区域。一个位置最多可以有1个记录器,但可以有任意数量的实时传感器。

我会试着打破规则:

  1. 系统可以有0到多个区域
  2. 一个区域可以有0到多个位置
  3. 位置可以有0到1个记录器
  4. 位置可以有0到多个LiveAnalogSensors
  5. 位置可以有0到多个LiveSwitchSensors
  6. 一个位置可以有0到多个允许的操作
  7. LiveAnalogSensor必须属于1 LiveSensorRelay
  8. LiveSwitchSensor必须属于1 LiveSensorRelay
  9. 记录器可以有0到多个读数
  10. LiveAnalogSensor可以有0到多个读数
  11. LiveSwitchSensor可以有0到多个读数
  12. 阅读可以有警报
  13. 系统可以有0到多个操作
  14. 警报可以对其应用0到1的操作
  15. 警报可以有0到1个AlarmResolution
  16. The schema picture is HERE.

    所以场景是,读数进入并存储(通过Logger下载或通过网络进行实时读取)。读数超出范围,因此它有一个警报代码。为该读数生成警报。用户最终将动作应用于该动作。如果读数进入表示报警条件已经结束,则AlarmResolution(或我在模式中调用它的AlarmEnd)条目将链接到报警以显示它已结束,以及它已结束的时间。

    在模拟报警时,只要新读数高于最后一个,就会存储一个新的“峰值”读数,这就是AnalogSensorReadingAlertPeak表的用途。

    基本上就是这样。我的问题是不同传感器(特别是记录器和模拟传感器基本相同)的模式重复性如何 - 而且我似乎有很多1到0..1的关系,尽管我不太关心它

    我真的在进行健全检查。我可以想办法摆脱重复性,但似乎总是以牺牲数据完整性为代价。

    感谢。

    编辑:我在投票后略微修改了标题和问题,因为它不是特别具体。我希望现在好多了..

4 个答案:

答案 0 :(得分:2)

如果每个传感器(例如)具有完全相同的属性(列),我会说这是重复的。 如果它们完全不同,它们应该有不同的表格。

我也尝试使用NORMA或类似方法来捕获它,以验证设计。

答案 1 :(得分:1)

我不会太担心太多的零对一关系。我确实首先担心拥有零对一关系。从长远来看,这些变成了一对多的关系。

对我而言,没有什么比许多工具标准的ER图的混乱更令人困惑了。我使用一种名为“Levelized Conceptual Diagrams”的技术来帮助理解我的人际关系。

你应该制作一个Levelized Diagram - 它会让你的生活变得非常轻松 数据库设计。

希望我能让这一切变得简单 - 一方在顶部,多方在底部。许多人被分解为两个一对多表。

重复直到完成。

链接到完整图片:http://i.stack.imgur.com/VKAGZ.jpg

alt text

答案 2 :(得分:0)

为什么需要只有PK字段的表?你不能直接将他们的孩子与父母联系起来吗?

另外考虑创建一个包含两个字段和一个contextID键字段的限制表,因此不是每个有2个限制字段的2个表(2个上限和2个下限字段),而是有一个包含3个字段的新表并更改现有表有两个FK关系的字段到新的字段,名称如upperLimitContextID和lowerLimitContextID。

此外,由于动作和结束表具有相同的PK,因此请考虑将它们组合在一起。任何时候都有相同PK的表格,它们可以合并。

答案 3 :(得分:0)

在Oracle中,ARC描述了与其他表的互斥关系。这个概念可以使用可空的FK列在其他数据库中实现。

根据表的功能,您可以选择将所有* Readings或所有* Alerts表组合到一个表中,具有可以为空的外键列到相应的Logger,AnalogSensor和SwitchSensor表。

因此,* AlertEnd和* AlertAction表也可以组合在一起(如果需要,可能会添加一个Type列。)

(可选)为三个域(Logger,AnalogSensor和SwitchSensor)添加视图以模拟原始表。