<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Lakehouse | 面条的草稿箱</title><description>无原创，纯转发</description><link>http://drafts.miantiao.me</link><item><title>Forma 工程系列导读：面向 AI 的“可变结构”数据存储怎么做？AI 应用的数据结构变化速度，往往比传统数据库的建表/改表流程快得多：今天模型输出 12 个字段，明天变 30 个，下周又多出几个新字段——一旦数据库 schema 跟不上，轻则延迟飙升，重则直接线上事故</title><link>http://drafts.miantiao.me/posts/108</link><guid isPermaLink="true">http://drafts.miantiao.me/posts/108</guid><pubDate>Sun, 01 Feb 2026 07:36:12 GMT</pubDate><content:encoded>&lt;b&gt;Forma 工程系列导读：面向 AI 的“可变结构”数据存储怎么做？&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;AI 应用的数据结构变化速度，往往比传统数据库的建表/改表流程快得多：今天模型输出 12 个字段，明天变 30 个，下周又多出几个新字段——一旦数据库 schema 跟不上，轻则延迟飙升，重则直接线上事故。&lt;br /&gt;&lt;br /&gt;这篇导读介绍了 &lt;b&gt;Forma&lt;/b&gt; 的核心思路：&lt;b&gt;只存“实际存在”的字段，让 schema 随 AI 输出演进&lt;/b&gt;。作者用“小票”做类比：&lt;br /&gt;&lt;br /&gt;•   传统 SQL 表像一张列出所有可能商品的固定格式小票，没买的也要打印 0；新增商品就得重印格式（=改表）。&lt;br /&gt;•   EAV（Entity-Attribute-Value）更像只列出你真正买了什么：薯片、可乐；新增字段就直接加一行（=无需 DDL）。&lt;br /&gt;&lt;br /&gt;当然，EAV 一直被认为是“反模式”，因为查询性能和可维护性都很差。Forma 的目标是：&lt;b&gt;在保留灵活性的同时，把性能与一致性补回来&lt;/b&gt;。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Forma 是什么：三件事组合起来&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Forma 面向 AI 时代的存储引擎，核心组合是：&lt;br /&gt;&lt;br /&gt;•   &lt;b&gt;EAV 模式&lt;/b&gt;：新增字段不需要 ALTER TABLE，天然适配快速迭代&lt;br /&gt;•   &lt;b&gt;JSON Schema&lt;/b&gt;：把“AI 输出”变成可验证的数据契约（写入时校验），提升类型安全与可控性&lt;br /&gt;•   &lt;b&gt;PostgreSQL + DuckDB&lt;/b&gt;：OLTP/OLAP 分工 + 热冷分层，在成本与性能之间取得平衡&lt;br /&gt;&lt;br /&gt;&lt;b&gt;系列要解决的三个典型问题&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1.  &lt;b&gt;AI 数据结构迭代太快&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;传统 DDL 流程（提工单→审批→维护窗口→改表）跟不上。系列第 1 篇会讲：JSON Schema + EAV + Hot Table 如何实现“零 DDL、写入即生效、仍然类型安全”。&lt;br /&gt;&lt;br /&gt;2.  &lt;b&gt;EAV 的 N+1 查询噩梦&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;EAV 读数据常见的问题是：查 100 条记录可能触发 101 次往返，延迟轻松破 1s。系列第 2 篇会讲用 PostgreSQL 的 &lt;b&gt;CTE + JSON_AGG&lt;/b&gt; 把 101 次查询压到 1 次，把延迟从 ~1000ms 降到 ~25ms。&lt;br /&gt;&lt;br /&gt;3.  &lt;b&gt;海量历史数据下的一致性与“脏读”担忧&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;数据到十亿级后，热冷分层几乎不可避免，但工程上最怕的是：联邦查询时读到未提交/不一致的数据。系列第 3 篇会讲通过 &lt;b&gt;Anti-Join + Dirty Set&lt;/b&gt; 机制，做到联邦查询“零脏读”。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;按你的场景选择阅读顺序&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;•   做 AI 应用，需要灵活存储：从 &lt;b&gt;Post 1&lt;/b&gt; 开始&lt;br /&gt;•   被 N+1 性能拖垮，想快速降延迟：直接看 &lt;b&gt;Post 2&lt;/b&gt;&lt;br /&gt;•   数据增长、准备上热冷分层 / &lt;mark class=&quot;highlight&quot;&gt;Lakehouse&lt;/mark&gt;：看 &lt;b&gt;Post 3&lt;/b&gt;&lt;br /&gt;•   想系统理解整体架构：按 1→2→3 顺序读&lt;br /&gt;&lt;br /&gt;原文链接：&lt;a href=&quot;https://blog.ltbase.dev/posts/forma/00-introduction-en&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://blog.ltbase.dev/posts/forma/00-introduction-en&quot;&gt;https://blog.ltbase.dev/posts/forma/00-introduction-en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23EAV&quot; title=&quot;#EAV&quot;&gt;#EAV&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23JSONSchema&quot; title=&quot;#JSONSchema&quot;&gt;#JSONSchema&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23PostgreSQL&quot; title=&quot;#PostgreSQL&quot;&gt;#PostgreSQL&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23DuckDB&quot; title=&quot;#DuckDB&quot;&gt;#DuckDB&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Lakehouse&quot; title=&quot;#Lakehouse&quot;&gt;#Lakehouse&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://blog.ltbase.dev/posts/forma/00-introduction-en&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Three posts that explain a flexible data storage engine designed for the AI era&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;blog.ltbase.dev&lt;/div&gt;
  
  &lt;div class=&quot;link_preview_title&quot;&gt;Forma Engineering Blog Series: From EAV to Zero-Dirty-Read &lt;mark class=&quot;highlight&quot;&gt;Lakehouse&lt;/mark&gt; | Lychee Technology Engineering Blog&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Three posts that explain a flexible data storage engine designed for the AI era&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>