找回密码
立即注册
搜索
发回帖 发新帖

5370

积分

0

好友

690

主题
发表于 1 小时前 | 查看: 4| 回复: 0

MoteDB 是一个纯 Rust 实现的嵌入式多模态数据库,主要面向具身智能场景(机器人、AR、边缘设备)。它内置向量(DiskANN)、全文(BM25+jieba)、时序、空间四类索引,底层采用列式存储,支持 ACID 事务和 SQL 查询。整个系统单进程嵌入式运行,零外部依赖,MIT 协议开源。接入方式也很简单:cargo add motedb、pip install motedb-python、npm install motedb 即可。

项目地址:GitHub(0.18 全家福:Release v0.18.0)
文档:motedb.github.io,仓库 examples/motedb-demo.ipynb 中有一个 10 分钟可跑的 demo notebook。

新版本在 SQL 语法上增加了连续视图和列变更能力。Database::open_shared_readonly 也正式加入 Rust 侧 API,支持一个写者 + N 个读者进程同时挂载活动目录(flock SH/EX),只读会话零字节落盘,用目录字节级指纹做验收。

-- 0.18 新语法一览
CREATE CONTINUOUS VIEW sensor_1m AS
SELECT TIME_BUCKET('1m', ts) AS minute,
       device,
       AVG(v) AS v_avg,
       FIRST(v, ts) AS v_open,
       LAST(v, ts) AS v_close
FROM sensor
GROUP BY minute, device;   -- 查询时惰性刷新,当普通表用

ALTER TABLE frames DROP COLUMN legacy;   -- 逻辑删除,schema 演进
ALTER TABLE frames RENAME COLUMN v TO voltage;

v0.18 的主线:把一笔技术债连本带利还掉

v0.17 五轮猎虫收尾时留下一个实证结论:四轮“同一谓词不同路径不同结果”类缺陷全部同根——SQL 比较语义存在于 11 个互不相识的实现里。0.18 的工作流 A 就是专门还这笔债,具体做法值得拆成三段来聊。

1. 先写特征测试,再动实现(PR-1)

新建 semantics.rs 作为唯一语义层:Cmp3 三值逻辑 + OrdOp + coerce_pair(Cow 零分配归一:Bool↔数值、方括号向量文本)。动代码之前先写 38 行类型对 × 8 算子的矩阵测试,再用 12 个探针把引擎各路径的 NULL/Kleene 现状锁定下来——先证明“现状是什么”,再谈“改成什么”。

2. 差分测试是照妖镜(PR-4)

同一份随机谓词,九条执行路径对拍(SELECT / DELETE / UPDATE / JOIN 两种写法 / 子查询 IN / 聚合 / GROUP BY+HAVING)。上线第一天就揪出 7 个预先存在的跨路径分歧,全是 0.17 就有的:

  • NOT (flag IN (0,1)) 在某条路径放行全部行——In 分支用了裸 ==,NULL 成员匹配了 NULL 值;
  • UPDATE 探针第一版用 a = a + 1000 探测,忘了 NULL + 1000 = NULL——行原样留下,差分器把它当分歧报出来,测试工具自己的 bug 也被差分抓了;
  • 最有意思的裁决:a NOT IN (0, '7') 里哈希归一把纯数字文本 '7' 当微秒时间戳解析(时间戳解析器 first-try 连带),与相等路线分歧。裁决是纯数字文本不再按时间戳归一——推翻了自己 PR-1 里锁定的怪癖。特征测试不是圣旨,差分对拍才是。

3. CI 棘轮:只降不升(PR-5)

src/sql 里裸值比较点从 49 处收编到清单化,门禁脚本数违规、上限写在单独文件里(当前 50),只许降不许升,行内注释可豁免。从此“再往执行器里手写一个 ==”过不了 CI。

产品侧补的四个硬伤

  • B1 多进程共享只读:写者持 EX 时读者明确报错;脏目录(WAL 非空/未干净关闭)拒绝打开——只读者永不修复,修复是写者的职责。零落盘用目录字节级指纹来验收。
  • B2 Schema 演进:DROP COLUMN 是逻辑删除——列段按位置存列,物理宽度绝不能收窄(dropped 槽位写 NULL 占位),bincode 位置敏感所以目录镜像链 modern→V017→V013 保跨版本兼容。
  • B3 向量召回硬化:先造测量工具(对抗数据 p50/worst 如实基线),发现真病灶是“列段写缓冲新行对索引路径不可见”——补合并层 + 新鲜度护栏(未入图占比超阈值降级暴力扫并后台重建)。诚实声明:对抗簇数据 p50 0.85-1.0 是真实水平,不藏。
  • B5 连续视图:惰性全量重算 v1,语义如实声明。开发日志里最连续的踩坑是:把视图物化结果注册进 CTE map 后,连环揪出三个预存在的 CTE bug——WITH x AS (...) SELECT COUNT(*) FROM x 之类形态此前会硬报 Table not found。新特性的测试强度反过来给老特性抓了虫。

发布工程

全量门禁 4300+ 测试从约 2.5h 提到约 30min(独立 release-test profile 关掉 LTO——300+ 测试二进制的链接时间才是大头)。EXPLAIN 改为决策点实录(thread-local trace 重放执行,计划永不与实际漂移)。文档版本单源 + CI 校验(README 曾三处三个版本号)。Release 页由 tag 自动生成。发版前发现 cargo package 会把未跟踪的本地文件收进包——exclude 补 .zcode/ 后 package --list 核验归零。

给同行的三个小教训

  1. 差分对拍 > 特征测试。特征测试锁现状,差分测试找真相——两者冲突时(纯数字文本时间戳)信差分。
  2. 新功能是老代码的压力测试。连续视图把 CTE map 用满,三个陈年 bug 当场现形。给新功能写测试时,顺手把相邻老路径也拍一遍。
  3. 位置敏感的序列化(bincode)加字段 = 全部旧目录损坏。用镜像链在解码边界转换,别在结构体上加带默认值的尾部字段赌运气。

链接

如果你也在做 Rust 数据库相关项目,欢迎到云栈社区 和更多开发者交流。




上一篇:Claude Fable 5.2登顶智能指数榜,API调用价格较5.1降低20%
下一篇:Servo 0.7.0 收进 527 个提交,Rust 浏览器引擎更新多项 Web 功能
您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-11-13 06:30 , Processed in 0.071942 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表