制造过程周期时间数据库设计

Manufacturing process cycle time database design

我想创建一个数据库来存储流程周期时间数据。例如:

比如说某种产品的特定工艺,比如焊接,理论上需要大约 10 秒才能完成(工艺循环时间)。由于各种问题,机器的实际循环时间会全天变化。我想全天存储机器的实际循环时间,并随着时间的推移(天、周、月)对其进行分析。我将如何为此设计数据库?

我考虑过使用时间序列数据库,但我认为它不合适 - 周期时间数据有开始时间和结束时间 - 基本上我是在测量时间性能随时间的变化 - 如果这甚至有意义的话。同时,我也担心使用关系型数据库存储然后 display/analyze 时间相关数据效率低下。

任何关于良好数据库结构的想法都将不胜感激。让我知道是否需要更多信息,我很乐意编辑这个问题

您正在跟踪事件的发生。事件(焊接)在某个时间开始并在某个时间结束。像这样对事件实体建模可能很诱人:

StationID StartTime StopTime

每个焊接站都有一个唯一的标识符。一些示例数据可能如下所示:

      17  08:00:00  09:00:00
      17  09:00:00  10:00:00

为简单起见,我将时间设置为较大的值(每次 1 小时)并删除了日期值。这告诉您焊接工位 #17 在早上 8 点开始焊接并在上午 9 点完成,此时第二个焊接开始并在上午 10 点完成。

这看起来很简单。但是请注意,第一个条目的 StopTime 与第二个条目的 StartTime 匹配。当然可以,一个焊接的结束标志着下一个焊接的开始。系统就是这样设计的。

但这建立了我所说的跨行依赖反模式:其中一行的一个字段的值必须与另一行中的另一个字段的值同步。

这会产生许多问题。例如,如果第二个条目的开始时间显示为“09:15:00”怎么办?现在我们在第一次焊接结束和下一次焊接开始之间有 15 分钟的间隔。该系统不允许间隙——每个焊接的结束也开始下一个焊接。应该如何解释这个差距。第一行的StopTime是不是错了。第二行的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 的组合是明显的主键,因此查询将仅使用索引数据。

还有一项建议。当天或休息后(如午餐)的第一次焊接和当天或休息前的最后一次焊接怎么样?我们必须努力不将休息时间作为周期时间。我们可以在查询中包含检测这种情况的智能,但这会增加更多的复杂性。

另一种方法是在记录中包含状态值。

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' 条目提供前一个循环的结束时间但不开始另一个循环。