SQLite JSON at full index speed using generated columns

2025/12/12 22:25

SQLite JSON at full index speed using generated columns

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

SQLiteは、仮想生成列と組み込みの

json_extract
関数を用いたインデックス作成により、追加作業なしでJSONデータをリレーショナルテーブルとして扱えるようになりました。DB Pro の Jay は3か月間の実験で、次のように列を定義すると

GENERATED ALWAYS AS (json_extract(...)) VIRTUAL

JSONパスにインデックスを作成できることを発見しました。これにより、単一のテキストフィールドにデータを保持しながら即時検索速度が得られます。この手法はスキーマレスなJSONストアを高速クエリエンジンへ変換し、従来一般的だったコストの高いマイグレーションやETLステップを排除します。実際に libSQL や Turso などのライブラリが SQLite を使用しており、DB Pro はローカルでそれを活用しています。Jay はこの試験中に発見した他の SQLite 機能を扱う短いブログシリーズを計画しており、追加インデックステクニックや実際の事例も含む予定です。軽量データベースに依存する開発者・企業にとって、このパターンを採用すれば JSON の柔軟性を保ちつつリレーショナル性能が得られ、スキーマ変更が簡素化されクエリ速度も向上します。

本文

DB ProではSQLiteを心から愛しています。
本当に好きでない人はほとんど見つけられません。確かに制約はあります――「弱点」ではなく制限です。しかし、適切にデプロイして注意深くチューニングすれば、SQLiteを本番環境で問題なく使うことができます。

近年、SQLite は再び注目を集めています。libSQL や Turso へのフォークはもちろん、PocketBase のような人気バックエンドフレームワークの根幹にも使われており、再び勢いを取り戻しています。

私たちも好きです。実際に DB Pro 自体のローカルデータベースとして SQLite を使用しており、当社のユースケースには他に優れた代替手段がないと感じています。

過去三か月間、SQLite を積極的に利用してきました。その結果、以前は知らなかった多くのことを学びました。
そこで、私たちが発見した SQLite のクールで興味深い機能やニュアンスを紹介する短いブログシリーズを書こうと思います。これがその第一弾です。


你知道 SQLite に JSON 関数と演算子があることをご存知でしたか?

最近まで知らなかったのですが、Hacker News のコメントで気づきました。
*“bambax” が言っていた内容を理解するまで何度も読み返し、自分でも試してみる必要がありました。私たちのブログにはブラウザ内に埋め込まれた SQLite コンポーネントがありますので、実際に動く例を作ってみました(主に自分用ですが)。

1. JSON ドキュメントをそのまま保存する

JSON 列を持つシンプルなテーブルを作成します。

CREATE TABLE posts (
    id   INTEGER PRIMARY KEY,
    data JSON NOT NULL
);

JSON ドキュメントは到着したままの形で自然に格納されます。スキーマ変更は不要です。

2. 仮想生成列を追加する

ここがマジックの始まりです。仮想生成列を加えましょう。生成列は値を必要なときに計算し、実際にはデータを保存しません。

ALTER TABLE posts ADD COLUMN title TEXT GENERATED ALWAYS AS (json_extract(data, '$.title')) VIRTUAL;

書き込みは発生せず、バックフィリングもありません。クエリ時にオン・ザ・フライで計算されます。

3. 完全なパフォーマンスを得るためにインデックスを作る

次に、これらの仮想列を高速化するインデックスを作ります。

CREATE INDEX idx_posts_title ON posts(title);

JSON が通常のリレーショナルカラムと同じようにフルインデックスで扱えるようになります。

4. 最高速でクエリできる

例として:

SELECT * FROM posts WHERE title = 'Hello World';

このクエリは非常に高速です。

5. 後から別のパターンが必要になったら?

JSON の構造が変わっても、既存行を触れずに新しい生成列とインデックスを追加できます。例えば

user_id
で検索したい場合は:

ALTER TABLE posts ADD COLUMN user_id TEXT GENERATED ALWAYS AS (json_extract(data, '$.user.id')) VIRTUAL;
CREATE INDEX idx_posts_user_id ON posts(user_id);

これだけで、マイグレーションやスキーマの書き換えなしに最適化できます。


このパターンが強力な理由

この手法は SQLite で JSON を扱う考え方を一変させました。スキーマレスデータの柔軟性と、リレーショナルデータベースの性能・操作性を兼ね備えつつ、早期に制約を課したり、選択肢を限定したりすることなく利用できます。

感謝します、bambax さん!

SQLite の隠れたスーパーパワーはまだまだあります。これが最初の一例です。

読んでいただきありがとうございます!
— Jay

同じ日のほかのニュース

一覧に戻る →

2025/12/13 5:57

GNU Unifont

2025/12/13 7:02

Show HN: Tiny VM sandbox in C with apps in Rust, C and Zig

## Japanese Translation: uvm32 は、単一の C ファイルで書かれたミニマリストで依存関係を持たない仮想マシンサンドボックスです。 STM32L0 のような非常に小型のマイクロコントローラ上で動作し、4 KB 未満のフラッシュと 1 KB の RAM を使用します。静的割り当てのみで非同期設計となっています。 この VM は RISC‑V のサブセットを実装しており、軽量な管理インタフェースを公開しています。「if‑this‑then‑that」ロジックのために Lua、Duktape、MicroPython などの軽量スクリプトエンジンを置き換え、信頼できないコンポーネントや不安定な部品をサンドボックス化し、ターゲットコンパイラなしでモダン言語の「一度書けばどこでも実行できる」スクリプトを書けるようにすることが目的です。 主な特徴: - バイトコードアプリは C、Zig、Rust、またはアセンブリで記述可能。 - 非ブロッキングでシンプルな実行モデル。安全かつ最小限の型付けを備えた FFI を使用し、ホスト IO(stdio/ネットワーク)は想定していません。 - デザインは高速よりも安全性を優先しています。 - すべてのソースコードは `uvm32/` ディレクトリにあります。最小限のホスト例は `host‑mini` にあり、より高度なホストは `host/`、`host-parallel`、`host-arduino` にあります。 サンプルアプリケーションは VM の機能を示しています(C: helloworld, heap, conio, lissajous, maze, fib, sketch; Zig: zig‑mandel, zigtris, zigalloc, zigdoom; Rust: rust‑hello; アセンブリ: hello‑asm)。 ビルドとテスト用の Dockerfile が提供されており、`make dockerbuild`、`make dockershell` で構築・起動し、その後 `make` を実行してサンプルをコンパイル・実行します。ドキュメントはヘッダファイル `uvm32/uvm32.h` と `doc/README.md` にあります。本プロジェクトは MIT ライセンスで公開されています。

2025/12/13 5:15

Rats Play DOOM

## Japanese Translation: > **概要:** > 著者らは、ラットがDOOMをプレイできる完全にオープンソースの仮想現実装置をリリースしました。ゼロから構築されたこのシステムには、ハードウェア設計・ファームウェア・ソフトウェアがGitHubに掲載されており、他研究室でも簡単に再現または改良できます。バージョン 1(v1)はニューヨークのヴィクトール・トー氏によって開発され、ラットにDOOMコリドーを走行させるよう訓練しました。この実装はViceとPC Gamerで紹介されました。 > > 改良版(v2)はよりモジュラー化され、180°×80°の視野を持つ折りたたみ可能なAMOLEDスクリーン、新しいボールドライバー、強化された給餌器、ゲームイベントに同期した正確な10 µLの砂糖水投与が可能な改良リワード回路を備えています。追加センサーとランニングマシンのボール周囲に設置された光学フロー運動捕捉システムでトラッキング精度が向上しています。 > > ソフトウェアはPythonベースのモジュラースタック(arena_scenario.py)で、PC上で実行され、Raspberry PiとTCP経由で通信します。Piはリアルタイムセンサー読み取り・ボール駆動・リワード制御を担当します。すべてのコンポーネントはGitHubに文書化されており、3Dプリント可能なパーツや回路図も公開されています。 > > チーム(ヴィクトール・トー=ゲーマーラットコーチ、サンドル・マクラ=電気技師、アコス・ブラシュェク=ドキュメントリード)は、ラットが約2週間で慣れることを示しましたが、完全な訓練はまだ完了していません。 > > 現在の制限として、自動キャリブレーションスイートが無いため、ユーザーはセンサーの整列とリワードタイミングを手動で検証する必要があります。 > > 今後の課題は完全な訓練プロトコルの完成、キャリブレーションツールの改良、および他の行動タスクや種へ装置を拡張することです。低コストで完全にオープンなプラットフォームを提供することで、このプロジェクトは世界中の神経科学研究室の参入障壁を下げ、動物VR実験に依存する研究のスピードアップに寄与できる可能性があります。