这次我们来看一个很多人已经在用、但大多数人只把它当作“云笔记”的工具:Notion。我要做的事不是介绍记笔记的排版技巧,而是把它当成一套轻量级数据库系统来用,搭出一个能长期维护的阅读追踪器:书单管理、阅读状态、评分、翻开与读完时间、系列进度、年度阅读统计、金句摘录,全部放在同一个工作区里。
Notion 的核心不是“好看”,而是它的 Page + Database 组合能自己造出一套结构化数据模型。默认视图可以用表格、看板、日历、画廊来切换;字段与字段之间可以用 Relation(关联)和 Rollup(汇总)打通;阅读统计不需要手动记账,公式会自动算出年份、阅读耗时、是否在计划年内完成等信息。对个人读者来说,这个方案替代记账式 App 的最大优势是自由,字段随便加,视图随便切,不想看统计时就直接把它当读书清单用。
这篇文章会从头搭建一套完整的 Notion 阅读追踪器,内容包括:书目库字段设计、状态看板与年度视图、系列书籍进度、金句库独立记录、Formula 统计公式、Notion API 批量录入和异常排查。适合正在找 Notion 模板但找不到完全满足需求的读者,也适合已经读过一些 Notion 基础教程、想真正理解数据库属性和关联逻辑的技术向用户。整套方案以免费版个人使用为前提,重点是可复制、可修改、可迁移。
1. Notion 阅读追踪器核心能力速览
| 能力项 | 说明 |
|---|---|
| 产品类型 | 在线协作笔记 + 结构化数据库,不止是笔记工具 |
| 是否免费 | 个人使用时免费版基本足够,有上传容量与协作人数限制,需以 Notion 官方最新定价为准 |
| 登录方式 | 网页版登录、Windows/macOS 客户端、iOS/Android App,数据多端同步 |
| 数据组织 | Page(页面)、Database(数据库)、Database View(视图)三层结构 |
| 阅读追踪能力 | 书单、状态流转、开始/读完日期、评分、分类标签、系列关联、金句摘录、年度统计 |
| 视图类型 | Table(表格)、Board(看板)、Calendar(日历)、Gallery(画廊)、List(列表)、Timeline(时间线) |
| 自动统计 | Formula(公式)、Relation(关联)、Rollup(汇总)组合实现,不必手动维护计数 |
| API 能力 | Notion API 支持新增、读取、更新、归档 Page;可做批量录入和状态更新 |
| 批量导入 | 可从 CSV/表格数据迁移,也可以通过 API 脚本批量写入 |
| 适合人群 | 阅读量大且希望长期维护记录的人;想用同类结构管理案例库、资料库的技术从业者 |
Notion 的优点是模板自由度高,缺点同样是模板自由度高:别人分享的模板不一定符合你的阅读习惯。所以我更建议先照着下面的结构亲手把数据库建一遍,真正理解字段之间的关系,再改成自己的版本。
2. 适用场景与使用边界
2.1 这个追踪器能解决什么问题
它的核心使用场景有三个。
第一个是“读过就丢”的问题。很多人读完一本书之后,只记得“好像读过”,完全想不起内容、想不起当时为什么读、想不起哪句话触动过自己。阅读追踪器把书名、作者、类型、状态、评分、金句、读后感放在同一条记录里,读过的每本书都有可检索的档案。
第二个是“阅读没有反馈”的问题。很多人不是不爱读,是读完之后没有复盘入口。Notion 里只要把状态从“在读”改成“已读”,顺手填一个评分和一句话短评,年度统计就会自动变化。这种轻量反馈能让人更愿意记录。
第三个是“系列书追到一半忘了”的问题。某些系列动辄十几本,下一本出的时候已经想不起上一本讲到哪了。用 Relation 把同一系列的书关联起来,在看板视图里就能看到“系列 A 已读 3 本、在读 1 本、还有 2 本待读”,不用手动数。
另外,这个结构不只是用来管书。把“书名”换成“案例名称”,把“状态”换成“审阅进度”,把“金句”换成“裁判要旨”,就接近一个律所案例库;把“作者”换成“视频作者”,“系列”换成“选题专题”,又能当内容灵感库使用。
2.2 不适合什么场景
Notion 是云端 SaaS,不是本地部署软件。数据会上传到官方服务器,个人阅读记录通常没问题,但带有保密性质的材料不建议放进去。图书全文、受版权保护的电子书内容也不应该大段复制到 Notion 里用于二次分发。
如果只是想简单记录“今年读了几本”,这个方案会显得略重,使用自带统计的阅读 App 可能更快。真正值得用 Notion 的前提,是你希望把“阅读数据”和“笔记内容”打通,并能自己调整字段、视图和统计逻辑。
3. 环境准备与基础操作
3.1 注册账号与网页版登录
Notion 的入口是官方网站产品域名。打开官网后,使用邮箱、Google 账号或 Apple 账号都可以创建个人工作区。日常使用如果不想安装客户端,直接在浏览器里完成网页版登录即可。首次进入工作区时,系统会创建默认的 Teamspace 和个人页面,这部分可以后续自行清理。
需要注意:网页版对网络环境有一定要求。如果当前网络能正常打开官网,浏览器登录一般就不会有太大问题;如果某些网络环境下页面加载慢,最直接的做法是切换网络环境或使用客户端缓存后再操作。排查问题时优先检查是否已经进入工作区、页面是否因为多账号登录而切到了错误的工作区。
3.2 客户端不是必需
Windows、macOS、iOS、Android 都有对应客户端。桌面客户端适合长时间打字整理笔记,操作手感更接近原生应用;浏览器版的好处是换设备时不需要安装,登录即可访问。阅读记录这种低频更新场景,用网页版完全够用。
个人建议:日常记录用网页版或手机 App,集中整理书单时用桌面客户端。无论从哪个端进入,数据都实时同步,不需要手动保存。第一次使用时最好同时在一台设备和网页版登录,验证同步是否正常,避免误以为数据丢失。
3.3 先理解 Page 与 Database 的关系
在动手前需要建立两个基础概念:
- Page:Notion 里的一个“页面”,可以单独存在,也可以放在某个页面里。阅读追踪器最好先建立一个顶层 Page,比如叫“我的阅读追踪器”,所有数据库都挂在这个页面下面。
- Database:数据库可以内嵌在 Page 中,也可以作为独立页面展示。数据库里的每一行记录,本身又是一个 Page,可以单独打开写长文笔记。
理解这一点后,后续搭建就简单了:书库、金句库、系列库,本质上都是不同类型的 Database,它们之间通过 Relation 连接。
4. 创建阅读追踪器的数据库与字段
4.1 新建阅读 Page 并插入数据库
先在你的 Notion 工作区左侧点击“+”新建页面,命名为“阅读追踪器”。在这个页面里输入/table,选择创建一个表格数据库。Notion 会生成一个带默认 Name 属性的数据库。
接下来需要把数据库名称改成“书目库”,然后进入数据库右上角的属性设置,把默认字段删掉或改写成自己的字段。第一次建议只做最小字段:书名、作者、状态、开始日期、读完日期、评分、类型。后面需要时再加 Relation 和 Rollup。
4.2 常用属性设计
| 属性名称 | 属性类型 | 用途说明 |
|---|---|---|
| 书名 | Title | 数据库的标题项,不能删除 |
| 作者 | Rich Text | 文本字段,适合记录多作者 |
| 状态 | Select | 建议选项:待读 / 在读 / 已读 / 弃读 |
| 类型 | Multi-select | 可多选:虚构、非虚构、科幻、历史、技术、自我提升等 |
| 阅读形式 | Select | 纸质书 / 电子书 / 有声书 |
| 开始日期 | Date | 开始阅读的日期 |
| 读完日期 | Date | 读完日期,年度统计的关键字段 |
| 评分 | Number | 1 到 10 的整数 |
| 是否想再读 | Checkbox | 勾选表示愿意重读 |
| 一句话短评 | Rich Text | 看完后马上写一句,避免过期遗忘 |
| 所属系列 | Relation | 指向系列数据库,后续章节说明 |
| 笔记链接 | URL | 如果有独立读书笔记页面,可以放链接 |
属性类型不要一上来全加。原则是:状态、日期、评分这类每个记录都会用到的字段先加,而系列、统计字段放到第二批次,等基础记录能正常建完再补。字段过多会降低记录意愿,最小可用是第一批记录能顺畅完成后逐步叠加。
4.3 把新记录模板设好
书目库右上角新建记录按钮旁边通常有模板入口。建议建立一个“默认书籍模板”,模板内容包含:
- 一段备注正文块,用于写读前期望或读后感受;
- 金句模块提示:从第几页复制过来的,标记页码;
- 复读检查:读完后是否值得二刷。
这里的目的是降低录入成本。新建一本书时只需要填标题和作者,其他正文结构由模板自动生成,后续读的过程中慢慢补内容,不要要求自己在建卡时填完所有字段。
5. 视图设计:状态看板、年度统计与系列追踪
数据库默认是 Table 视图。表视图适合快速录入和批量编辑,但不是阅读过程的主界面。建议在数据库页面再添加几个视图,每个视图解决一个具体问题。
5.1 状态看板:管理“现在读什么”
在“阅读追踪器”页面中的书目库数据库右上角,点击“+ 添加视图”,选择 Board(看板)。看板的分组字段选择“状态”,这样数据库就会自动按“待读、在读、已读、弃读”四列展示。
实际操作时,每天打开 Notion 只看两个列表:如果在读列表超过三本书,说明当前的阅读有点散;如果想开始新书,就去待读列表里挑。把一张卡片从“在读”拖到“已读”时,顺手补上读完日期和评分,这个动作就是整个追踪器的核心闭环。
如果一个列表里的书太多,可以再用“类型”或“阅读形式”筛选;也可以按某个多选字段分组,比如把看板按“年份”分组后,每列代表一个年份的阅读任务。
5.2 年度阅读统计视图
很多人不需要特别复杂的统计,只想看到“今年读了多少本”。在书目库添加一个 Table 视图,按“读完日期”字段做筛选,条件设为“在过去一年内”或“是 2025 年”。
Notion 数据库底部会自动显示当前筛选结果的行数,这个数字就是“今年已读数量”。如果想按年份固定统计,可以给“读完日期”加一个 Formula 辅助字段,把每条记录的读完年份提取出来,再按年份分组或筛选。Formula 写法会在第 7 节展开。
另一种更直观的做法是把视图类型换成 Calendar,日期字段选“读完日期”。这样每本书会落在对应的月份和日期上,日历视图能清楚看出每月的阅读节奏。
5.3 系列追踪:先建“系列库”再关联
很多阅读 App 只能管理单本书,对“系列书”支持很弱。在 Notion 里,这个问题的解法是额外建一个“系列库”。
新建“系列库”数据库,字段设计:
| 属性名称 | 属性类型 | 用途 |
|---|---|---|
| 系列名称 | Title | 例如“三体”“哈利波特” |
| 书籍 | Relation | 关联到书目库,多选当前系列包含的书籍 |
| 系列进度 | Rollup | 从关联书籍中读取“状态”字段 |
| 下一本待读 | Text | 手动记录下一本开读哪部 |
| 是否完结 | Checkbox | 系列是否已经全部出版 |
之后回到“书目库”的数据库里,新建 Relation 属性,名称为“所属系列”,关联到“系列库”。此时系统会要求选择一个关联方式,选择“多选”,并勾选对应反向属性“书籍”。
这样操作后,任意一本《三体 1》都可以放进“三体系列”下。打开系列库里的“三体”记录,就能看到这个系列包含的所有书籍,以及它们当前的状态。使用 Rollup 可以把关联书目状态汇总出来,这部分在第 7 节再细化。
6. 金句库设计:记录、回看和引用
6.1 单独建立金句数据库
“金句”建议不要直接堆在书籍 Page 的正文里。堆在正文里的问题是不可检索、不可排序,也难统计。更合理的做法是再建一个“金句库”数据库,每条金句独立成一行。
金句库字段建议:
| 属性名称 | 属性类型 | 用途 |
|---|---|---|
| 金句 | Title | 金句正文 |
| 出自哪本书 | Relation | 关联到书目库 |
| 作者 | Rollup 或 Rich Text | 直接从关联书籍中带出作者 |
| 页码 | Number | 纸质书对应的页码 |
| 标签 | Multi-select | 例如“写作”“认知”“人物描写” |
| 收藏原因 | Rich Text | 为什么这句值得记录 |
| 摘录日期 | Date | 记录日期 |
为什么“出自哪本书”要用 Relation 而不是直接打书名纯文本?因为用了 Relation 后,打开某本书时可以看到所有摘录;某个作者相关金句则可以通过关联字段做二次筛选。Relation 的价值就是把两条不同数据库的数据串联起来。
6.2 阅读过程中快速录入
读纸质书时用手机 App 录入最快:打开“金句库”,新建一行,书名从关联字段中选择,金句直接打字或语音输入,页码随手填。读电子书时可以直接复制文本,但要注意版权边界,摘录少量用于个人笔记可以理解,不能把整本书放进去。
如果需要更快速的方式,可以在“阅读追踪器”页面里配置一个 /button 类型的按钮,点击按钮后自动向金句库新增一行预设 Page,并默认关联当前正在读的书。Notion 的按钮功能在不同版本中位置略有差异,但思路一致:减少新建记录时的重复操作。
6.3 从金句反向回顾
很多人的金句库建了之后就再没打开过。要避免这个问题,可以每月用金句库的 Gallery 视图看一次,按标签筛选某类主题,或者用随机排序的方式重新看到过去两个月摘录的内容。金句库不与阅读状态直接挂钩,它的价值是长期积累后形成的词条库,能服务于写作甚至内容选题。
7. 统计不手算:Formula、Relation 与 Rollup
7.1 用公式提取读完年份
手动维护年份字段完全没必要。在书目库中添加一个新的 Formula 属性,命名为“读完年份”,用下面的公式把“读完日期”的年份提取出来:
if(prop("状态") == "已读", year(prop("读完日期")), 0)这段公式的意思是:仅当状态为“已读”时,返回读完日期的年份;否则返回 0。这样所有未读完的书不会出现在“按年份统计”的视图里。提取出年份后,新增一个 Table 视图,按“读完年份”分组,就能看到每年的完成数量。
注意:Notion 公式对字段名敏感。如果你的属性不叫“状态”而叫“Status”,公式需要对应改成英文。若日期为空时出现报错,优先检查“已读”的书是否都填了“读完日期”。
7.2 计算单本书阅读耗时
在书目库中再添加一个 Formula 属性“阅读天数”,公式写法如下:
dateBetween(prop("读完日期"), prop("开始日期"), "days")这个值表示从开始到读完经过的天数。阅读时长更科学的记录方式是每次读完后记下“读了多少分钟”,但那样的字段录入成本太高。天数统计已经能提供基本反馈,例如“这本书读了一整年”和“这本书三天读完”,两者体验完全不同。
计算结果是负数时,说明开始日期晚于读完日期,属于录入错误。公式只能处理已有日期,无法自动纠错,所以录入日期要统一格式,格式错误会造成统计偏差。
7.3 系列进度用 Rollup 汇总
Rollup 是 Notion 里最容易误解但也最实用的属性。它的作用是从 Relation 关联到的另一张数据库中读取某个属性并进行汇总计算。
在系列库中添加 Rollup 属性,操作方式如下:
- 属性类型选 Rollup;
- 数据来源选择“书籍”这个 Relation;
- 要读取的属性选择“状态”;
- 计算方式如果选项不多,可以使用“显示原始值”或“统计值数量”。
严格来说,Notion 的 Rollup 并不像 SQL 一样能直接执行带 WHERE 条件的 COUNT。要准确统计某个系列里处于“已读”状态的书数量,常见做法是先让 Rollup 展示所有关联书籍的状态列表,再用 Formula 对列表进行计数,写成:
length(filter(prop("状态列表"), current == "已读"))这要求你的 Notion 版本支持新版 Formula 对数组类型操作。如果版本不兼容或不想写公式,更稳定的替代方案是直接在系列数据库中使用分组视图:先按 Relation 字段分组,再统计组内书籍数量。操作路径不同,结果一致。
8. 进阶:Notion API 做批量录入与状态更新
前几节的方案完全不需要代码,普通用户在网页端就可以完成。但如果你是技术背景,想把阅读库数据接入自己的工具,或要批量迁移已有书单,更高效的做法是调用 Notion API。
8.1 准备 Integration Token
在 Notion 页面中打开设置,进入“连接”或“开发者”部分,找到“新建集成”。创建一个名为“Reading Tracker Bot”的内部集成,获得一串以ntn_开头的 Secret Token。
拿到 Token 后,需要把集成连接到目标数据库:打开要操作的“书目库”数据库页面,点击右上角菜单,选择“连接到”,在下拉列表中找到刚创建的集成。没有这一步,即使 Token 正确,API 也会返回 404 或无权限。
API 的数据库 ID 可以从页面 URL 中提取。打开“书目库”数据库独立页面后,URL 里形如https://www.notion.so/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx?v=...的 32 位字符串就是数据库 ID。可以在脚本里把 ID 保存为环境变量,不要直接硬编码到公开仓库。
8.2 用 Python 新增一条阅读记录
下面代码演示通过 Notion API 向“书目库”新增一本《三体》:
import os import requests NOTION_TOKEN = os.getenv("NOTION_TOKEN") DATABASE_ID = os.getenv("READING_DATABASE_ID") headers = { "Authorization": f"Bearer {NOTION_TOKEN}", "Content-Type": "application/json", "Notion-Version": "2022-06-28", } payload = { "parent": {"database_id": DATABASE_ID}, "properties": { "书名": { "title": [{"text": {"content": "三体"}}] }, "作者": { "rich_text": [{"text": {"content": "刘慈欣"}}] }, "状态": { "select": {"name": "待读"} }, "类型": { "multi_select": [{"name": "科幻"}] }, "评分": { "number": 0 } } } response = requests.post( "https://api.notion.com/v1/pages", headers=headers, json=payload, timeout=30, ) print(response.status_code) print(response.json())这里请求参数里的属性名必须与数据库里实际属性名一致。例如数据库里的属性名是英文的 “Status”,这里就要写 “Status”,而不是“状态”。字段名不匹配时会被 Notion 直接忽略,不会立即报错,这是 API 使用时最容易踩的坑。
8.3 用 ISBN 元数据自动补全书目
录入大量书的时候,一条条手动写“书名、作者、类型”效率太低。可以通过公开的图书元数据接口,按 ISBN 查询信息,再写入 Notion。下面的代码会按 ISBN 查询 Google Books API:
import requests isbn = "9787536692930" resp = requests.get( "https://www.googleapis.com/books/v1/volumes", params={"q": f"isbn:{isbn}"}, timeout=15, ) data = resp.json() if data.get("totalItems"): volume = data["items"][0]["volumeInfo"] print(volume.get("title")) print(volume.get("authors"))这个接口的作用是自动带出书名、作者、出版社、出版日期等元数据。把这段代码与上一节的 Notion 写入代码拼接后,就能实现“输入 ISBN,自动建立一条阅读记录”。使用第三方元数据时要确认数据来源与使用边界,避免过度抓取不可靠信息。
8.4 批量写入与失败重试原则
批量录入真正要处理的是接口限流和网络抖动。Notion API 有频率限制,短期请求过多会返回 429 错误,并在响应头中返回 Retry-After 字段。规范的批量脚本应该包含退避重试逻辑:
import time import requests def create_book(book_data): url = "https://api.notion.com/v1/pages" headers = { "Authorization": f"Bearer {NOTION_TOKEN}", "Content-Type": "application/json", "Notion-Version": "2022-06-28", } payload = { "parent": {"database_id": DATABASE_ID}, "properties": { "书名": {"title": [{"text": {"content": book_data["title"]}}]}, "状态": {"select": {"name": "待读"}} } } for attempt in range(5): resp = requests.post(url, headers=headers, json=payload, timeout=30) if resp.status_code in (200, 201): return resp.json() if resp.status_code == 429: wait = resp.headers.get("Retry-After", "1") time.sleep(int(wait)) continue if resp.status_code >= 500: time.sleep(2 ** attempt) continue print(resp.text) break return None批量任务前先用一条测试记录验证 Token、数据库 ID 和字段名是否正确。不要直接对几千条记录运行未验证过的脚本,一旦字段名写错,就会出现大量只含“书名”的空壳记录。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 登录后看不到“阅读追踪器”页面 | 登录到了新工作区,或页面被误删 | 检查左侧页面树和最近访问列表 | 切换回正确工作区,在回收站恢复误删页面 |
| 网页版加载缓慢或无法打开 | 网络到官方服务的连接不稳定 | 检查浏览器控制台网络请求,尝试换网络环境 | 使用客户端缓存数据,或稍后重试 |
| 创建的数据库不是表格 | 页面里先输入了其他块类型 | 删除当前块,输入 /table 再创建 | 也可以新建 Page 后使用表格数据库视图 |
| 数据库没有“状态”字段 | 删除时误删了默认字段 | 进入数据库属性设置查看 | 新建“状态”属性,类型选 Select,手动添加选项 |
| 状态看板没有自动分组 | 看板视图未设置分组 | 点击视图顶部 Group 设置 | 将分组字段改为“状态” |
| 公式显示 0 而不是年份 | 该条记录状态不是“已读”,或读完日期为空 | 检查记录状态和日期 | 补全读完日期,公式只处理已读记录 |
| Rollup 没有显示预期统计 | Relation 未连接好,或 Rollup 计算方式不对 | 打开书籍 Page 查看是否关联了系列 | 重新在两个数据库中做 Relation 关联,添加反向关联字段 |
| API 返回 404 | 数据库 ID 错误,或集成未连接到该页面 | 核对 URL 中的 ID,检查数据库页面右上角的连接列表 | 把 Integration 添加到目标数据库页面 |
| API 返回 429 | 请求频率过高 | 查看响应头 Retry-After | 脚本中加入退避重试,降低并发数量 |
| 批量导入后大量字段为空 | API 字段名与数据库属性名不一致 | 打印返回数据,检查是否包含属性信息 | 用数据库中的准确属性名修改脚本 |
| 输出统计与真实阅读情况不一致 | 状态或日期录入错误 | 按状态筛选查看“已读”记录 | 统一录入习惯,定期人工抽查数据 |
排查时先定位是页面问题、数据问题还是 API 问题,不要只盯着代码。网页端出现异常的绝大多数原因是属性名写错、视图筛选条件没有应用到当前视图、或者多个视图共享同一个数据库导致误以为数据丢失。
10. 最佳实践与合规使用建议
从个人使用角度,给你的追踪器设置几个固定规则会明显降低维护成本。状态只允许使用预设的几个选项,不要临时输入“在读中”“读完了”等变体词,否则统计会很难处理。日期的填写习惯也要统一,开始阅读当天就填开始日期,读完当天就填读完日期,遗忘后的补填会产生偏差。评分建议按统一标准,例如 1 到 10 分,不要中途改成百分制。
在录制和分享模板时,需要注意几个合规边界。Notion 是云端服务,涉及个人真实信息的数据要谨慎添加;涉及公司资料、团队内部资料时建议使用团队空间并做好页面级权限管理。摘录金句时只保存必要的短引文,并在“金句”字段内注明出处书名和页码,公开分享模板时不要附带整本受版权保护的书籍内容。如果后续扩展到团队协作,给不同成员设置只读或评论权限,避免误删其他人维护的数据。
这个追踪器不是一次建好就完了。用了两个月后,回看哪些字段经常空着、哪些视图根本不打开,把它们直接删掉或改进。下一阶段可以扩展的方向包括:月度阅读习惯复盘、年度目标完成度视图、书籍标签与选题库打通、以及把书目库接到个人知识管理系统。以 Notion 的灵活性,先从最小可用的书目库 + 状态 + 日期开始,比一开始追求大而全稳定得多。建议先保存这篇文章,跟着第 4 节建一个最小的“阅读追踪器”,跑通流程后再逐步加入系列和金句库。