2 分钟

如何创建一个用于跟踪假设与学习的 Web 应用

逐步指南:设计、构建并发布一个用于管理假设、运行实验并在同一处捕获学习的 Web 应用。

如何创建一个用于跟踪假设与学习的 Web 应用

定义实验跟踪的目标与范围

在你选择数据库或设计界面之前,先搞清楚你的实验跟踪 Web 应用要解决的具体问题。多数团队并不是因为缺少想法而在实验上失败——他们失败的原因是上下文消失了。

定义真正的问题(而不是表象)

常见的信号表明你需要一个专门的学习仓库:

  • 实验记录分散在笔记、幻灯片或聊天线程中。
  • 人们重复测试,因为找不到之前的学习(或不信任找到的内容)。
  • 决策是在没有清晰假设、结果和“我们学到了什么”的轨迹下做出的。

用一句段落的朴素语言写下问题陈述,例如:“我们做了很多测试,但无法可靠地回答我们之前做了什么、为什么做、发生了什么,以及这是否改变了我们的决策。” 这将锚定后续的一切工作。

设定你能够实际衡量的成功标准

避免把“记录实验数量”这类表面指标当作主要目标。相反,应围绕行为和决策质量定义成功:

  • 采纳率(Adoption): 哪些团队会每周使用,以及“活跃使用”是什么意思(例如:每个实验在上线前有条目,结束后有结论)。
  • 可搜索性: 对于常见问题(比如“我们是否测试过定价页标题 X?”或“我们对入职摩擦学到了什么?”)的平均响应时间。
  • 决策质量: 重复测试更少,go/no-go 决策更清晰,人员变动时交接更好。

这些标准将指导哪些功能是必要的,哪些是可选的。

确定目标团队和核心用例

实验通常是跨职能的。定义 v1 的目标用户——通常是 产品增长UX 研究、和 数据/分析 的混合体。然后映射他们的核心工作流:

  • 产品:提出假设、对齐干系人、记录结果与决策。
  • 增长:执行高频 A/B 测试工作流,比较变体,快速行动同时保留历史记录。
  • UX 研究:把定性研究记录为“实验”,附上学习和置信度说明。
  • 数据:验证分析、跟踪指标定义、添加关于注意事项的备注。

不必在 v1 中把每种工作流都做到完美——只要确保共享记录对所有人都有意义即可。

明确 v1 的功能边界(会做与不会做)

范围膨胀会扼杀 MVP。尽早决定你的边界。

V1 可能会做的事: 捕获假设、把实验与负责人和日期关联、存储学习,并使所有内容易于搜索。

V1 可能不会做的事: 替代分析工具、在应用内运行实验、计算统计显著性、或成为完整的产品发现工具。

一个简单规则:如果一个功能不能直接提升文档质量、可查找性或决策能力,就把它放到后期。

确定用户、角色与核心工作流

在你设计界面或选数据库之前,先弄清楚会使用该应用以及他们需要什么结果。一个优秀的实验跟踪应用之所以显得“显而易见”,是因为它映射了真实团队的行为。

主要角色(保持简单)

大多数团队可以从四个角色开始:

  • Contributor(贡献者): 添加假设、执行实验、记录结果。
  • Reviewer(审查者): 帮助完善实验计划、检查质量、批准决策。
  • Admin(管理员): 管理工作区设置、权限、模板和清理工作。
  • Viewer(查看者): 阅读过往学习、搜索和导出——不编辑。

各角色需完成的工作

快速验证工作流的方式是列出每个角色必须完成的事项:

角色关键待办事项
Contributor快速记录想法,将其转成可测试的假设,记录实验计划,更新状态,捕获有证据的学习。
Reviewer确保假设具体,确认成功指标与保护性阈值,批准“准备运行”,决定学习是否足够强以采取行动。
Admin设置字段/分类法,管理访问,处理审计需求,维护模板与集成。
Viewer查找相关的历史实验,理解尝试过什么,并复用学习而不必重新执行工作。

理想流程(从想法到学习)

一个务实的“理想路径”流程:

  1. 想法被捕获(快速笔记,标记到某产品领域)。
  2. 假设建立(谁/什么/预期影响 + 为什么)。
  3. 实验计划(方法、受众、持续时间、指标、风险)。
  4. 运行 + 更新(状态变化并链接到产出物)。
  5. 记录学习(决策 + 证据 + 下一步)。

审批点与潜在瓶颈

定义审查者必须介入的节点:

  • 运行前: 批准假设质量与度量计划。\n- 结果后: 批准结论与决策(上线、迭代、停止)。

常见的瓶颈包括:等待审查、责任不清、缺失数据链接,以及“发布结果但无决策”。可以增加轻量提示如必填字段、负责人分配和“需要审查”队列来推进工作。

设计数据模型:假设、实验、学习

良好的数据模型让应用使用起来“显而易见”:人们只需记录一次想法,可以针对同一假设运行多个测试,日后无需翻文档就能找到学到的内容。

“假设”应包含什么

从最小字段开始,把松散的想法变成可测试的内容:

  • 假设陈述: 一句清晰的“如果我们做 X,那么 Y 会在 Z 受众上发生”。
  • 理由: 为什么相信它(见解、用户反馈、先前实验)。
  • 预期影响: 哪些指标会发生变化以及方向(例如:激活率上升、流失下降)。

保持字段简洁且结构化;冗长叙述可以放在附件或笔记中。

你需要的核心实体

多数团队最终需要一小套对象:

  • Experiment(实验): 你运行的具体测试(日期、负责人、状态、方法)。
  • Metric(指标): 你测量的内容(定义、来源、保护阈值)。
  • Variant(变体): 所做的改动(对照与一个或多个处理)。
  • Decision(决策): 你做出的决定(上线、迭代、停止)以及谁批准。
  • Learning(学习): 可复用的结论表述。
  • Attachment(附件): 截图、SQL 片段、设计、研究笔记。

与现实匹配的关系

把连接模型化以避免重复工作:

  • 一个假设 → 多个实验(可能针对不同细分或渠道测试同一信念)。
  • 一个实验 → 多个学习(既有预期的结论也可能有意外收获)。
  • 实验关联到多个指标多个变体

标签与分类(可查找性为王)

即便是 MVP,也要早期加入轻量标签:

  • 产品领域(Onboarding、Pricing、Search)
  • 渠道(Email、Paid、In-app)
  • 受众(新用户、SMB、Enterprise)
  • 风险工作量(简易量表)

该分类法会在后续让搜索与报表变得有价值,而不是现在就强制复杂流程。

构建清晰的状态与决策框架

状态框架是实验跟踪应用的骨干。它能让工作持续推进、加速审查、并避免“半完成”的实验污染你的学习库。

使用少而明确的状态集

从与团队实际工作相匹配的简单流程开始:

  • Draft(草稿): 想法被记录,尚未成形
  • Planned(计划): 已准备好运行,已排期并分配负责人
  • Running(运行): 实验上线并收集数据
  • Analyzing(分析): 结果正在评估
  • Decided(已决): 决策已做并记录
  • Archived(归档): 关闭并归档以便将来搜索

让状态变更显式(按钮或下拉),并在所有视图中展示当前状态(列表、详情、导出)。

为每个状态加入守卫字段(必填项)

状态更有用时会强制完整性。例如:

  • Draft 要求:假设陈述、问题/机会描述、提出人
  • Planned 要求:主指标、成功阈值、受众/分段、开始/结束日期、负责人、风险
  • Running 要求:实验 ID/链接、部署计划、监控说明
  • Analyzing 要求:数据来源、结果摘要、效果方向、置信说明
  • Decided 要求:决策类型、理由、下一步

这能防止“运行”状态在没有清晰指标时出现,或“已决”没有理由的情况。

记录决策(包括不舒服的那些)

添加结构化的决策记录并要求简短的自由文本说明:

  • Ship(采纳改动)
  • Iterate(调整并再次测试)
  • Stop(不再推进)
  • Rerun(修复执行问题后重跑)
  • Inconclusive(证据不足)

对于 Inconclusive(结论不足) 的结果,不要让团队就此掩埋结论。要求给出原因(例如样本不足、信号冲突、埋点缺失)并建议后续(重跑、收集定性输入或标记为稍后回顾)。这会让你的实验数据库更诚实,也会让未来的决策更好。

规划用户体验:采集、搜索与审查

标准化你的模板
为假设和实验计划创建模板原型,然后在试点后完善。

跟踪应用的成败取决于速度:人们多快能记录一个想法,团队又多快能在几个月后找到它。设计时要支持“现在就写、稍后整理”,但也别让数据库变成垃圾堆。

优先设计的关键界面

从覆盖完整闭环的一小组界面开始:

  • 列表视图:默认着陆页,带有保存的过滤器(例如:“我的进行中实验”、“需要决策”、“已上线学习”)。
  • 详情视图:为单个假设/实验优化的可读、可分享页面(顶部摘要,证据与结果在下)。
  • 编辑器:在详情页内的行内编辑或聚焦编辑模式;避免冗长且令人生畏的表单。
  • 仪表盘:轻量概览当前在跑、被阻塞和已结束的内容——更偏运营而非分析。

让条目快速创建(确保被使用)

使用模板默认字段减少输入量:假设陈述、预期影响、指标、受众、部署计划、决策日期。

加入一些能带来累积效果的小加速器:键盘快捷键(新建、添加标签、变更状态)、快速添加负责人、以及合理的默认值(状态=Draft、负责人=创建者、自动填充日期)。

搜索与过滤是产品功能

把检索当作一等工作流。提供全局搜索与结构化过滤器:标签、负责人、日期范围、状态、主指标。允许用户组合过滤并保存视图。在详情页中,让标签与指标可点击,跳转到相关条目。

引导与空状态

设计简单的首次使用体验:一个示例实验、一个“创建你的第一个假设”提示,并在空列表时说明应放入什么内容。良好的空状态能防止困惑并引导团队养成一致记录的习惯。

为假设与实验计划创建模板

模板能把“好意愿”转化为一致的文档。当每个实验都从相同结构开始时,审查会更快、比较更容易、你也花更少时间去解读历史记录。

强制清晰的假设模板

从能放在一屏上的短假设模板开始,引导人们走向可测试的陈述。一个可靠的默认写法是:

If we [change] , then [expected outcome] , because [reason / user insight] .

再加几个防止模糊的字段:

  • 目标用户 / 分段: 这是谁(新用户、高级用户、特定套餐)
  • 证据: 促成该假设的用户语录、研究笔记或数据点(链接到 /docs 或 /research)
  • 预期方向: 上升/下降/无变化,这样“成功”不会在后续被篡改

易于批准的实验计划模板

你的计划模板应捕获运行测试所需的最少信息:

  • 受众: 谁有资格参与及排除规则
  • 持续时间: 开始/结束日期或决策日期
  • 样本量说明: 粗体指导、假设或“跑到 X 次转化”为止(并非每个人都做统计)
  • 主指标: 决定结果的那个数字
  • 次要指标: 提供背景但不作为决策依据
  • 保护阈值: 不得下降的指标(例如退货、客服工单)

把链接作为一等字段连接到实际工作:

  • 设计: /docs/designs/...
  • 工单/PRD: /docs/...
  • 仪表盘: /analytics/...

在保持结构化的同时提供灵活模板

提供若干实验类型预设(A/B 测试、入职改动、定价测试),每个预设自动填入常见指标与保护阈值。但仍保留“自定义”选项,以免把团队强行套进错误的形式。

目标是让每个实验读起来像一个短而可复述的故事:为什么、做了什么、如何做以及如何决策。

以可复用且结构化的方式捕获学习

当实验跟踪应用保留的是决策与推理而非单纯结果时,它才真正有价值。目标是让学习易于浏览、比较和复用——从而下一次实验能更聪明地开始。

使用一致的“Learning(学习)”记录

当实验结束(或提前停止)时,创建一条学习记录并使用强制字段以确保清晰:

  • 发生了什么(What happened): 用通俗语言总结结果(包括意外与边缘情况)。
  • 我们认为为什么会这样(Why we think it happened): 基于证据的最佳解释,而不是猜测。若有竞争性解释也列出。
  • 下一步(Next step): 现在要做什么——上线、迭代、做后续测试或放弃。

这种结构能把零散的写作变成一个可被团队搜索与信赖的实验数据库。

在指标之外捕获定性上下文

数字很少能讲完整个故事。为以下内容留出专门字段:

  • 定性笔记: 可用性观察、客服主题、销售电话要点。
  • 引用: 来自用户或干系人的短语,附上来源与日期。

这能帮助团队理解指标波动的原因,防止重复出现相同的误判。

将附件作为一等证据

在学习条目上允许添加附件——因为人们日后会去那里查证:

  • 截图(变更前/后 UI、热图)
  • 文档(研究摘要、决策备忘)
  • SQL 片段(使用的确切查询)
  • 图表(导出的图、实验报表)

为附件存储轻量元数据(拥有者、日期、相关指标),这样附件不是“被丢弃的文件”,而是可用的证据来源。

添加“我们会如何不同做”的反思字段

一个专门用于流程反思的字段能带来复利改进:招募缺陷、埋点错误、变体混淆或不匹配的成功标准。随着时间推移,这会成为运行更干净测试的实用清单。

在不误导的前提下加入报表功能

让它正式上线
把你的跟踪器放到自定义域名上,让它更像真正的内部产品。

报表只有在有助于团队做出更好决策时才有价值。对于实验跟踪应用,这意味着分析应保持轻量、定义清楚并贴合团队的实际工作(而非表面的“成功率”)。

从轻量分析开始

一个简单仪表盘可以回答实用问题,而不会把你的应用变成一堆噪声图表:

  • 按状态计数(Draft → Planned → Running → Analyzing → Decided),展示吞吐量和瓶颈。\n- 胜率(Win rate,带警告)。把它当作方向性信号而不是绩效评分。\n- 决策时间(创建 → 决策),这比“好与坏的想法”更能揭示流程摩擦。

让每个指标都可点击,这样人们可以钻取到底层的实验文档,而不是为聚合数据争论不休。

以便决策的切面分片

多数团队希望按以下维度查看结果:

  • 领域(onboarding、pricing、activation、retention)
  • 主指标(转化、收入、达到价值时间)
  • 负责人(谁跑的)

这些视图尤其对假设管理有帮助,因为它们能揭示重复模式(例如:入职假设经常失败,或某一领域的假设持续出错)。

添加学习流与周报

“学习流”应突出知识库中的变化:新决策、更新的假设、以及新标记的学习。配合周报视图回答:

  • 本周我们做了哪些决策?
  • 我们应该停止、开始或重复哪些事情?
  • 哪些假设被证伪(为什么)?

这能让产品实验保持可见性,而不需要每个人阅读所有 A/B 流程的细节。

不要暗示你不具备的确定性

避免默认使用会误导统计真相的图表或标签。相反:

  • 显著性以标签显示(例如:“未检验”、“方向性”、“95% 显著”),并存储假设(测试类型、样本定义、停止规则)。
  • 展示置信度说明(“样本小”、“存在季节性风险”、“保护阈值移动”)。
  • 决策(上线/不上线/迭代)与结果(效应量、指标变动)分离。

良好的报表应减少争论,而不是因为误导性指标创造新的争论。

节省时间的集成与自动化

跟踪应用要被团队长期使用必须融入他们已有工具里。集成的目标不是“更多数据”,而是更少的复制粘贴与更少的遗失更新。

认证与团队上下文

从与其他内部工具一致的登录方式开始。

如果公司有 SSO(Google Workspace、Microsoft、Okta),就接入它,让入职一键完成、离职自动撤销访问。配合简单的团队目录同步,这样实验可以归因到真实的负责人、团队与审查者(例如“Growth / Checkout squad”),而不是每个人在两个地方维护个人资料。

与分析工具的连接(避免安全问题)

多数团队不需要把原始事件数据存入实验跟踪应用。相反,保存引用即可:

  • 指向 GA4、Amplitude、Mixpanel、Looker 等仪表盘的链接
  • 用于评估的指标 ID 或报表标识
  • 决策与解释的快照(发生了什么、对谁生效、为什么)

如果使用 API,避免在数据库中存储原始密钥。优先使用 OAuth 流程,或把令牌存在专用的密钥管理器中,并在应用里只保留内部引用。

关闭环路的通知

通知能把文档变成活的工作流。保持通知聚焦于动作:

  • 添加评论(请求澄清、分享发现)
  • 状态变化(Planned → Running → Analyzing → Decided)
  • 决策发布(让干系人停止问“发生了什么?”)

通过邮件或 Slack/Teams 发送,并包含指向具体实验页面的深度链接(例如 /experiments/123)。

导入/导出以便迁移与备份

尽早支持 CSV 导入/导出。这是最快的路径,用于:

  • 从电子表格或其它工具迁移
  • 批量修复字段(负责人、标签、状态)
  • 创建轻量备份与离线共享

一个好的默认方案是分别导出实验、假设与决策,使用稳定 ID 以便重新导入时不重复记录。

权限、审计与数据安全

保持完全所有权
当工作流程稳定后,可随时导出源码,保持对代码库的完全所有权。

实验跟踪只有在团队信任系统时才有效。这种信任由清晰的权限、可靠的审计轨迹与基本的数据卫生建立,尤其当实验涉及用户数据、定价或合作方信息时。

权限:工作区、项目与记录级别

从三层映射到团队实际工作方式开始:

  • 工作区访问:谁能进入产品(例如员工 vs 客人)。
  • 项目访问:谁能查看/贡献特定产品领域(Growth、Onboarding、Payments)。
  • 记录级规则:谁能查看/编辑特定假设或实验(对法律审查、敏感合作或预发布功能很有用)。

为 MVP 保持角色简单:Viewer、Editor、Admin。必要时再加“Owner”。

审计轨迹:编辑、决策、删除

如果一个指标定义在测试中途更改,你需要知道。存储不可更改的历史记录:

  • 字段变更(变更内容、旧值/新值、谁、何时)
  • 状态转换与决策(例如“Shipped”、“Stopped”、“Inconclusive”)
  • 删除(优先软删除并支持恢复)

在每条记录中展示审计日志,这样审查者无需四处查找。

保留、备份与恢复

定义一个保留基线:实验与附件保留多久、有人离职时会怎样处理。

备份不必复杂:每日快照、已测试的恢复步骤和明确的联络人运行手册。如果你暴露导出功能,确保导出尊重项目权限。

保护敏感信息

把 PII 当作最后手段处理。提供脱敏字段(或开关)用于笔记,并鼓励链接到经过批准的来源而不是粘贴原始数据。

对于附件,允许管理员按项目限制上传(或完全禁用)并阻止常见的危险文件类型。这样你的学习库仍有用,同时不会成为合规负担。

为 MVP 选择务实的技术栈

MVP 的技术栈应优化迭代速度,而非未来完美。目标是交付团队会实际使用的东西,验证工作流与数据需求后再演进。

架构:从单体开始

对于 MVP 来说,简单的单体(一个代码库、一个可部署应用)通常是最快路径。它把认证、实验记录、评论和通知放在同一个地方——更容易调试且成本更低。

你仍然可以为未来做设计:按功能模块化(例如“experiments”、“learnings”、“search”),保持清晰的内部 API 层,避免把 UI 与数据库查询紧耦合。如果采用度量级增长,你可以后续把搜索、分析、集成等拆分出去而无需重写全部代码。

存储:优先关系型,文件分离

关系型数据库(PostgreSQL 是常见选择)适合实验跟踪,因为数据是结构化的:负责人、状态、日期、假设、变体、指标与决策。关系模式让过滤与报表可预测。

对于附件(截图、幻灯片、导出文件),使用对象存储(例如兼容 S3 的存储),在数据库中仅存元数据与 URL。这样备份更可控,避免把数据库当成文件柜。

API 风格:REST 或 GraphQL——保持朴素

REST 与 GraphQL 都可行。对 MVP 而言,REST 往往更容易理解与集成:

  • 为假设、实验、学习与评论提供 create/read/update 的端点

如果前端有很多“一页需要多个相关对象”的场景,GraphQL 可以减少过度获取。无论哪种方式,都要保持端点与权限清晰,避免发布一个灵活却难以保护的 API。

早期加入全文搜索以便快速发现

搜索是“学习仓库”与被遗忘数据库之间的区别。从第一天就加入全文搜索:

  • 从 Postgres 原生全文搜索开始,覆盖标题、假设、标签与结果

如果将来需要更丰富的相关性排序、容错拼写或跨字段加权,再引入专用搜索服务。MVP 应该能让人们在几秒内找到“上季度的结账实验”。

用 Koder.ai 快速原型(可选)

如果你主要的瓶颈是把一个可用的 MVP 交到用户手上,你可以用 Koder.ai 做原型。这是一个通过聊天界面构建 Web 应用的 vibe-coding 平台(常见前端为 React,后端为 Go + PostgreSQL),并提供源码导出、部署/托管、自定义域名与快照回滚等功能。它通常足以验证你的工作流(模板、状态、搜索、权限),再决定是否投入长期构建流水线。

常见问题

我怎么知道我们真的需要一个实验跟踪 Web 应用?

当你无法可靠地回答以下问题时,就该考虑:

  • 我们之前尝试过什么?
  • 为什么要尝试它?
  • 发生了什么?
  • 我们做了什么决定?

如果实验分散在幻灯片、文档和聊天中,人们会重复工作或不信任过往笔记,那么你已经超过“电子表格足够用”的阶段。

我们应该为 v1 设定哪些成功标准?

使用行为和决策质量来衡量,而不是表面数字:

  • 采纳率(Adoption):实验在发布前被记录,并在有结果后被结论化。\n- 可搜索性:常见问题的“回答时间”保持很短(秒/分钟而不是小时)。\n- 决策质量:由于上下文丢失而重复实验减少;ship/iterate/stop 的判断更清晰;当负责人变动时移交更顺畅。
哪些团队和角色应先支持?

把 v1 聚焦为跨职能的共享学习记录:

  • 产品:假设 → 计划 → 结果 → 决策
  • 增长(Growth):高频 A/B 测试、快速状态更新、清晰历史记录
  • UX 研究:将定性研究以“实验”形式记录并附上证据
  • 数据/分析:指标定义、注意事项、分析链接

把记录设计得对所有人都清晰可读,即便他们的工作流不同。

v1 应该做什么、不应该做什么?

一个务实的 v1 边界:

  • 捕获假设、负责人、日期和状态
  • 存储带证据的学习与决策
  • 让条目容易搜索和过滤

避免试图取代分析工具或在应用内直接运行实验。如果某个功能不能直接提高文档质量、可查找性或决策能力,就先搁置。

最简单的角色和权限模型是什么?

一个简单可行的角色/权限模型是:

  • Contributor(贡献者):创建/更新假设、实验、结果
  • Reviewer(审查者):批准“准备运行”的假设和最终结论
  • Admin(管理员):权限、模板、分类法、清理
  • Viewer(查看者):搜索与阅读;必要时导出

在 MVP 中可以映射为 Viewer / Editor / Admin,以后再细化。

数据模型的核心实体应该包含哪些?

建模你希望将来检索到的内容:

  • Hypothesis(假设):陈述、理由、预期影响
  • Experiment(实验):负责人、日期、方法、状态
  • Metric(指标):定义 + 来源(和保护性阈值)
  • Variant(变体):对照/处理组
  • Decision(决策):ship/iterate/stop/rerun/inconclusive + 批准人
  • Learning(学习):可复用的结论 + 证据
  • Attachments(附件):链接与元数据

关键关系:

  • 一个假设 → 多个实验
  • 一个实验 → 多个指标/变体并可能产生多个学习
实验应该经历哪些状态?

使用一组小而明确的状态,例如:

  • Draft → Planned → Running → Analyzing → Decided → Archived

让状态变更是有意的(按钮/下拉),并在列表、详情页、导出中到处可见。这能防止“半成品”污染你的知识库。

我们如何防止不完整或低质量的实验条目?

强制完成必要字段以防止交接问题:

  • Planned(计划):主指标、成功阈值、受众、日期、负责人、风险
  • Running(运行):实验 ID/链接、部署计划、监控说明
  • Analyzing(分析):数据来源、摘要、效果方向、置信度说明
  • Decided(已决):决策类型、理由、下一步

这能减少“我们跑了但没定义成功”或“有结果但没决策”的情况。

我们应该如何捕获学习以便以后真正可复用?

结构化学习记录使其可复用:

  • What happened(发生了什么):用通俗语言总结结果(包括意外情况)
  • Why we think it happened(我们认为为什么会这样):基于证据的解释;若有多个解释则一并列出
  • Next step(下一步):ship/iterate/follow-up/stop

添加定性上下文字段(笔记、引用),并在将来人们会查找的位置附上证据(设计、仪表盘、SQL、导出)。包含“我们会如何改进”的字段以便持续优化流程。

哪个技术栈最适合用于 MVP 实验跟踪应用?

一个务实的 MVP 技术栈示例:

  • 单体(Monolith) 以便快速迭代
  • PostgreSQL,用于结构化关系数据(负责人、状态、标签、指标)
  • 对象存储(用于附件);在 DB 中仅存元数据/URL
  • REST(或精简 GraphQL),权限清晰
  • 尽早加入全文搜索(Postgres FTS 是很棒的 v1 选择)

这个组合优化了上线速度,同时保留了未来扩展的选项。

Related posts