误解
「资料库和本地文件夹本质上是一样的,都是输入输出文件的存放位置。」
真相
方向对,性质错。 从「AI 读写的输入输出」这个视角两者确实都是内容源;但性质完全不同:
维度 | 本地文件 | 资料库 |
|---|---|---|
结构 | 无结构字节 | 多种节点类型 + schema |
拓扑 | 单棵树(只有文件夹能当父) | 树,父节点可以是网页等非容器节点 |
可被程序访问 | ✅ 直接读 | ❌ 要下载回来 |
可被网页访问 | ❌ | ✅ 可发布 |
检索 | 字符匹配(按文件名 / 内容关键词) | 语义检索 |
协作 | 文件系统权限 | 角色 / 评论 / 审阅 |
依赖 | 零 | 网络 + 鉴权 |
正确表述:资料库是可发布、可结构化、可协作的内容平台;本地是大容量、可程序处理、零依赖的存储。
能力族 | 具体接口 |
|---|---|
结构化增删改查 | 建表 / 加字段 / 改字段 / 删字段 / 批量增 / 批量改 / 批量删 / 查询 / 查单条 / 查内容 |
发布与下线 | 发布页面 / 取消发布 / 查发布产物 |
协作与审阅 | 查协作者 / 查评论 / 提交审阅修订 / 查文档修订 |
语义检索 | 检索节点 / 检索内容片段 |
项 | 实测 |
|---|---|
鉴权方式 | 客户端模式下,每条网络命令前都要换取短期凭证 |
凭证寿命 | 约 30 分钟过期 |
网络依赖 | 断网时读写全部不可进行(实测曾连续返回 NETWORK_ERROR) |
由此得到的一条可用性建议
资料库依赖网络与短期凭证。重要内容应在资料库之外保留本地副本或镜像,不要把资料库作为唯一存放处。
这与「涉密不进资料库」并不矛盾——前者是可用性问题,后者是安全性问题。
需求 | 去向 | 理由 |
|---|---|---|
网页 / 看板要访问 | 资料库 | 本地盘云端读不到 |
结构化增删改查 | 资料库 | 本地表格无 schema / 视图 |
发布成链接分享 | 资料库 | 有发布接口 |
多人协作 / 评论 / 审阅 | 资料库 | 本地无此能力 |
需要语义检索沉淀 | 资料库 | 内容级检索 |
GB 级大批量 | 本地 | 容量 |
需要脚本处理 | 本地 | 资料库要先下载 |
涉密 / 金额 / 客户数据 | 本地 | 安全底线 |
离线或网络受限 | 本地 | 资料库需鉴权 + 网络 |
一句话:要「被访问」的进资料库,要「被计算」的留本地。
kind | 是什么 | 关键机制 |
|---|---|---|
folder | 目录容器 | 装子节点 |
doc | 在线文档(可审阅修订) | 正文可编辑、块级修订 |
web/page | 可发布的 HTML 页面 | 装它挂载的 database(父子) |
database | 结构化表(有 schema) | 字段类型 + 选项枚举 |
link | 网页剪藏 | 异步抓取网页 → Markdown |
drive | 网盘文件 | 上传 / 替换 / 下载,独立占位可分享 |
smh | 历史媒体节点 | 只读下载,不再新建 |
与直觉相反的发现
逐个查各类型节点,folder / doc / web / database / link 全部底层是同一种存储表。
⇒ kind 只是逻辑类型标记,不是不同的存储表。 这跟「每种节点一张表」的直觉相反——底层统一,kind 只决定上层渲染和可用操作。
「块」这个词在资料库里有两个层次,这是理解「内容怎么存」的钥匙。加上检索用的切片,合起来是三层:
层 | 是什么 | 存什么 | 谁在用 |
|---|---|---|---|
节点块 | folder / doc / web / database / link 这些节点 | 只存元数据(标题 / kind / 父节点 / 时间戳),不存正文 | 节点级检索 |
正文块 | 一篇文档正文的最小单元 | 段落、代码、图、表格,各有唯一 id | 读取接口 |
索引切片 | 正文被切片加工后的产物 | 约 950 字一片,可能含 AI 摘要 | 内容级检索 |
由这个模型直接推出的两个结论(都很重要)
⇒ 检索走底层(切片),读取走中层(正文块),是两条独立通道。
误解(初版文档就是这么写错的)
「database 不在目录树里,靠横向引用。」
真相
逐个查 database 的父节点,发现它们全部指向 web 节点。也就是说:web.nodes(从父看子)和 database.parentId(从子看父)是同一个关系的两个方向。
database 在目录树里,位置是「web 节点的子节点」,只是它的父是 web 而不是 folder,所以在 folder 的直接子节点列表里看不到它们。
教训:下「不在树里」这类结论前,要把引用链展开到最底层。 当时只展开 folder 一层就下了结论。
同一个动作「上传文件」,系统按扩展名路由到不同的节点类型:
文件类型 | 导入后 kind | 说明 |
|---|---|---|
.md | doc | 在线可编辑文档 |
.csv | database | 结构化表 |
.html / .zip | page | 可发布页面 |
.docx / .pdf 等 | drive | 网盘文件(不可在线编辑) |
图片 | 不建节点 | 转成公网直链 |
实用推论
扩展名决定它变成什么能力。 想把一个压缩包当「文件」存进网盘,就不能用 .zip 后缀——它会被导入成页面。改个后缀(如 .dat)即可走网盘通道。 这是实测中反复用到的一个技巧。
很多人会注意到:前端新建菜单只有 5 项,和「七种节点」对不上。原因是三个数字各数各的:
数字 | 数的是什么 | 明细 |
|---|---|---|
前端 5 项 | 能点的「新建」入口 | 文档 / 表格 / 文件夹 / 上传和导入 / 添加链接 |
后端 7 类 | 后端 kind 归类 | folder / doc / web(page) / database / link / drive / smh |
kind 值 8 个 | 严格按枚举值数 | 上述 7 类里 web 拆成 web + page |
对不上的三个原因:① 「上传和导入」一项分流出 4 种 kind;② smh 历史遗留禁止新建,前端根本没有入口;③ web(page) 没有独立新建按钮,只能靠上传 html 得到。
误解
「database 就是一个在线版的 CSV。」
真相
它是「带 schema 的轻量数据库」——差别在于字段有类型约束,筛选是类型感知的。这是它碾压本地表格的地方。
但也要知道它的短板:没有聚合能力(见 6.8)。
组 | 接口 | 作用 |
|---|---|---|
结构(管表长什么样) | create-database | 建表 |
get-database | 查表结构(字段 id、选项 id) | |
add-field | 加字段 | |
update-field | 改字段(改名 / 改类型) | |
delete-field | 删字段 | |
记录(管表里的数据) | batch-add-records | 批量加记录 |
batch-update-records | 批量改记录 | |
batch-delete-records | 批量删记录 | |
get-record | 查单条记录 | |
查询 | query-database | 按条件查多条(filter / sorts / 分页) |
get-database-content | 查全部内容 |
单次批量写入上限约 1–100 条。
类型 | 存什么 | 典型场景 |
|---|---|---|
text | 自由文本 | 备注、描述 |
number | 数字 | 数量、评分 |
currency | 金额(带符号 / 小数位 / 千分位) | 价格、预算 |
select | 单选(互斥) | 状态、优先级、部门 |
multi_select | 多选 | 标签、分类 |
date | 日期时间(多种显示格式) | 截止日期 |
checkbox | 布尔 | 是否完成、是否启用 |
url | 链接 | 参考资料 |
email / phone_number | 邮箱 / 电话 | 联系方式 |
image | 图片(可多张) | 封面、截图 |
attachment | 附件(多类型混合) | 报告、凭证 |
person | 关联系统内用户 | 负责人、审批人 |
筛选也是类型感知的——筛选条件是一棵可任意嵌套的树形结构,且每类字段有专属操作符:
字段类型 | 可用操作符 |
|---|---|
文本 / 链接 / 邮箱 / 电话 | 等于、包含 |
数字 / 金额 | 等于、大于、小于、为空 …… |
单选 / 多选 | 等于、不等于 |
日期 | 等于、早于、晚于 |
勾选 | 等于、不等于 |
人员 | 等于、包含、为空 …… |
坑 1 · 写入结构 ≠ 读取结构(读写不对称)
写入:{"名称": {"text": "甲任务"}, "数量": {"number": 3}} ← 每个值是 {类型: 值}
读取:{"_id": "xxx...", "名称": "甲任务", "数量": 3} ← 直接是值,且 id 字段名不同坑 2 · 记录 id 的字段名,读和写不一样
读回来的记录 id 字段名、更新时传参的字段名、以及实际的记录主键名——三者在不同接口里的叫法并不一致。
实测:用错误的字段名会报「id is empty」,只有正确那个名字才通过。踩一次记一次,别照着读到的结构去写。
(本条在不同版本 / 不同接口上出现过变化,是全文被推翻次数最多的一条——务必以当场实测为准,不要照抄记忆。)
坑 3 · 选项 id 由服务端生成
新增选项可省略 id,但成功响应的 schema 才是最终结构与 id 的唯一可信来源;已有选项的 id 永久不变,改字段时必须原样复用,禁止更换。
坑 4 · 写入时值的类型必须与字段类型匹配
实测:给 select / date 类型传了对象或数组,服务端报解析错误。按字段类型给对的形态是硬要求。
接口 | 存在? |
|---|---|
删除字段 | ✅ |
删除记录 | ✅ |
删除表 | ❌ 不存在 |
原因(一条贯穿全文的规律)
表是节点(壳),节点删不掉;字段和记录是内容,内容可删。
⇒ 壳不可删,内容可删。 这与「API 建的节点删不掉」是同一条规律的两种表现。
推论:建表前想清楚——它跟建文档、建链接一样,是不可逆写操作。
一句话定位
page 不是「资料库里的一个 HTML 文件」,是「托管在平台上的一个可运行站点」,外加一整套版本 / 发布机制。
同一个页面节点,实测能拿到三个不同的地址:
名字 | 形态 | 谁能访问 |
|---|---|---|
节点页 | .../space/d/ | 资料库内(自己 / 被授权者) |
编辑态产物 | .../page/// | 平台静态托管,供程序读取 / 修改 |
发布短链 | https://workbuddy.link/p/ | 公网免登录 |
三个是三套东西:域名不同、权限不同、命中的版本也可能不同。
节点信息 → version: 8 ← 节点版本
页面产物列表 → version: 25 ← 页面产物版本8 ≠ 25。 页面每改一次,产物版本 +1;节点版本只在节点元数据变化时动。 ⇒ 看「页面改到第几版」要看产物版本,不是节点版本。
页面里读数的写法(从真实产物里抠出来的):
var DATABASE_ID = "<databaseId>"; // 必须硬编码
var db = window.__SMART_PAGE__.database;
db.query({ databaseId: DATABASE_ID, pageSize: 200, startCursor: cursor })
// → { results: [...], nextCursor: "...", hasMore: true }实测页面用到的 SDK 方法共 6 个:query() / getSchema() / addRecord() / updateRecord() / deleteRecord() / onUpdated()。
两条硬规则
另外:页面产物每个 DOM 元素都带 data-page-node-id 标记,这是给增量编辑做 diff 用的(改一个按钮时只传那一个块,不整包覆盖)。页面头部引用的 SDK 由平台运行时注入,页面源码里没有它的实现。
步骤 | 实测结果 |
|---|---|
1 · 未发布时查发布态 | 返回明确错误码 + not published |
2 · 执行发布 | 返回一个公网短链 |
3 · 发布后查发布态 | 取到产物,发布态版本与编辑态独立 |
4 · 取消发布 | 成功 |
5 · 取消后再查 | 回到 not published |
关键安全事实:发布 = 公网免登录可见
实测直接抓取已发布的短链:能抓到内容、无需登录。
⇒ 发布不是「发给指定的人」,是「挂到公网上」。 发布 = 公开。
涉密内容一律不发布。要分享给特定的人,用「加协作者」,不用发布。
一个容易误判的现象
「手机上能打开看板」不等于「已经发布了」——实测某看板从未发布过,手机上看的是资料库内打开(节点页)。这是对的,数据没有暴露到公网。
关键操作纪律
导入页面时必须指定「覆盖哪个节点」。 不指定就会新建一个节点——而资料库没有删除节点的接口,每跑一次建一个新的会永久堆积。
实测:首次是「新建」,第二次是「覆盖」,节点 id 不变,目录下只有一个看板节点。
要点 | 结论 |
|---|---|
能否覆盖同一页面 | ✅ 能(带节点 id 导入 = 覆盖;不带 = 新建) |
为什么必须覆盖 | 没有删除节点的接口,新建即永久堆积 |
节点 id 存哪 | 存本地一个小文件。文件丢了就会新建第二个节点 |
权限门槛 | 重导入要求对该空间有管理员及以上权限,仅编辑权限会被拒 |
列子节点的参数名 | 注意参数名别写错——写错会静默返回 0 个子节点(这个坑踩过两次) |
文中所有「实测」「xx KB」「xx 个」这类数量,均来自某一台真实机器的快照,请当作方法示范而非通用阈值;真正通用的是判据与因果关系。
原创声明
本文系「当月光落下」原创,首发于腾讯云开发者社区。内容来自作者在实际使用中的逐条实测整理, 所有结论均有本机实机验证或真实接口调用支撑;文中出现的数量均为特定环境下的实测快照, 仅作方法示范,不作为通用阈值。
如需转载,请注明作者「当月光落下」及首发出处,未经许可不得用于商业用途。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。