我想要创建一个数据库来存储进程周期时间数据。例如:
假设某一产品的特定工艺,比如焊接,理论上大约需要10秒(流程周期时间)。由于各种问题,机器的实际循环时间将在一天中发生变化。我想把机器的实际周期时间储存在一整天,并分析它的时间(天,周,月)。我该如何设计数据库呢?
我考虑过使用时间序列数据库,但我认为这是不合适的--循环时间数据有一个开始时间和一个结束时间--基本上我是在测量时间随时间变化的性能--如果这甚至是有意义的话。同时,我也担心使用关系数据库存储并显示/分析与时间相关的数据效率低下。
如对良好的数据库结构有任何想法,将不胜感激。如果需要更多的信息,请告诉我,我很乐意编辑这个问题。
发布于 2015-10-14 20:11:46
您正在跟踪事件的发生。这个事件(焊接)在某个时候开始,在某个时候结束。对事件实体进行如下建模可能很有诱惑力:
StationID StartTime StopTime每个焊接站都有一个唯一的标识符。一些示例数据可能如下所示:
17 08:00:00 09:00:00
17 09:00:00 10:00:00为了简单起见,我将时间设置为大值(每个值1小时),并删除日期值。这告诉你,17号焊接站在早上8点开始焊接,9点完成,第二次焊接在上午10点开始。
这看起来很简单。但是,请注意,第一个条目的StopTime与第二个条目的StartTime匹配。当然,一个焊缝的结束标志着下一个焊接的开始。系统就是这样设计的。
但这设置了我所称的行生成依赖关系反模式:其中一个行的一个字段的值必须与另一个字段的值同步。
这会造成任意数量的问题。例如,如果第二个条目的StartTime显示'09:15:00‘怎么办?现在,我们有一个15分钟的差距之间的第一次焊接结束和开始下一次。系统不允许有间隙--每个焊缝的结尾也会启动下一个焊缝。应该如何解释这一差距。第一行的StopTime是错误的。第二行的StartTime错误吗?都错了吗?还是他们之间又有一次争吵被删除了?无法判断哪一种解释是正确的。
如果第二个条目的StartTime显示'08:45‘怎么办?这是一个重叠,第二个周期的开始应该是在第一个周期结束之前开始的。同样,我们无法知道哪一行包含错误的数据。
跨行依赖项允许出现空白和重叠,数据中不允许这两种情况。需要大量的数据库和应用程序代码来防止这种情况的发生,当它发生时(确实会),就无法确定哪些数据是正确的,哪些是错误的--而不是从数据库中。
一个简单的解决方案是完全取消StopTime字段:
StationID StartTime
17 08:00:00
17 09:00:00每个入口标志着焊接的开始。焊缝的结束由下一次焊接的开始指示。这简化了数据模型,使得不可能有空白或重叠,更精确地匹配我们正在建模的系统。
但是我们需要两行的数据来确定焊缝的长度。
select w1.StartTime, w2.StartTime as StopTime
from Welds w1
join Welds w2
on w2.StationID = w1.StationID
and w2.StartTime =(
select Max( StartTime )
from Welds
where StationID = w2.StationID
and StartTime < w2.StartTime );这似乎是一个更复杂的查询,如果开始和停止时间在同一行--而且,是的--但是想想所有不再需要编写和在每个DML操作中执行的检查代码。而且,由于StationID和StartTime的组合将是明显的PK,所以查询将只使用索引数据。
有一个补充建议。一天的第一次焊接或休息后(如午餐)和当天或休息前的最后一次焊接怎么办?我们必须努力不把休息时间作为循环时间。我们可以在查询中包含检测这种情况的智能,但这将增加更多的复杂性。
另一种方法是在记录中包含一个状态值。
StationID StartTime Status
17 08:00:00 C
17 09:00:00 C
17 10:00:00 C
17 11:00:00 C
17 12:00:00 B
17 13:00:00 C
17 14:00:00 C
17 15:00:00 C
17 16:00:00 C
17 17:00:00 B所以前几个条目代表一个周期的开始,而中午和下午5时的条目代表休息的开始。现在我们只需要附加行
where w1.Status = 'C'到上面查询的末尾。因此,'B‘条目提供了前一个周期的结束时间,但不启动另一个周期。
https://stackoverflow.com/questions/32839263
复制相似问题