Show HN: pglite-fusion - PostgreSQLテーブルにSQLiteを埋め込む
(github.com/frectonz)- 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エンコードされた値が入った単一行テーブルとして返す
- CBOR (Concise Binary Object Representation) エンコードされた
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正規形)の犯罪?
演算子がないことへの不満