3 ポイント 投稿者 GN⁺ 2024-11-20 | 5件のコメント | WhatsAppで共有
  • 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件のコメント

 
sms8377 2024-11-22

WOW..

 
seunghaekim 2024-11-20

まさか…

 
xguru 2024-11-20

ちょっと変わった拡張ではありますが、拡張可能なSaaSを作る中で、ユーザーが簡単にDB機能を埋め込む必要があるような場面では使えるのではないか、という気もしますね。

 
GN⁺ 2024-11-20
Hacker Newsの意見
  • ほとんどのリレーショナルデータベース管理システムはネストされたレコードをサポートしておらず、SQLにもネストされたテーブルを作成・活用する機能が不足している

    • 「そういう姿勢ではだめだ」という意見がある
  • PostgreSQLのデータベースディレクトリをtarでまとめ、SQLiteにバイナリBLOBとしてエンコードするというアイデアが提案されている

    • 実用的でも有用でもないが、SQLデータベースをネストするという発想である
  • このアイデアのユースケースについて疑問が呈されている

    • 一般的な製品でデータベーススキーマを設計する際には使いにくい
    • ハイブリッドアプリケーションで、ローカルのユーザーデータをアカウント情報と一緒に直接バックアップする用途なのか気になる
  • SQLiteのJSON列よりもSQLite列のほうが優れているだろうという意見

    • JSON演算子は別のクエリ言語を学ぶ必要があり、制約も多い
  • /tmp ファイルの仕組みがハックのように見え、本当に必要なのか疑問

    • SQLiteのインメモリデータベースを作成し、バックアップAPIや VACUUM INTO を使ってバイナリBLOBデータを読み込む方法も可能かもしれない
  • PostgreSQLを使うなら、Row Level Security(RLS) によってマルチテナンシーの問題を解決できる

    • 各テーブルにテナントID列を追加し、1つのテナントだけがデータを見られるポリシーを設定するのは非常に簡単
  • 1NF(第1正規形)の犯罪?

  • 演算子がないことへの不満

    • 複数のDATABASE列の間でクロスデータベース結合を行うためのインデックスと、独特な演算子構文が欲しい