首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >制造工艺周期时间数据库设计

制造工艺周期时间数据库设计
EN

Stack Overflow用户
提问于 2015-09-29 08:27:30
回答 1查看 565关注 0票数 0

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

假设某一产品的特定工艺,比如焊接,理论上大约需要10秒(流程周期时间)。由于各种问题,机器的实际循环时间将在一天中发生变化。我想把机器的实际周期时间储存在一整天,并分析它的时间(天,周,月)。我该如何设计数据库呢?

我考虑过使用时间序列数据库,但我认为这是不合适的--循环时间数据有一个开始时间和一个结束时间--基本上我是在测量时间随时间变化的性能--如果这甚至是有意义的话。同时,我也担心使用关系数据库存储并显示/分析与时间相关的数据效率低下。

如对良好的数据库结构有任何想法,将不胜感激。如果需要更多的信息,请告诉我,我很乐意编辑这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-14 20:11:46

您正在跟踪事件的发生。这个事件(焊接)在某个时候开始,在某个时候结束。对事件实体进行如下建模可能很有诱惑力:

代码语言:javascript
复制
StationID StartTime StopTime

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

代码语言:javascript
复制
      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字段:

代码语言:javascript
复制
StationID StartTime
      17  08:00:00 
      17  09:00:00

每个入口标志着焊接的开始。焊缝的结束由下一次焊接的开始指示。这简化了数据模型,使得不可能有空白或重叠,更精确地匹配我们正在建模的系统。

但是我们需要两行的数据来确定焊缝的长度。

代码语言:javascript
复制
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,所以查询将只使用索引数据。

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

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

代码语言:javascript
复制
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时的条目代表休息的开始。现在我们只需要附加行

代码语言:javascript
复制
where  w1.Status = 'C'

到上面查询的末尾。因此,'B‘条目提供了前一个周期的结束时间,但不启动另一个周期。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32839263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档