- Une extension qui permet d’intégrer la base de données SQLite elle-même dans des tables PostgreSQL via un type de colonne
SQLITE
- Cette approche permet de résoudre la multitenancy
- Création d’une base vide avec
empty_sqlite : CREATE TABLE people (name TEXT NOT NULL, database SQLITE DEFAULT execute_sqlite(empty_sqlite(), 'CREATE TABLE todos (task TEXT)'));
- Requêtes possibles avec la fonction
query_sqlite, insertions/mises à jour possibles avec 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';
- Lecture d’une colonne spécifique avec les fonctions
get_sqlite_text/get_sqlite_integer/get_sqlite_real : SELECT get_sqlite_text(sqlite_row, 0) FROM query_sqlite(database, 'SELECT * FROM todos');
- Écrit avec Rust + le framework Pgrx
- Détails d’implémentation :
- La base est stockée sous forme de
Vec<u8> encodé en CBOR (Concise Binary Object Representation)
- Lors de l’exécution d’une requête, elle est créée comme fichier aléatoire dans le dossier
/tmp. SQLite charge alors le fichier, exécute la requête et renvoie le résultat dans une table à ligne unique contenant des valeurs encodées en JSON
5 commentaires
WAOUH..
Mon Dieu...
pgrx - Un framework pour développer des extensions PostgreSQL en Rust
C’est une extension un peu étrange, mais je me dis que ça pourrait peut-être servir dans des cas comme la création d’un SaaS extensible, quand les utilisateurs ont besoin d’intégrer simplement des fonctionnalités de base de données.
Commentaires Hacker News
La plupart des systèmes de gestion de bases de données relationnelles ne prennent pas en charge les enregistrements imbriqués, et SQL manque lui aussi de fonctionnalités pour créer ou exploiter des tables imbriquées
Proposition d’une idée consistant à empaqueter le répertoire d’une base PostgreSQL dans une archive tar, puis à l’encoder en blob binaire dans SQLite
Des doutes sont exprimés sur les cas d’usage de cette idée
Avis selon lequel une colonne SQLite serait supérieure à une colonne JSON dans SQLite
Le mécanisme de fichier
/tmpsemble être un hack, et sa nécessité est remise en questionVACUUM INTOpour charger les données du blob binaireSi l’on utilise PostgreSQL, le problème du multi-tenant peut être résolu via la Row Level Security (RLS)
Un crime contre la 1NF (première forme normale) ?
Plaintes au sujet de l’absence d’opérateurs