系统设计:大型数据表格

需求拆解

企业表格可能同时包含:

  • 百万级数据、排序、筛选和游标分页。
  • 固定列、拖拽列宽、列显隐和个性化配置。
  • 行选择、批量操作和单元格编辑。
  • 权限、导出和实时数据更新。

先确认哪些操作必须在客户端完成。百万级排序和筛选通常应放在服务端。

数据层

  • 查询条件写入 URL,支持刷新、分享和前进后退。
  • 使用游标分页避免数据变化造成页码漂移。
  • 缓存最近访问页,并预取相邻页。
  • 新查询开始时取消旧请求,防止旧响应覆盖新结果。
  • 导出由服务端生成异步任务,前端轮询或接收完成通知。

渲染层

核心方案是行虚拟化,列很多时再增加列虚拟化:

总滚动区域
└── 可见窗口
    ├── 上缓冲区
    ├── 真实渲染行
    └── 下缓冲区

固定行高最简单;动态行高需要测量并缓存高度,同时修正滚动偏移。为避免快速滚动白屏,可在可见区前后多渲染少量缓冲行。

编辑与一致性

  • 编辑草稿与服务端数据分离。
  • 只提交变化字段,并显示保存状态。
  • 乐观更新失败时回滚并保留用户输入。
  • 多人编辑可使用版本号或 ETag 做乐观并发控制。
  • 批量操作应展示部分成功结果,而不是只返回一个总失败。

状态划分

  • URL:查询、排序、筛选。
  • 服务端缓存:表格数据和总量。
  • 用户配置:列宽、列顺序、列显隐。
  • 局部状态:悬停、当前编辑单元格、临时选择。

不要让鼠标移动或输入事件更新整张表的全局状态。

性能验证

  • DOM 节点数是否保持稳定。
  • 滚动时主线程是否出现超过 50ms 的长任务。
  • 修改一个单元格时多少行发生重渲染。
  • 数据缓存是否有容量和过期策略。
  • 慢网下旧请求是否会覆盖新查询。