Skip to main content

快照类实体

在有些场景下,实体的某些属性会随着时间变化。而在回答问题的时候,需要回溯历史,按照当时的实体属性做聚合计算,而不是最新的实体属性。 此功能便是为了解决此需求。类似的术语有:SCD(Slowly Changing Dimension)

综述

  • 在实体的 Schema 配置中,增加一个时间戳类型的属性,即可申明该实体 Schema 为快照类型。在选择时间戳类型的时候,同时要配置其数据粒度,通过granularity字段配置。
  • 在数据存储的时候,每一个时间戳粒度,都要保存全量实体数据。
  • 在实体表中,一般会有两个表达ID功能的属性。
    1. 一个属性建议名称叫sid。是用来表示每行唯一性的id。属性类型为ID类型。 同样的一个实体在不同时间戳粒度里,sid是不同的。
    2. 另一个属性是业务上用来表达该实体唯一性的id(即传统的ID属性),属性名称可以按照业务情况自取。属性类型为字符串类型。

举例

会员表实体建模如下:

{
"_id": "vip",
"type": "entity",
"name": "会员",
"properties": [
{
"name": "sid",
"type": "ID",
"constraints": {
"enum": null,
"unique": true,
"required": true
},
"ui": {},
"_id": "sid"
},
{
"name": "vipcode",
"type": "string",
"constraints": {
"enum": null,
"unique": false,
"required": true
},
"ui": {},
"_id": "vipcode",
"_sid": 1697077106304,
"is_comparable": false
},
{
"name": "grade",
"type": "category",
"constraints": {
"enum": null
},
"ui": {},
"_id": "grade",
"_sid": 1697077145830,
"is_comparable": false,
"is_name": false,
"is_categorical": true
},
{
"name": "ts",
"type": "timestamp",
"constraints": {
"enum": null,
"required": true
},
"ui": {},
"_id": "ts",
"_sid": 1697077163823,
"is_comparable": true,
"granularity": "month"
}
]
}

上面可以看到,ts字段,给实体加上了一个时间戳字段。即表明这张表是快照表。同时,还需要在专家模式中申明时间戳粒度:granularity字段。示例中,申明快照的时间间隔是一个月一次。可以申明成别的时间粒度,如day等。

对此 schema 导入如下数据:

[
{ "sid": "2023-09-01_001", "vipcode": "001", "grade": "C", "ts": "2023-09-01" },
{ "sid": "2023-10-01_001", "vipcode": "001", "grade": "B", "ts": "2023-10-01" },
{ "sid": "2023-10-01_002", "vipcode": "002", "grade": "C", "ts": "2023-10-01" }
]

以上数据表明,在 9 月份,一共只有一个会员。该会员等级为 C。到了 10 月份,有一位新增会员,并且老会员的等级上升到了 B。

此时如提问:9 月份会员数量,答案是 1。

其他表关联快照表

在其他表中,实体属性如果要关联快照表的话,该属性在数据库里面保存的字段需要是sid里面的值。