- PostgreSQLテーブルに
SQLITE カラム型としてSQLite DB自体を埋め込めるようにする拡張
empty_sqlite で空のDBを生成: CREATE TABLE people (name TEXT NOT NULL, database SQLITE DEFAULT execute_sqlite(empty_sqlite(), 'CREATE TABLE todos (task TEXT)'));
query_sqlite 関数でクエリ可能、execute_sqlite で挿入/更新可能
SELECT * FROM query_sqlite(database, 'SELECT * FROM todos');
- `UPDATE people SET database = execute_sqlite(database, 'INSERT INTO todos VALUES (''solve multitenancy'')') WHERE name = 'frectonz';
get_sqlite_text/get_sqlite_integer/get_sqlite_real 関数で特定のカラムを読み取り: SELECT get_sqlite_text(sqlite_row, 0) FROM query_sqlite(database, 'SELECT * FROM todos');
- Rust + Pgrxフレームワークで作成
- 実装詳細:
- CBOR (Concise Binary Object Representation) エンコードされた
Vec<u8> でDBを保存
- クエリ実行時に
/tmp フォルダへランダムファイルとして生成。SQLiteがファイルを読み込んでクエリを実行し、結果をJSONエンコードされた値が入った単一行テーブルとして返す
5件のコメント
WOW..
まさか…
pgrx - RustでPostgreSQL拡張を開発するフレームワーク
ちょっと変わった拡張ではありますが、拡張可能なSaaSを作る中で、ユーザーが簡単にDB機能を埋め込む必要があるような場面では使えるのではないか、という気もしますね。
Hacker Newsの意見
ほとんどのリレーショナルデータベース管理システムはネストされたレコードをサポートしておらず、SQLにもネストされたテーブルを作成・活用する機能が不足している
PostgreSQLのデータベースディレクトリをtarでまとめ、SQLiteにバイナリBLOBとしてエンコードするというアイデアが提案されている
このアイデアのユースケースについて疑問が呈されている
SQLiteのJSON列よりもSQLite列のほうが優れているだろうという意見
/tmpファイルの仕組みがハックのように見え、本当に必要なのか疑問VACUUM INTOを使ってバイナリBLOBデータを読み込む方法も可能かもしれないPostgreSQLを使うなら、Row Level Security(RLS) によってマルチテナンシーの問題を解決できる
1NF(第1正規形)の犯罪?
演算子がないことへの不満