支持流应用中的阶段管理
1. 阶段基础概念
在数据库理论中,通常会采用封闭世界假设(CWA),即只有存储在数据库中的对象阶段被认为是真实的,其他阶段则被视为虚假的。此外,还定义了一个特殊阶段——“默认”阶段,当某个对象在给定时间点没有设置阶段或无法确定阶段时,会为其分配该默认阶段。
阶段可分为排他和非排他两种类型:
-
排他阶段
:例如,飞机在某一时刻要么在地面上,要么在空中,但不能同时处于这两种状态。这种情况下,这些阶段就是排他的,意味着它们为真的时间区间不会重叠。其定义如下:
定义 1:两种阶段类型 P1 和 P2 被称为排他的,当且仅当条件
∀o : ¬∃pi, ∈P1, pj ∈P2 : (pj.b ≤pi.b ∧pi.e ≤pj.e) ∨(pi.b < pj.b ∧pi.e > pj.e)
成立。
-
非排他阶段
:也称为正交阶段。例如,飞机可以同时在地面上并且处于移动状态。
阶段转换也是阶段语义的一个重要特征。通常,我们关注对象两个连续阶段的转换,以及对象所处的特定阶段序列。类似于有限状态机的常见定义,我们将允许的阶段转换定义为一个阶段转换函数:
δ : P × E →P
其中 P 是阶段的域,E 是事件的域。与有限状态自动机一样,δ 可能是部分函数,即存在 p ∈P,e ∈E 使得 δ(p, e) = ⊥,我们称这些未定义的“转换”为禁止转换。从默认阶段的转换是一个特殊情况,因为可能某个对象在处于某个特定阶段时首次存储在数据库中,但该阶段未知,所以允许从默认阶段向正常阶段的任何转换。
反之,主动数据库系统可以对事件引起的阶段变化做出反应。为此,可以定义一个输出函数 ϵ,它在阶段转换发生时引发事件:
ϵ : P × E × P →E
2. 阶段相关函数
为了便于在流系统中查询阶段,定义了一些阶段相关的函数:
-
对象是否处于某个阶段
:这是一个布尔函数,当对象 o 在特定时间 t 处于名为 n 的阶段时返回 true:
isInPhase(o, n, t) =
⎧
⎪
⎨
⎪
⎩
true,
if ∃p ∈P :
p.b ≤t ≤p.e ∧p.o = o ∧p.n = n
false,
else
- 阶段的持续时间 :阶段 p 的持续时间由以下公式给出:
duration(p) = p.e −p.b
- 排他阶段的时间顺序 :对于同一对象 o 上的排他阶段 p1 和 p2,可以根据它们各自的时间段定义时间顺序:
p1 ≤t p2 ⇔p1.b ≤p2.b (⇔def 1 p1.e ≤p2.e)
- 阶段是否按序列出现 :这是一个布尔函数,当对象具有给定的阶段时间序列时返回 true:
sequence(o, p1, p2, . . . , pn) =
{
true,
if p1 ≤t p2 ≤t . . . ≤t pn
false,
else
}
严格序列还确保给定序列中没有其他阶段干扰:
strictSequence(o, p1, p2, . . . , pn) =
⎧
⎪
⎪
⎪
⎨
⎪
⎪
⎪
⎩
true,
if p1 ≤t p2 ≤t . . . ≤t pn
∧∄pj /∈{pi, pi+1}, i ∈N : 1 ≤i < n :
pi ≤t pj ≤t pi+1
false,
else
- 前一个和下一个阶段 :这两个函数分别返回给定对象在特定时间点历史记录中的前一个和下一个阶段:
prev(o, t) = max({P|p.e < t ∧p.o = o})
next(o, t) = min({P|p.b > t ∧p.o = o})
3. 阶段评估
对阶段进行排名也是一项常见任务。可以使用与阶段相关的属性 p.a,该属性采用数值来表示相应状态 p 的相对重要性。这些值应允许对查询结果进行排序,从而实现排名机制。阶段的评估可能会随着系统收集到的关于某个对象特定阶段的新信息而动态变化。例如,“巡航”阶段通常可能被认为没有危险,但如果检测到大型飞机在相对较低的高度处于该阶段,则情况可能不同。阶段排名的增加或减少可以通过属性来体现,比如关注患者的病情是否恶化。
4. CQL 中的阶段应用
在 CQL 中应用阶段概念可以优雅地制定与阶段相关的查询。
-
阶段类型定义
:以空中交通监控为例,可以使用以下 DDL 语句定义阶段类型和阶段转换:
CREATE PHASE DOMAIN FlightPhase(
NAME standing FOLLOWED BY towing,taxiing;
NAME taxiing
FOLLOWED BY standing, takeoff;
NAME takeoff
FOLLOWED BY rej_takeoff,starting;...
NAME default
FOLLOWED BY ...;
INTEGER importance, ...);
这个阶段类型定义提供了各种飞行阶段的名称以及有效的阶段转换,还包含一个名为 importance 的与阶段相关的属性。在
CREATE TABLE
语句中,可以像使用内置数据类型一样使用
FlightPhase
域。
对于存储飞行数据流的表
tblFlights
,可以使用更新语句来更改被监控对象的阶段,例如:
UPDATE tblFlights
SET FlightPhase.name = "starting", FlightPhase.importance = 10
WHERE CallSign="AA1234";
阶段更新的语义类似于时态结构化查询语言(TSQL)中的状态更改,即不更改表的元组,而是插入一个新的元组副本,并将旧阶段的结束时间设置为当前系统时间,新阶段的开始时间也设置为系统时间,结束时间设置为“未定义”。
阶段变化总是由某些事件的发生触发,甚至可能导致进一步事件的“生成”。以下是飞行阶段的阶段转换表:
| 起始阶段 | 转换事件 | 下一阶段 | 结果事件 |
| — | — | — | — |
| taxiing | take off | starting | normal handover |
| starting | climb off | cruising | — |
| cruising | descend on landing | airport prepare | |
| landing | touch down | taxiing | follow me prepare |
| landing | take off | starting | alert |
| starting | descend on landing | alert | |
为了触发阶段更新,系统需要观察与阶段相关的事件。例如,以下连续查询用于确定着陆阶段:
SELECT S.*
FROM tbl_IOstream AS S, tbl_airports AS A
WHERE S.vertSpeed<0 AND S.flightLevel<3000 AND
dist(A.pos, S.pos)<20000
这里,飞机必须具有负垂直速度(即正在下降),飞行高度必须低于某个特定值(如 3000 英尺),并且必须在机场附近(例如距离小于 20 英里)。
dist
是一个用户定义的函数,用于计算地球上两个位置之间的欧几里得距离。
-
阶段查询
:可以使用前面定义的阶段函数来查询流时态对象的阶段。例如,以下查询选择过去一小时内起飞且现在处于巡航模式的所有航班,结果每小时连续更新:
SELECT CallSign
FROM tblFlights [Range 1 hour Slide 1 hour]
WHERE isInPhase(FlightPhase, "cruising", Now) AND
prev(FlightPhase, Now).name="takeoff"
isInPhase
函数实现了前面定义的功能,但它的第一个参数是阶段属性名而不是对象,因为在评估
WHERE
条件时,每个元组的对象 ID 是隐式提供的。如果
FROM
部分引用了多个表,可以在阶段函数中使用元组变量:
SELECT F1.CallSign,F2.CallSign
FROM tblFlights [ROWS 100] AS F1, tblFlights [ROWS 100] AS F2
WHERE isInPhase(F1,FlightPhase, "cruising", Now) AND
isInPhase(F2,FlightPhase, "starting", Now) AND
dist(F1.pos, F2.pos)<200
这个查询通过自连接来确定起飞和巡航航班的关键相遇情况。
确定当前飞行阶段也可以通过连续查询来完成,而无需使用显式的阶段概念,但使用阶段概念的真正优势在于可以从与时间相关的问题(如有效阶段序列或(历史)阶段持续时间)中抽象出来。例如,以下查询确定没有巡航阶段的汉莎航空航班的平均持续时间:
SELECT avg(duration(FlightPhase))
FROM tblFlights
WHERE CallSign like "LH%" AND
strictSequence(FlightPhase1,FlightPhase2) AND
FlightPhase1.name="starting" AND FlightPhase2.name="landing"
- 阶段评估查询 :在 CEP 中,阶段评估很重要。可以根据阶段的相对重要性对阶段进行排序,例如:
SELECT CallSign, FlightPhase.name
FROM tblFlights
ORDER BY FlightPhase.importance DESC;
同样,也可以使用
max
和
min
函数。对于阶段转换的评估,可以使用两个连续阶段的与阶段相关的属性值。例如,假设定义了一个
PatientState
域,其中包含一个根据正常、危急或监护等条件取值的排名属性,可以使用以下查询来确定所有病情恶化的患者:
SELECT ID, "deteriorating" AS
FROM tblPatients
WHERE strictSequence(PatientState1,PatientState2) AND
PatientState1.label < PatientState2.label
5. 阶段约束
使用阶段概念的真正好处是可以从阶段属性和阶段序列的与时间相关的问题中抽象出来。但是,系统需要自动检查为阶段类型所做的(隐式)假设,在数据库上下文中,这通常是完整性约束的任务。在流场景中,需要通过为阶段域自动生成的特定连续查询来检测这些异常。
当定义阶段域时,用户会提供有效的阶段转换。一个明显的异常是检测禁止的阶段转换,可以使用以下查询:
CREATE VIEW forbiddenTransitions AS
SELECT FlightPhase1 AS FP1, FlightPhase2 AS FP2
FROM tblFlights
WHERE strictSequence(FP1,FP2) AND
((FP1.name="cruising" AND FP2.name="starting") OR
(FP1.name="landing" AND FP2.name="cruising")
OR
(FP1.name="taxiing" AND FP2.name="cruising")
OR
... );
对于某些阶段必须排他的条件违反情况,也可以进行类似的检查。以下视图使用阶段的时间顺序找出同一对象同时处于活动状态的所有阶段:
CREATE VIEW simultanuousPhases
SELECT FlightPhase1, FlightPhase2
FROM tblFlights AS F1 JOIN tblFlights AS F1 ON F1.ID=F2.ID
WHERE FlightPhase1.name <> FlightPhase2.name AND
NOT(FlightPhase1<FlightPhase2 OR FlightPhase1>FlightPhase2)
6. 性能问题
在监控场景中,需要持续检测阶段变化并执行相应的阶段转换。数据流管理系统能够管理所有当前对象的阶段,因为需要处理的流元组数量远多于阶段变化的数量,这是因为阶段总是会持续一定的时间(阶段持续时间)。
然而,当需要持久存储阶段的完整历史记录时(通常情况),会出现问题。可以使用非常大的窗口表达式,或者使用支持历史管理的 DBMS(如 Oracle 的总召回技术)。由于阶段代表一种流概要,对其进行历史管理以进行统计分析是可行的。如果考虑引用历史阶段的连续查询,对存储阶段的访问必须与传入元组(事件)的频率相匹配。
一种可能的解决方案是应用 Magic Update 方法,该方法通过基于当前事件流引入辅助选择常量来确保最小化历史访问次数。目前,正在将阶段概念集成到 AIMS 项目中,以展示使用 Magic Update 处理当前和历史阶段的可行性。
7. 相关工作
SARI - SQL 是 SQL 的扩展,用于处理事件和事件关联,它可以分别查询阶段的开始和停止事件,但没有明确考虑阶段概念。TSQL2 语言定义的状态概念与这里讨论的阶段概念不同,在 TSQL2 中,状态表示元组属性在一段时间内的值,每次元组更改时会记录开始和结束时间点,但没有提供阶段标识符(名称)或关于有效阶段转换的隐式假设。阶段可以被解释为某些事件模式,相关的模式匹配在文献中已有讨论,高效检测不同事件模式类型的评估算法也可用于阶段检测。在 CEP 引擎中,事件通常只有一个时间戳而没有持续时间,虽然有方法为每个事件定义一个固定的有效时间间隔,但与阶段概念不同,该时间间隔在事件检测时确定,之后不能更改。
8. 结论
引入 CQL 中的阶段概念可以大大降低 CQL 查询的复杂性,并且非常自然地适用于移动对象监控场景。目前这项工作仍处于早期阶段,尚未对阶段的语法和语义进行全面讨论,但所提供的示例已经表明了该概念的实用性。许多与阶段相关的问题仍有待讨论,例如在监控场景中处理错过的事件观察或指定在给定事件序列中不能观察到某个特定事件,这些问题在 CQL 中难以表达,但对于定义某些阶段变化是必要的。
支持流应用中的阶段管理
9. 阶段管理的优势总结
阶段管理在流应用中具有显著的优势,主要体现在以下几个方面:
-
抽象时间相关问题
:阶段概念允许从时间相关的问题中抽象出来,如阶段属性和阶段序列。这使得查询更加简洁和易于理解,减少了处理复杂时间逻辑的负担。例如,在查询飞行阶段时,不需要手动处理每个阶段的时间范围,而是可以直接使用阶段名称进行查询。
-
简化查询表达
:通过使用阶段函数和阶段类型定义,可以更优雅地表达与阶段相关的查询。例如,使用
isInPhase
函数可以轻松判断对象是否处于某个阶段,而
strictSequence
函数可以确保阶段按特定顺序出现。
-
支持阶段评估
:阶段评估功能允许根据阶段的相对重要性对阶段进行排名和排序。这在需要对监控对象进行优先级处理的场景中非常有用,如医疗监控中对患者病情的评估。
-
自动约束检查
:系统可以自动检查阶段类型的假设,通过完整性约束或连续查询来检测异常,如禁止的阶段转换和阶段排他性的违反。这有助于确保数据的一致性和正确性。
10. 阶段管理的应用场景
阶段管理在多个领域都有广泛的应用场景,以下是一些常见的例子:
-
空中交通监控
:在飞行过程中,飞机处于不同的阶段,如滑行、起飞、巡航、着陆等。通过阶段管理,可以实时监控飞机的状态,检测异常阶段转换,并进行阶段评估,以确保飞行安全。
-
医疗监控
:在医疗领域,患者的病情可以分为不同的阶段,如正常、危急、监护等。阶段管理可以帮助医生实时了解患者的病情变化,及时采取相应的治疗措施。
-
工业生产监控
:在工业生产过程中,产品可能处于不同的生产阶段,如原材料采购、加工、组装、测试等。阶段管理可以帮助企业监控生产进度,优化生产流程,提高生产效率。
11. 阶段管理的实施步骤
要在流应用中实施阶段管理,可以按照以下步骤进行:
1.
定义阶段类型
:使用 DDL 语句定义阶段类型和阶段转换,包括阶段名称、有效阶段转换和阶段相关属性。例如:
CREATE PHASE DOMAIN FlightPhase(
NAME standing FOLLOWED BY towing,taxiing;
NAME taxiing
FOLLOWED BY standing, takeoff;
NAME takeoff
FOLLOWED BY rej_takeoff,starting;...
NAME default
FOLLOWED BY ...;
INTEGER importance, ...);
-
创建表并使用阶段域
:在
CREATE TABLE语句中,使用定义好的阶段域作为列的数据类型。例如:
CREATE TABLE tblFlights (
CallSign VARCHAR(10),
FlightPhase FlightPhase
);
- 更新阶段 :使用更新语句更改被监控对象的阶段。例如:
UPDATE tblFlights
SET FlightPhase.name = "starting", FlightPhase.importance = 10
WHERE CallSign="AA1234";
- 查询阶段 :使用阶段函数和 SQL 查询语句查询流时态对象的阶段。例如:
SELECT CallSign
FROM tblFlights [Range 1 hour Slide 1 hour]
WHERE isInPhase(FlightPhase, "cruising", Now) AND
prev(FlightPhase, Now).name="takeoff"
- 阶段评估 :根据阶段相关属性对阶段进行评估和排序。例如:
SELECT CallSign, FlightPhase.name
FROM tblFlights
ORDER BY FlightPhase.importance DESC;
- 约束检查 :使用连续查询检测阶段类型的异常,如禁止的阶段转换和阶段排他性的违反。例如:
CREATE VIEW forbiddenTransitions AS
SELECT FlightPhase1 AS FP1, FlightPhase2 AS FP2
FROM tblFlights
WHERE strictSequence(FP1,FP2) AND
((FP1.name="cruising" AND FP2.name="starting") OR
(FP1.name="landing" AND FP2.name="cruising")
OR
(FP1.name="taxiing" AND FP2.name="cruising")
OR
... );
12. 阶段管理的未来发展方向
虽然阶段管理已经显示出其在流应用中的实用性,但仍有许多方面需要进一步研究和发展:
-
处理复杂事件模式
:目前的阶段管理主要关注简单的阶段转换和序列,但在实际应用中,可能会遇到更复杂的事件模式,如嵌套阶段、并发阶段等。未来的研究可以探索如何处理这些复杂的事件模式。
-
实时性和性能优化
:在流应用中,实时性是一个关键问题。未来的研究可以致力于优化阶段管理的性能,减少查询响应时间,提高系统的实时性。
-
与其他技术的集成
:阶段管理可以与其他技术,如机器学习、人工智能等集成,以实现更智能的阶段评估和预测。例如,使用机器学习算法预测对象的未来阶段,提前采取相应的措施。
-
标准化和互操作性
:目前阶段管理的实现方式可能因系统而异,缺乏标准化和互操作性。未来的研究可以致力于制定阶段管理的标准,提高不同系统之间的互操作性。
13. 总结
阶段管理为流应用提供了一种有效的方式来处理和管理对象的不同阶段。通过引入阶段概念,可以降低 CQL 查询的复杂性,提高查询的可读性和可维护性。同时,阶段管理还支持阶段评估、约束检查等功能,有助于确保数据的一致性和正确性。虽然目前阶段管理仍处于发展阶段,但随着研究的深入和技术的进步,它有望在更多的领域得到广泛应用。
以下是一个简单的 mermaid 流程图,展示阶段管理的基本流程:
graph LR
A[定义阶段类型] --> B[创建表并使用阶段域]
B --> C[更新阶段]
C --> D[查询阶段]
D --> E[阶段评估]
E --> F[约束检查]
F --> G[持续优化和发展]
通过这个流程图,可以清晰地看到阶段管理的主要步骤和流程。从定义阶段类型开始,逐步进行表创建、阶段更新、查询、评估和约束检查,最后持续优化和发展阶段管理系统。
超级会员免费看

被折叠的 条评论
为什么被折叠?



