---
code: first_check_id
name: "首次事件校验"
wikiToken: VcMswVyheiYNqek35fKcFYiEnTg
parentWikiToken: Ljs3w406DiyDLnktFuAcHogInvg
updateTime: 1745309948000
sourceUrl: https://docs-v2.thinkingdata.cn/?version=v5.0&lan=zh-CN&code=first_check_id
---
# 首次事件校验

本章节将介绍 AE 系统的特殊数据结构——首次事件校验的使用方法。首次事件校验是一种数据过滤特性，在事件数据中加入唯一标识 ID，系统收到数据时会比对该 ID 之前是否出现，ID 已出现的数据将无法入库，未出现的数据可以入库，并记录该 ID，以此保证该 ID 首次出现的事件才会入库。

::: warning

 首次事件校验的性能开销较大，不建议在所有事件加入该校验，并且建议在 AE 工作人员的协助下进行使用

 :::

### 一、数据结构

使用”首次事件校验“特性，需要在数据中进行一个调整：

- 增加 ID 字段`#first_check_id`，类型必须是字符串，该字段是校验首次事件的标识 ID，该 ID 首条出现的数据将入库，之后出现的都无法入库。不同事件的`#first_check_id`互相独立，因此每个事件的首次校验互不干扰
以下是一条数据样例，可以关注`#first_check_id`的所在位置：

```
{
  "#account_id": "ABCDEFG-123-abc",
  "#distinct_id": "F53A58ED-E5DA-4F18-B082-7E1228746E88",
  "#type": "track",
  "#ip": "192.168.171.111",
  "#uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "#time": "2017-12-18 14:37:28.527",
  "#first_check_id": "123456",
  "#event_name": "test",
  "properties": {
    "argString": "abc",
    "argNum": 123,
    "argBool": true
  }
}
```

上述数据中的`#first_check_id`为"123456"，如果事件"test"之前已经入库了`#first_check_id`为"123456"的另一条数据，则该条数据无法入库，如果之前没有入库过，则该条数据可以入库

### 二、数据处理逻辑

AE 系统会为每一个事件维护一张 ID 表，不同事件之间 ID 表互相独立。

当系统收到带有`#first_check_id`的事件数据时，会在相应事件的 ID 表中查找该数据的`#first_check_id`，根据查询结果，会进行不同处理：

1. 如果 ID 表中不存在该`#first_check_id`，则该条数据通过校验，将会直接入库，并且 ID 表中将记录该`#first_check_id`
1. 如果 ID 表中存在该`#first_check_id`，则该条数据将被直接抛弃
如果同一个事件，既上传了带有`#first_check_id`的数据，也上传了不带有该字段的数据，那么不带有该字段的数据不会经过首次事件校验的处理，和通常的数据一致

::: tip

 除以上的关键逻辑外，此处还有两个注意点：

1.为了保证性能，系统采用定时批处理的方式进行判断，默认间隔为 1 小时，因此使用首次事件校验的事件数据会有默认 1 个小时的查询延迟

2."#first_check_id"在处理后不会记录在数据库中，如果需要记录，请使用一个事件属性记录

 :::

### 三、最佳实践

#### 设备新增

设备新增数据非常适合使用首次事件校验，可以在每次应用启动时，上报一条以设备 ID 作为`#first_check_id`的”设备新增“事件，根据首次事件校验的逻辑，只有设备 ID 首次出现的”设备新增“事件会被记录下来，之后出现的数据都会被抛弃。因此入库事件就是每个设备 ID 首次出现的事件，符合设备新增的逻辑。

以下是使用首次事件校验的”设备新增“事件的样例：

```
{
  "#distinct_id": "F53A58ED-E5DA-4F18-B082-7E1228746E88",
  "#type": "track",
  "#ip": "192.168.171.111",
  "#time": "2017-12-18 14:37:28.527",
  "#first_check_id": "device_id_123456",
  "#event_name": "new_device",
  "properties": {
    "device_id": "device_id_123456"
  }
}
```

该事件可以在每次应用启动时上报，并以设备 ID 作为`#first_check_id`；除此之外，也可以加入其它属性，比如”设备型号“，”来源渠道“等等，增加分析时的维度。 AE 客户端 SDK 或服务端 SDK，可查看对应 SDK 的接入指南，指南中“可更新事件”及“可重写事件”章节将会提供详细的接口调用方法
