我有两种“元素”。一个生成时间序列(我们称它们为生成器元素),另一个基于应用于时间序列的一些逻辑规则成为“激活”(可激活元素)。
这种简化表示时间序列
CREATE TABLE data.time_series
(
generator_element_id uuid NOT NULL,
epoch bigint NOT NULL, -- UNIX epoch
level integer NOT NULL, -- values from 0 to 3
-- other fields
-- PRIMARY KEY (generator_element_id, epoch),
-- FOREIG KEY TO the table with the generator_elements
)
这个想法是,可激活元素是按照如下规则激活的
传奇:
- 发电机元件GE
- 可激活元素AE
IF (GE1 has level > 1 AND GE2 has level > 1) OR (GE3 has level > 2) for a given instant T1 THEN AE1 becames activated
我正在尝试找到在数据库中表示此逻辑规则的最佳方式,因为这些规则将由用户配置,并且可能包括“AND”和“OR”规则的多个组合
问题在于这种使用 AND 和 OR 的组合,好像它只是其中一种类型,我可以创建另一个表,其中包含不同类型的元素和阈值之间的关系。但是使用AND和OR的组合我很茫然..
我的第一个想法是使用纯字符串存储这些关系,类似于我之前描述的内容,但使用生成器元素的相应 UUID,然后有一个服务来处理这些规则,并决定激活或不激活元素。
我正在寻找这种方法的替代方案,因为我认为我的方法不能很好地扩展,我个人也不喜欢它......
对于上下文,我将 PostgreSQL 12.0 与 docker 一起使用
编辑:
澄清时代,因为不清楚。epoch 值不包括在逻辑规则“定义”中,它只包括元素及其级别(实际上它包括其他 id,但为了简单起见仅这两个变量)。
至于实际计算,记录将被检索并在每个时期的“箱”中分离。通过这种方式,我们将规则应用于该时期的记录(假设对于给定时期的所有生成器元素始终存在记录)
还添加了一些测试数据作为示例。在这种情况下,我将使用对应于 2020-02-14 00:00:00Z 的一个纪元值1581638400
INSERT INTO data.time_series
VALUES (
'00000000-0000-0000-0000-000000000001', -- uuid for GE1
1, --level
1581638400 -- epoch for 2020-02-14 00:00:00Z
)
INSERT INTO data.time_series
VALUES (
'00000000-0000-0000-0000-000000000002', -- uuid GE2
2, --level
1581638400 -- epoch for 2020-02-14 00:00:00Z
)
INSERT INTO data.time_series
VALUES (
'00000000-0000-0000-0000-000000000003', -- uuid GE3
0, --level
1581638400 -- epoch for 2020-02-14 00:00:00Z
)
在这里,作为我的建议指定的规则将适用于可激活元素 AE1:
-- Omiting the 0s for simplicity
"('000...01' > 1 AND '000...02' > 1) OR ('000...03' > 2)"
使用虚拟数据,结果将是 AE1 在规则的第一部分完成时被激活
但是通过在我的提案中保存规则的方式,我将为此制定一个特定的处理系统......
感谢任何帮助
我会写这个作为答案,即使它只是一些想法。以关系形式分解逻辑规则可能是浪费时间,我会简单地使用 XML 或 JSON 存储规则。解析器友好的格式,例如:
也许是有益的。请注意,这只是一个示例
这种格式可以很容易地转换为 SQL,如:
该
ge
属性可以构造为:你最终会得到如下查询:
因此,想法是将所有规则读入内存,当即将评估规则时,将其转换为 SQL,并针对 time_series 表执行查询。