> ## Documentation Index
> Fetch the complete documentation index at: https://docs.chaintable.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 选哪种表类型

> 四种表类型怎么选：看你的数据是状态、事件，还是别的。

建表时要选一个 Table Type，这是新用户遇到的第一个真正的决策点。选错不是致命的，但会让后面的写入逻辑变别扭，所以值得先想清楚。

## 决策表

| 你的数据长什么样                            | 选哪种类型           |
| ----------------------------------- | --------------- |
| 一旦发生就不会变的记录（转账、事件日志、交易）             | **Block Event** |
| 会随高度变化、你只关心"当前值 + 历史快照"的状态（余额、合约变量） | **Block State** |
| 按时间分桶的序列数据（价格、TVL、每分钟统计）            | **Time**        |
| 跟区块高度没关系的普通数据（配置、映射表、缓存）            | **Normal**      |

## 四种类型详解

<Columns cols={2}>
  <Card title="Block Event" icon="zap">
    只追加、不修改。一行数据一旦写入就是最终值，不会被同一行的后续写入覆盖。

    典型例子：代币转账明细、NFT 铸造记录。
  </Card>

  <Card title="Block State" icon="layers">
    随高度变化的状态。写入新值会更新"当前值"，同时平台自动保留历史高度的快照——你可以查任意历史高度当时的状态。

    典型例子：账户余额、合约配置。
  </Card>

  <Card title="Time" icon="clock">
    按固定时间桶（分钟级）组织的时序数据，写入时间会自动向后取整到整分钟。

    典型例子：价格、TVL 快照。
  </Card>

  <Card title="Normal" icon="table">
    不带区块语义的普通表。没有高度、没有共识的概念，就是一张随便读写的表。

    典型例子：地址标签映射、规则配置。
  </Card>
</Columns>

## Block Event 和 Block State 需要选链

建表时如果选择 Block Event 或 Block State，还需要指定 **Chain**——表要跟哪条链的区块高度对齐。保存后表名会自动加上链的后缀，比如 `myspace.transfers.eth`。

Normal 和 Time 类型不需要选链。

## 平台在背后帮你维护了什么

不管选哪种 Block 类型，平台都会自动为你的表维护几张辅助表，你平时不需要直接操作它们，但排查问题时会用到：

* **`_height`**：记录处理进度——已经覆盖到哪些高度区间。这是判断"数据到底有没有写完"的权威来源。
* **`_archive`**（仅 Block State）：保留每个历史高度的快照，才能支持"查任意历史高度的状态"。
* **`_write`**：批量写入（回填）任务的执行状态，一次回填成功没有、写了多少行都在这里查。

<Card title="查看数据完整性、找出缺失高度" icon="chart-bar" href="/indexing/tables/completeness">
  怎么用 `_height` 判断数据有没有洞
</Card>
