展示 HN:DriftDB – 一个实验性的只追加数据库,支持时间旅行查询
Show HN: DriftDB – An experimental append-only database with time-travel queries

原始链接: https://github.com/DavidLiedle/DriftDB

DriftDB是一个实验性的、仅追加数据库,专为时间旅行查询和数据审计而设计。所有更改都记录为不可变的“漂移事件”,可以使用DriftQL中的`AS OF`子句查询任何历史状态。 主要特性包括CRC校验的数据段以确保完整性、二级索引以实现快速查找,以及快照/压缩以优化性能。它通过`fsync`支持具有崩溃安全性的原子写入。数据操作使用`INSERT`、`PATCH`(部分更新)和`SOFT DELETE`(用于审计跟踪)。 数据库结构包括事件日志(段)、快照、索引和表模式定义。它采用单写多读架构,并使用Zstd压缩和MessagePack序列化。 DriftDB使用Go构建,提供全面的测试和基准测试工具,并在GitHub上可用。**重要提示:**它目前是一个MIT许可的MVP,旨在用于开发和测试,*不*用于生产环境。

黑客新闻 新的 | 过去 | 评论 | 提问 | 展示 | 工作 | 提交 登录 展示 HN: DriftDB – 一个实验性的仅追加数据库,具有时间旅行查询 (github.com/davidliedle) 8 分,DavidCanHelp 1 小时前 | 隐藏 | 过去 | 收藏 | 2 评论 twosdai 5 分钟前 | 下一个 [–] 非常有趣!我曾经用过 influxdb。我看到一个核心功能是使用 AS OF <某个日期时间> 作为历史参考。这是否类似于在正常的时序数据库中运行一个仅追加数据结构,然后按日期时间查询并获取该数据集中最新的值?或者有所不同。 withinboredom 5 分钟前 | 上一个 [–] 不错!我之前在一家公司为 AI 训练构建了这样的一个。很高兴看到开源版本。你有没有看过 Temporal SQL 的论文?在你想跨时间连接时,它有一些不错的语法。 指南 | 常见问题 | 列表 | API | 安全 | 法律 | 申请 YC | 联系 搜索:
相关文章

原文

An experimental append-only database with time-travel queries.

  • Append-only storage: All changes are immutable drift events
  • Time travel: Query any historical state with AS OF clauses
  • CRC-verified segments: Data integrity with checksummed records
  • Secondary indexes: Fast lookups on indexed columns
  • Snapshots & compaction: Optimize query performance
  • Crash-safe: Atomic writes with fsync on segment boundaries
  • Simple query language: DriftQL for easy interaction
# Clone and build
git clone https://github.com/driftdb/driftdb
cd driftdb
make build
# Run the full demo (creates sample data and runs queries)
make demo
# Initialize a database
driftdb init ./mydata

# Create a table
driftdb sql -d ./mydata -e 'CREATE TABLE users (pk=id, INDEX(email, status))'

# Insert data
driftdb sql -d ./mydata -e 'INSERT INTO users {"id": "user1", "email": "[email protected]", "status": "active"}'

# Query data
driftdb select -d ./mydata --table users --where 'status="active"'

# Time travel query
driftdb select -d ./mydata --table users --as-of "@seq:100"

# Show row history
driftdb drift -d ./mydata --table users --key "user1"

# Create snapshot for faster queries
driftdb snapshot -d ./mydata --table users

# Compact storage
driftdb compact -d ./mydata --table users
-- Create table with indexes
CREATE TABLE orders (pk=id, INDEX(status, customer_id))

-- Insert full document
INSERT INTO orders {"id": "order1", "status": "pending", "amount": 100}

-- Partial update
PATCH orders KEY "order1" SET {"status": "paid"}

-- Soft delete (data remains for audit)
SOFT DELETE FROM orders KEY "order1"

-- Query with time travel
SELECT * FROM orders WHERE status="paid" AS OF "2025-01-01T00:00:00Z"
SELECT * FROM orders WHERE customer_id="cust1" AS OF "@seq:1000"

-- Show drift history
SHOW DRIFT orders KEY "order1"

-- Maintenance
SNAPSHOT orders
COMPACT orders
data/
  tables/<table>/
    schema.yaml           # Table schema definition
    segments/            # Append-only event logs
      00000001.seg
      00000002.seg
    snapshots/           # Materialized states
      00000100.snap
    indexes/             # Secondary B-tree indexes
      status.idx
      customer_id.idx
    meta.json           # Table metadata
  • INSERT: Add new row with full document
  • PATCH: Partial update by primary key
  • SOFT_DELETE: Mark row as deleted (audit trail preserved)
[u32 length][u32 crc32][varint seq][u64 unix_ms][u8 event_type][msgpack payload]
  • Single writer: Process-global lock prevents concurrent writes
  • Multi-reader: Readers never block, use snapshots + replay
  • Crash recovery: CRC verification + truncate corrupt tail
  • Atomic operations: fsync on segment rotation and snapshots
# Run tests
make test

# Run benchmarks
make bench

# Format code
make fmt

# Run linter
make clippy

# Full CI checks
make ci
  • Snapshot every 100k events or 128MB (configurable)
  • Compaction rewrites minimal segments with latest state
  • Indexed columns use B-tree for O(log n) lookups
  • Zstd compression for snapshots
  • MessagePack for efficient event serialization

MIT

Experimental MVP - suitable for development and testing, not production use.

联系我们 contact @ memedata.com