一个PostgreSQL数据库,挂载后能用ls看表、用cat读行、用mkdir插数据——这不是概念验证,是Timescale团队刚开源的TigerFS。他们用FUSE把数据库表翻译成目录,行翻译成文件,SQL查询翻译成文件路径。
最离谱的是性能:过滤、排序、分页全塞进一条路径里,TigerFS把它编译成单条SQL推给数据库执行。
比如这条路径:
cat /mnt/db/orders/.by/customer_id/123/.order/created_at/.last/10/.export/json
等效于"查customer_id=123的订单,按created_at排序,取最后10条,返回JSON"。没有ORM,没有API,纯shell。
文件系统当API用:UNIX工具链直接操作数据库
TigerFS的核心设计是把数据库的抽象层彻底剥掉。安装只要一行curl | sh,挂载后任何能操作文件的工具都能读写PostgreSQL——grep、vim、awk、Python的open(),甚至AI agent。
这种设计有个古老的类比:Plan 9操作系统把"一切都是文件"推到极端,连网络连接都是文件。TigerFS做的是数据库领域的Plan 9——但不是操作系统,是用户态文件系统(FUSE)。
具体映射规则很直白:
表 = 目录。行 = 文件(主键当文件名)。列 = 子文件。
读/mnt/db/users/123.json拿到整行JSON,读/mnt/db/users/123/email.txt只拿email字段。更新也同理:echo一个新值进去,TigerFS翻译成UPDATE语句。
插入是mkdir,删除是rm -r。这些不是模拟出来的——每次操作都是真实的数据库事务,带完整的ACID保证。
路径即查询:把SQL塞进文件名
TigerFS真正狡猾的设计是路径语法。它定义了一套以.开头的路径段,可以链式组合:
.filter/col/val 做列过滤,.columns/a,b,c 做投影,.first/N和.last/N做分页,.export/json或.export/csv定格式。
顺序任意。数据库优化器处理的是最终编译出的SQL,路径写法只影响你读起来顺不顺。
批量操作也走文件语义。.import/.append/csv是追加,.import/.sync/csv是按主键upsert,.import/.overwrite/csv是整表替换。标准输入输出管道直接对接,cat data.csv > /mnt/db/orders/.import/.append/csv完成数据导入。
表结构变更用"staging模式":先写SQL到.create/tablename/sql,再touch .commit触发执行。避免了一半命令行工具不支持交互式SQL确认的问题。
Apps机制:给表穿上文件格式的皮
纯JSON和CSV不够用时,TigerFS有个叫"Apps"的扩展层。声明echo "markdown" > /mnt/db/.build/blog之后,blog表会被呈现为一组.md文件。
YAML frontmatter映射到列,文档正文映射到text列。于是你可以用grep -l "author: alice"搜文章,用mv改标题(改文件名=改主键),用任何Markdown编辑器直接写数据库。
这个设计瞄准的是一类特定场景:内容管理系统、文档数据库、AI agent的持久化层。这些场景里,"文件"是比"SQL行"更自然的抽象,但底层又需要数据库的并发控制和查询能力。
Timescale团队自己就是靶用户——他们做时序数据库,经常要处理大量结构化日志和配置,用TigerFS能把这些塞进PostgreSQL而不改变现有工具链。
目前只支持PostgreSQL,Linux走FUSE 3,macOS走NFS。代码开源在GitHub,安装脚本托管在独立域名。没有企业版功能切割,核心能力全在开源代码里。
一个值得玩味的细节:TigerFS的README里没提性能基准测试。路径编译成单条SQL是聪明的优化,但FUSE本身的上下文切换开销、小文件读的N+1问题(哪怕被批量优化过),在真实工作负载里表现如何?
Timescale没说。但既然他们敢用在生产环境,至少说明时序数据+批量查询的场景是跑得通的。随机小文件读写?可能不是设计目标。
你手里有PostgreSQL实例的话,5分钟就能验证这个假设。curl装完,mount上去,用find和wc -l跑几个查询看看延迟分布——这比任何 benchmark 都直接。
最后留个开放问题:如果数据库能完美伪装成文件系统,"数据库"和"文件系统"的边界还存在吗?还是说,我们用了几十年的分类本身,只是实现细节的残留?
热门跟贴