我正在尝试决定数据库设计。更具体地说,这是更大设计的子部分。基本上,有“位置”——每个位置可以有任意数量的传感器与之关联,它可以有一个记录器(但只有 1 个)。
我有传感器读数和记录仪读数,每个读数都足够不同,我认为需要单独的表格。
如果传感器读数超出范围,则会生成警报。虽然传感器读数超出范围,但它们仍与该警报相关联,因此您最终会收到 1 个包含许多读数的警报,以便我稍后绘制警报图,以便发现趋势等。
与记录仪读数相同。
到目前为止,这是我存储这些数据的 3 个想法:
选项1:
位置[表] - 身份证 [PK] - 姓名 - 有记录器 LiveSensor [表格] - 位置 ID [FK] - 身份证 [PK] LiveSensorReading [表格] - 身份证 [PK] - 传感器 ID [FK] - 价值 LiveSensorAlert [表格] - 身份证 [PK] - SensorReadingId [FK](可能不需要 - 强制要求始终至少有 1 个读数) LiveSensorAlertCorrectiveAction [表] - LiveSensorAlertId [FK] - CorrectiveActionId [FK] - 按用户 ID [FK] LiveSensorAlertAcknowledgement [表] - LiveSensorAlertId [FK] - 按用户 ID [FK] LiveSensorAlertReading [表] - SensorAlertId [FK] - SensorReadingId [FK] LoggerReading [表] - 位置 ID [FK] - 价值 LoggerAlert [表] - 身份证 [PK] - LoggerReadingId [FK](可能不需要 - 强制要求始终至少有 1 个读数) LoggerAlertReading [表] - LoggerAlertId [FK] - LoggerReadingId [FK] LoggerAlertCorrectiveAction [表] - LoggerAlertId [FK] - CorrectiveActionId [FK] - 按用户 ID [FK] LoggerAlertAcknowledgement [表] - LoggerAlertId [FK] - 按用户 ID [FK]
- 问题:很多重复的表格(这真的很重要吗??)
选项 2:
位置[表] - ID - 姓名 - 有记录器 传感器 [表] - 身份证 [PK] - 位置 ID [FK] SensorReading [表格] - 身份证 [PK] - 传感器 ID [FK] - 价值 记录仪阅读 - 位置 ID [FK] - 价值 警报 [表格] - 身份证 [PK] AlertCorrectiveAction [表] - 警报 ID [FK] - CorrectiveActionId [FK] - 按用户 ID [FK] AlertAcknowledgement [表] - 警报 ID [FK] - 按用户 ID [FK] SensorAlertReading - 警报 ID [FK] - SensorReadingId [FK] LoggerAlertReading - 警报 ID [FK] - LoggerReadingId [FK]
- 问题:不强制执行“每个警报至少 1 个读数”规则。
- 问题:允许不止一种类型的读数引用相同的警报。
选项 3:
位置[表] - ID - 姓名 - 有记录器 传感器 [表] - 身份证 [PK] - 位置 ID [FK] SensorReading [表格] - 身份证 [PK] - 传感器 ID [FK] - 价值 记录仪阅读 - 位置 ID [FK] - 价值 提醒【表】“超级表” - 身份证 [PK] LoggerAlert [表] - 警报 ID [PK,FK] - LoggerReadingId [FK] SensorAlert [表格] - 警报 ID [PK,FK] - SensorReadingId [FK] AlertCorrectiveAction [表] - 警报 ID [FK] - CorrectiveActionId [FK] - 按用户 ID [FK] AlertAcknowledgement [表] - 警报 ID [FK] - 按用户 ID [FK] SensorAlertReading [表格] - SensorAlertId [FK] - SensorReadingId [FK] LoggerAlertReading [表] - LoggerAlertId [FK] - LoggerReadingId [FK]
- 问题:没有什么能阻止 LoggerAlert 和 SensorAlert 引用相同的警报(与选项 2 相同的问题)。
- 问题:混淆数据库(超级表不是更多的 OO 概念吗?数据库意味着纯粹是关系,不是吗?)
我认为到目前为止我更喜欢选项 1,因为它看起来很干净而且意图很明确(我希望!),即使我有效地重复表格。
我刚刚想到的唯一一个小问题是,不同传感器的读数仍然可能与一个警报相关联。
我想知道人们对上述选项的看法。我经常看到使用建议安静的“超级表”,但由于某种原因,它感觉不对 - 几乎感觉有点像黑客,尤其是当我看到试图确保数据完整性的方法时。它似乎更类似于 OO 编程而不是关系设计。
谢谢。
编辑: 一些进一步的信息,以帮助回答以下一些问题:
大多数情况下,数据库仅通过应用程序服务器进行操作,如果这有什么不同的话。
实时警报和记录器警报通常被视为相同,因此我可能会在大多数时间处理所有警报,而不是以不同的方式处理记录器警报和实时警报。
记录器在位置表中具有相当特定的列。由于位置和记录器将是一对一的映射,我决定不使用单独的记录器表,到目前为止,它似乎工作得很好并保持简单。示例列:LoggerRFID (int)、LoggerUpperLimit (float)、LoggerLowerLimit (float) 等。您几乎可以争辩说记录器是传感器,但我沿着这条路走下去,结果并不好。
我几乎可以接受将警报设为通用,但正如其中一个答案所说,我正试图对此非常确定,因此在选择特定路径之前尽可能长时间地继续研究。