- 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/
我遇到以下问题。我想读取一个包含数百万行和数百列的大型 csv。我想向下转换列的数据类型。我的方法是读取 csv,然后使用 pd.to_numeric() 对其进行向下转换。我不知道列数及其类型。在读
目前,我从 SQL server (2008) 数据库获取数据。 cyurrent的方法是使用DataTable,然后将其传递并使用。 if (parameters != null)
我有以下问题。我有一个巨大的 csv 文件,想用多处理加载它。对于一个包含 500000 行和 130 列不同数据类型的示例文件,Pandas 需要 19 秒。我试过 dask 因为我想多处理阅读。但
是否有关于用于序列化各种 MFC 数据结构的二进制格式的明确文档?我已经能够在十六进制编辑器中查看我自己的一些类,并使用 Java 的 ByteBuffer 类读取它们(使用自动字节顺序转换等)。 但
我正在使用 Selenium 进行测试,我们用 HTML 文件编写测试用例,并用它们制作测试套件,我们的要求是编写足够健壮的测试用例,以根据测试环境改变自身。 为此,我不希望在 HTML 脚本本身中包
我需要一个 JavaScript 代码来读取存储为 .txt 文件的字典(或者也可以保存为任何其他类型的文件。它也可以在线获得)并将其内容存储在一个变量中。我不能找到一种让 JavaScript 像
我正在尝试遍历包含 SSH 登录和其他日志的日志文本文件。 程序正在返回 SSH 登录的总数。 我的解决方案确实有效,但似乎有点慢(在 200mo 文件上大约需要 3.5 秒)。我想知道是否有任何方法
我正在将大量数据从一个电子表格复制到工作簿中的其他 160 个电子表格。目前,Excel (2013) 遇到错误,因为它没有足够的资源来完成操作。 我的目标是将工作表 4 中 V13:XI1150 范
我正在尝试读取一个有 1147 行的文本文件。下面的代码仅读取第 1050-1147 行。我的目标是读取整个文件并提取位于不同行的特定值以在脚本中使用。一个示例是包含“BlockList: 2”的行中
我正在为游戏编写解释器。用户将其移动输入解释器,程序执行该移动。 现在我想为每个决定实现一个时间限制。玩家不应该能够思考超过 30 秒来写一个移动并按下回车。 call_with_time_limit
以this file例如,我正在尝试读取 data.frame 中的数据。来自 the doc (pdf 文件,表 1),它遵循一些 fortran 约定。我尝试了以下但收效甚微: dir 0' 将
我正在使用 R 阅读 Outlook 附件。我的引用在这里:Download attachment from an outlook email using R 这是我的电子邮件的截图: 这每天都会发送
我不会从表格中读取行来将主题放在列表中 php脚本 $url_obj='http://'.$host.':8069/xmlrpc/object'; $sock=new xmlrpc_client($u
我有一个这样的 csv 文件: id,name,value 1,peter,5 2,peter\,paul,3 我如何读取此文件并告诉 R "\," 不表示新列,仅表示 ","。 我必须添加该文件
我正在尝试读取 ~/Library/Preferences/com.apple.mail.plist (在 Snow Leopard 上)以获取电子邮件地址和其他信息以进入“关于”对话框。我使用以下代
This question already has answers here: How do I use floating-point division in bash? (19个回答) 5个月前关闭
本练习的目标是读取输入文件并将其存储到表中,然后验证输入中的某些字段并输出任何错误记录。我需要读取并存储每个策略组,以便表中一次仅存储 5 条记录,而不是整个文件。 所以我需要读取一个包含 5 条记录
据我了解,LWT 插入始终以 SERIAL 一致性级别完成。如果为 true,这是否意味着读取作为 LWT 插入的行可以安全地以 ANY 的一致性级别读取? 换句话说,我假设 LWT 插入是完全一致的
我看到很多很多通过java脚本读取cookie的函数,但我只想在变量中使用它一次,我是JS新手。 这是我的代码 var TheNumber = (Math.random() + '') * 10000
我正在使用 asp.net 和 C#。我在服务器上部署了一个应用程序[已发布],现在我想查看该网站的代码,据我所知,我可以阅读程序集来查看代码。 请告诉我如何实现它。 提前致谢。 最佳答案 您可以使用
我是一名优秀的程序员,十分优秀!