- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近问了一些关于数据库设计的问题,可能太多了 ;-) 但是我相信我正在慢慢地用我的设计触及问题的核心,并且正在慢慢地将其煮沸。我仍在纠结于如何将“警报”存储在数据库中的几个决定。
在这个系统中,警报是一个必须被确认、采取行动等的实体。
最初,我将读数与这样的警报相关联(非常减少):-
[Location]
LocationId
[Sensor]
SensorId
LocationId
UpperLimitValue
LowerLimitValue
[SensorReading]
SensorReadingId
Value
Status
Timestamp
[SensorAlert]
SensorAlertId
[SensorAlertReading]
SensorAlertId
SensorReadingId
[Location]
LocationId
[Sensor]
SensorId
LocationId
[SensorReading]
SensorReadingId
SensorId
Value
Status
Timestamp
[SensorAlert]
SensorAlertId
SensorId
Timestamp
[SensorAlertEnd]
SensorAlertId
Timestamp
[Location]
LocationId
[Sensor]
SensorId
LocationId
[SensorState]
SensorStateId
SensorId
Timestamp
Status
IsInAlert
[SensorReading]
SensorReadingId
SensorStateId
Value
Timestamp
最佳答案
世界标准时间 11 月 1 日 21:50 修订
数据模型
我认为你的数据模型应该是这样的:▶Sensor Data Model◀。 (第 2 页与您关于历史的其他问题有关)。
不熟悉关系建模标准的读者可能会发现▶IDEF1X Notation◀很有用。
业务(注释中制定的规则)
我确实确定了一些早期的业务规则,这些规则现在已经过时了,所以我删除了它们
这些可以在关系中“读取”(与数据模型相邻读取)。业务规则和所有隐含的参照和数据完整性都可以在任何 ISO SQL 数据库中的规则、检查约束中实现,并因此得到保证。这是 IDEF1X 的演示,用于开发关系键以及实体和关系。请注意动词短语不仅仅是蓬勃发展。
除了三个 Reference 表之外,唯一的静态标识实体是 Location、NetworkSlave 和 User。传感器是系统的核心,所以我给了它自己的标题。
位置
Location
包含一对多 Sensors
Location
可能有一个记录器User
可以保持零对多 Locations
User
可以保持零对多 Sensors
User
可以保持零对多 NetworkSlaves
User
可以执行零对多 Downloads
User
可以使零对多Acknowledgements
,每一个Alert
User
可以取零对多 Actions
,每一个 ActionType
SensorType
被安装为零对多 Sensors
Logger
(房屋和)收集Readings
一个LoggerSensor
Sensor
是一个NetworkSensor
或一个LoggerSensor
NetworkSensor
记录了一个Readings
收集的NetworkSlave
. Logger
是周期性的Downloaded
一对多LoggerSensor
记录了一个Readings
收集的Logger
. Reading
可被视为Alert
中的AlertType
AlertType
可能发生在零对多的Readings
上Alert
可能是一个Acknowledgement
,由一个用户Acknowledgement
可以被一个Action
、一个ActionType
、一个User
关闭ActionType
可用于零对多 Actions
Id
列会干扰标识符的确定,标识符是赋予数据库关系“权力”的自然关系键。它们是代理键,这意味着额外的键和索引,它阻碍了这种关系能力;这会导致更多的连接而不是其他必要的连接。因此,我仅在关系键变得太麻烦而无法迁移到子表(并接受强加的额外连接)时才使用它们。 Alert
可能是Acknowledged
; Acknowledgement
可以是Actioned
。 SensorNo
是LocationId
内的连续编号;引用业务规则,在Location
之外是没有意义的;两列一起形成PK。当您准备好插入传感器时(在您检查尝试是否有效等之后),其推导如下。这不包括 LoggerSensors,它们为零:INSERT Sensor VALUES (
@LocationId,
SensorNo = ( SELECT ISNULL(MAX(SensorNo), 0) + 1
FROM Sensor
WHERE LocationId = @LocationId
)
@SensorCode
)
NetworkSlave monitors NetworkSensor
改为NetworkSlave collects Readings from NetworkSensor
。 NetworkSensor
和LoggerSensor
是Sensor
的专有子类型,它们的完整性可以通过CHECK约束来设置。 Alerts, Acknowledgements
和Actions
不是子类型,但是它们的完整性是通过相同的方法设置的,所以我将它们一起列出。Sensor
是哪个亚型。这是SensorNo = 0
的LoggerSensors
; NetworkSensors
的非零值。 NetworkSensors
和LoggerSensors
的存在分别被FK CONSTRAINTS约束为NetworkSlave
和Logger
;以及传感器。 NetworkSensor
中,包含一个 CHECK 约束以确保 SensorNo
非零 LoggerSensor
中,包含一个CHECK约束以确保SensorNo
为零Acknowledgements
和Actions
的存在受已识别的 FK 约束(Acknowledgement
不能没有Alert
而存在;Action
不能没有Acknowledgement
而没有 67)。相反,没有Alert
的Acknowledgement
处于未确认状态;带有Alert
但没有Acknowledgement
的Action
处于已确认但未采取行动的状态。Readings, Alerts
);其他程序轮询数据库是否存在此类行(并发送 SMS 消息等;或手持设备仅接收与该设备相关的警报)。从这个意义上说,db is a 可以被描述为一个消息框(一个程序将行放入其中,另一个程序读取和操作)。Readings
的Sensors
正在被NetworkSlave
“现场”录制,并且每隔一分钟左右,插入一组新的Readings
。后台进程定期执行(每分钟或其他时间),这是主要的“监控”程序,它将在其循环中具有许多功能。一个这样的函数是监视Readings
并产生自上次迭代(程序循环)以来发生的Alerts
。
-- Assume @LoopDateTime contains the DateTime of the last iteration
INSERT Alert
SELECT LocationId,
SensorNo,
ReadingDtm,
"L" -- AlertType "Low"
FROM Sensor s,
Reading r
WHERE s.LocationId = r.LocationId
AND s.SensorNo = r.SensorNo
AND r.ReadingDtm > @LoopDtm
AND r.Value < s.LowerLimit
INSERT Alert
SELECT LocationId,
SensorNo,
ReadingDtm,
"H" -- AlertType "High"
FROM Sensor s,
Reading r
WHERE s.LocationId = r.LocationId
AND s.SensorNo = r.SensorNo
AND r.ReadingDtm > @LoopDtm
AND r.Value > s.UpperLimit
所以Alert
绝对是一个事实,它作为数据库中的一行存在。随后可能是Acknowledged
加上User
(另一行/事实),Actioned
加上ActionType
加上User
。Alert
称为Alert
中的一行;创建后的静态对象。 Users
。这已经被处理了,如下所示。在我(昨天修改的)答案的顶部,我声明主要的识别元素是静态。我已对业务规则重新排序以提高清晰度。User.Name
对于User
来说不是一个好的PK,尽管它仍然是一个备用 key (唯一)并且是用于人机交互的 key 。 User.Name
不能重复,Fred
不能超过一个;可以有FirstName-LastName
;两个Fred Bloggs
,但不是User.Name
。我们的第二个 Fred 需要选择另一个User.Name
。注意确定的指数。 UserId
是永久记录,已经是PK了。永远不要删除User
,它具有历史意义。事实上 FK 约束会阻止你(永远不要在真正的数据库中使用 CASCADE,那是纯粹的疯狂)。不需要代码或触发器等Users
,从而释放User.Name
供使用)允许删除,只要不存在 FK 违规(即UserId
是而不是“104567”中引用的Download, Acknowledgement, Action
)。 Users
执行Actions
,在用户(DM更新)中添加一个IsObsolete
bool 值,并在查询该表的任何功能(报告除外)时检查该列您可以实现一个 View UserCurrent
只返回那些 Users
。Location
和NetworkSlave
也是如此。如果您需要区分当前与历史,请告诉我,我也会为它们添加IsObsolete
。关于sql - 关于传感器/读取/警报数据库设计的意见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4335189/
我的问题是如何在 python 中创建一个简单的数据库。我的例子是: User = { 'Name' : {'Firstname', 'Lastname'}, 'Address' : {'Street
我需要创建一个与远程数据库链接的应用程序! mysql 是最好的解决方案吗? Sqlite 是唯一的本地解决方案吗? 我使用下面的方法,我想知道它是否是最好的方法! NSString *evento
给定两台 MySQL 服务器,一台本地,一台远程。两者都有一个包含表 bohica 的数据库 foobar。本地服务器定义了用户 'myadmin'@'%' 和 'myadmin'@'localhos
我有以下灵活的搜索查询 Select {vt:code},{vt:productcode},{vw:code},{vw:productcode} from {abcd AS vt JOIN wxyz
好吧,我的电脑开始运行有点缓慢,所以我重置了 Windows,保留了我的文件。因为我的大脑还没有打开,所以我忘记事先备份我的 MySQL 数据库。我仍然拥有所有原始文件,因此我实际上仍然拥有数据库,但
如何将我的 Access 数据库 (.accdb) 转换为 SQLite 数据库 (.sqlite)? 请,任何帮助将不胜感激。 最佳答案 1)如果要转换 db 的结构,则应使用任何 DB 建模工具:
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
我想在相同的 phonegap 应用程序中使用 android 数据库。 更多说明: 我创建了 phonegap 应用程序,但 phonegap 应用程序不支持服务,所以我们已经在 java 中为 a
Time Tracker function clock() { var mytime = new Date(); var seconds
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
我有一个可以收集和显示各种测量值的产品(不会详细介绍)。正如人们所期望的那样,显示部分是一个数据库+建立在其之上的网站(使用 Symfony)。 但是,我们可能还会创建一个 API 来向第三方公开数据
我们将 SQL Server 从 Azure VM 迁移到 Azure SQL 数据库。 Azure VM 为 DS2_V2、2 核、7GB RAM、最大 6400 IOPS Azure SQL 数据
我正在开发一个使用 MongoDB 数据库的程序,但我想问在通过 Java 执行 SQL 时是否可以使用内部数据库进行测试,例如 H2? 最佳答案 你可以尝试使用Testcontainers Test
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 此问题似乎与 a specific programming problem, a sof
我正在尝试使用 MSI 身份验证(无需用户名和密码)从 Azure 机器学习服务连接 Azure SQL 数据库。 我正在尝试在 Azure 机器学习服务上建立机器学习模型,目的是我需要数据,这就是我
我在我的 MySQL 数据库中使用这个查询来查找 my_column 不为空的所有行: SELECT * FROM my_table WHERE my_column != ""; 不幸的是,许多行在
我有那个基地:http://sqlfiddle.com/#!2/e5a24/2这是 WordPress 默认模式的简写。我已经删除了该示例不需要的字段。 如您所见,我的结果是“类别 1”的两倍。我喜欢
我有一张这样的 table : mysql> select * from users; +--------+----------+------------+-----------+ | userid
我有表: CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL
我是一名优秀的程序员,十分优秀!