ドキュメントデータベースとしての SQLite(2020)

2026/08/25 8:00

ドキュメントデータベースとしての SQLite(2020)

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

要約

Japanese Translation:

2020 年 1 月 22 日(バージョン 3.31.0)にリリースされた SQLite は、「生成列」を導入し、生 JSON の挿入と索引フィールドの自動抽出を可能にすることで、効果的にドキュメントストアとして機能するようになります。ユーザーは

GENERATED ALWAYS AS
構文を用いて生成列を定義でき(例:JSON 文字列から
$.d
を抽出)、読み取り時のリアルタイム計算用の
VIRTUAL
列と、キャッシュされた値用の
STORED
列のどちらかを選択できます。
STORED
列はテーブル作成後の追加はできませんが、既存のテーブルに対しては
ALTER TABLE ... ADD COLUMN
を用いて新しい仮想生成列とその対応する索引を追加することが可能です。このアーキテクチャは、生ペイロード(例:webhook から)を最初に取り込み、使用パターンに応じて後に構造化されたフィールドを抽出するという柔軟なワークフローをサポートします。特定の JSON キーが存在することを確保するため、生成列に
NOT NULL
などの制約を適用できます。不整合のある JSON を挿入すると即座にエラーが発生し(「Error: malformed JSON」または「Error: NOT NULL constraint failed」)、複雑なアプリケーションコードなしでデータ整合性を確保します。開発者は
CREATE INDEX
EXPLAIN QUERY PLAN
のような標準 SQL コマンドを使用して、生成列上の索引がクエリの速度を著しく向上させることを確認でき、単なる保存と強力なドキュメントデータベース機能とのギャップを橋渡しできます。最近のバージョン(例:3.31.1)は macOS で Homebrew を通じて利用可能で、古いシステムでは nixpkgs-unstable のような不安定なソースが必要となる場合があります。これらの例は 2020 年 6 月 17 日の「in code」シリーズで発表されました。

本文

SQLite の JSON データに対する生成されたカラム機能を活用する方法

SQLite は長年 JSON サポートを持っていましたが、**バージョン 3.31.0(2020 年 1 月)**で「生成されたカラム(Generated Columns)」機能が追加されました。これにより、軽量な埋め込みデータベースとしても文書データベースのように扱うことが可能になります。

基本動作:JSON からカラムを抽出してインデックス化

JSON データをそのまま INSERT した後、特定のフィールドを抽出して VIRTUAL カラムとして定義し、その値で検索できるようにします。

準備と基本的なテーブル作成:

$ sqlite3
SQLite version 3.31.1 2020-01-27 19:55:54
Connected to a transient in-memory database.

sqlite> CREATE TABLE t (
    body TEXT,
    d INT GENERATED ALWAYS AS (json_extract(body, '$.d')) VIRTUAL
);
sqlite> INSERT INTO t VALUES(json('{"d":"42"}'));
sqlite> SELECT * FROM t WHERE d = 42;

出力:

{"d":"42"}|42
  • d
    カラムは、INSERT 時に提供された JSON から自動的に抽出されます。
  • 重要: 表構造を変更せずに、動的なインデックス化が可能になります。

バージョンと環境に関する注意点

この機能には十分に新しいバージョンの SQLiteが必要です。

  • macOS の Homebrew で対応されている場合があります。
  • それ以外の場合は、
    nixpkgs-unstable
    などの不安定版ソースを利用する必要があるかもしれません。

データの整合性を強制する方法

通常、JSON は

json()
関数で最小化(ミニファイ)して検証するのが推奨されますが、SQLite には「純粋な JSON タイプ」がありません。そのため、何でも許容してしまう欠点があります。

GENERATED ALWAYS AS (json_extract(...))
を使うと、不正な JSON を挿入しようとするとエラーが発生します。

1. 非正規な JSON の検出:

sqlite> INSERT INTO t VALUES(json('{"d": "malformed"}'));
-- エラー: malformed JSON

2. NOT NULL 制約の追加:

特定のキーが存在しない場合や空文字列を挿入すると、抽出された値が NULL となり

NOT NULL
制約に違反します。

sqlite> CREATE TABLE x (
    body TEXT,
    id TEXT GENERATED ALWAYS AS (json_extract(body, '$.id')) VIRTUAL NOT NULL
);

sqlite> INSERT INTO x VALUES('');
-- エラー: malformed JSON

sqlite> INSERT INTO x VALUES('{}');
-- エラー: NOT NULL constraint failed: x.id

ストアード(キャッシュ)カラムとの違い

生成されたカラムには

VIRTUAL
STORED
の 2 つのタイプがあります。

  • VIRTUAL: データを計算して格納せず、必要時だけ評価します(上記例で使用)。
  • STORED: 値を物理的にキャッシュできますが、
    ALTER TABLE
    で追加できない
    という大きな制限があります。

無論、

VIRTUAL
カラムでもインデックスは追加可能です。

インデックスの作成と管理

仮想カラムであっても、標準的な SQL でインデックスを作成・管理できます。

単一のカラムにインデックスを追加:

CREATE INDEX xid ON x(id);

-- 動作確認
EXPLAIN QUERY PLAN SELECT * FROM x WHERE id='foo';
-- 出力: --SEARCH TABLE x USING INDEX xid (id=?)

ALTER TABLE
と組み合わせる拡張ワークフロー

ALTER TABLE
を使うことで、テーブルに新たなカラムとインデックスを追加しながら拡張できます。最初はシンプルな JSON コラムだけから始め、必要なフィールドが見つかった段階でインデックス化します。

ステップバイステップでの拡張例:

-- 1. テキスト列のカラム追加とインデックス化
ALTER TABLE x ADD COLUMN text TEXT 
    GENERATED ALWAYS AS (json_extract(body, '$.text')) VIRTUAL;

-- 2. データの挿入
INSERT INTO x VALUES(json('{"id":43, "text":"test"}'));

-- 3. 新しいカラムへのインデックス追加
CREATE INDEX xtext ON x(text);

このアプローチの利点

  1. 段階的な進化: シンプルな JSON テーブルから始め、需要に合わせてカラムとインデックスを追加できます。
  2. Webhook 処理への適合: 受信データをそのまま保存し、後で必要なフィールドだけを抽出・利用するワークフローが容易です。
  3. 軽量さ: Elastic や PostgreSQL と比べて、埋め込みデータベースとしての負荷が少ないメリットがあります。

楽しい時間を過ごしてください。

同じ日のほかのニュース

一覧に戻る →

2026/08/30 4:33

騰訊發布並開源騰訊Hy4預覽版

## Japanese Translation: 以下の改良版は、完全性を保ちながら読みやすさを維持するため、不足していた技術仕様と性能指標を組み込んでいます。 ## 改善された要約 Tencent は次世代の 770B パラメータを持つ大規模言語モデル(アクティブパラメータ:49B)「Hy4 preview」をローンチしました。このモデルは高生産性タスクに特化して最適化されており、1M トークンを超える広大なコンテキストウィンドウを備えています。Hy4 はシリーズ初となる自主的なトレーニングおよび推論システムの最適化を実現し、オペレーターフュージョンによりエンドツーエンドのスループットを 31.8% 向上させました。内部での盲目評価において、203 のエンジニアリングタスクにわたる 163 名の専門家によって行われ、GLM-5.3(2.92)および Kimi K3(2.94)に対してそれぞれ 2.99/4.00 と高いスコアを記録し、主要競合他社を上回りました。 ソフトウェアエンジニアリング、ゲーム、金融、科学の分野で Tencent の専門家によって共同作成された高品質なデータを用いてトレーニングされた Hy4 は、長文脈開発、単一のプロンプトからのゲームプロトタイピング、分子動力学や物理学などの科学研究分野において明確な優位性を発揮します。現在、Hy4 は Tencent Cloud TokenHub および OpenRouter を介して世界中で利用可能であり、競合的 API 料率(入力トークンあたり 83.4 米セント)で提供されています。同モデルは WorkBuddy および CodeBuddy の Tencent プラットフォーム上で 2 週間無料利用が可能ですが、前世代の Hy3 は引き続き 9 月 30 日までの間アクセス可能です。

2026/08/24 14:09

Tether:Linux での iMessage や SMS の利用

## Japanese Translation: テザー(Tether)は、iPhone とペアリングされた際の macOS の「Continuity」機能——iMessage、SMS、コンタクト同期、通知、ファイル共有、クリップボード同期、ワンタイムパスワード(OTP)の自動入力——を Linux へ統合し、KDE Connect など既存ソリューションが補えていないギャップを埋めています。セキュリティは当初から最優先事項であり、iOS と Linux の通信には mTLS 暗号化を採用し、定期的に Opus および Fable のセキュリティスキャンを実施することで実現しました。他のメールクライアントへの広範なサポートはまだ利用できません。開発者はバックエンド開発を優先し、拡張子の移植には集中しないためです。OTP の自動入力は、Zen Browser(Firefox)と Betterbird(Thunderbird)向けのブラウザおよびメール拡張機能を通じて行われ、メールからコードを拡張機能へ送ってログインフォームの自動埋め込みを実現します。 直接の iMessage/SMS アクセスのための Bluetooth 統合は、GPL ベースのプロジェクト(例:ancs4linux や BlueFerry)とのライセンス衝突を避けるために、独自のカスタム C++「クリーンルーム」手法を用いて実装されています。テザーは引き続き MIT ライセンスを採用しています。現在の Linux ベースのデーモンは、Tailscale などの earlier プロキシ方式と比べてより優れた直接的な接続体験を提供しており、ユーザーからは不快であると評価されていました。iOS アプリが先に登場し、当初は基本的なクリップボード同期のみを処理し、その後に広範な Continuity スタックが構築されました。 ファイル共有およびプッシュ通知は直ちに利用可能ですが、ハードウェア制約や Bluetooth 切断の問題など、将来のアップデートにおける課題依然存在しています。特に Bluetooth の実装は 2026 年においてもエッジケースが多いため困難です。本プロジェクトは金銭的利益よりも真なる価値と満足感を提供することを目指しており、シームレスなクロスプラットフォーム接続を求める技術愛好家にとってユニークなツールとなっています。バグレポート、機能要望、翻訳、ドキュメントなどの貢献をコミュニティから歓迎します。

2026/08/30 3:22

vLLM 0.28.0

## Japanese Translation: このリリースは、主要なアーキテクチャ変更と拡張ハードウェアサポートにより AI 推論を加速することに焦点を当てた決定的なアップグレードです。主なパフォーマンス向上としては、ファインズドカーネルによって大きなモデル(特に MegaMoE)で最大 1.5〜3 倍の高速化、推論の最適化(DFlash2/DSpark)、GPU ごとに約 17 GiB のメモリ節約を実現する共有エキスパートシャッディングなどがあります。この更新はハードウェア互換性を大幅に拡大し、NVIDIA アーキテクチャ(Blackwell SM90/B12X を含む、ネイティブな DSA/FlashInfer パスを備えたもの)および AMD ROCm プラットフォーム(gfx950/gfx120x)、MLA および FP8 推論向けの特定の最適化を可能にします。 機能面では、Weight Offloading、マルチレイヤー MTP KV キャッシュ、アテンション不要なモデルサポートといった機能を備えた Model Runner V2 が導入されました。また、バッチトークン上限値を 16384 に倍増させたり、Mamba モデルにデフォルトでプレフィックスキャッシュを有効化したりするなどの推論デフォルトも標準化されています。エコシステムの主要な更新としては、PyTorch 2.12 と Transformers 5.15.0 への移行が必須となり、ディスクオフローディングをサポートする階層型 KV キャッシュシステムが追加されました。さらに、gRPC を通じたネイティブ Rust フロントエンドサポートが追加され、Muse Glimmer、Ling 3.0 Flash、Qwen3.8 など多数の新しいモデルへの対応も開始(AMD 向け)。組織は、これらの高度な機能を利用するために、非推奨化された関数や特定の依存関係に関する破壊的な変更に対応する必要があります。