3 Punkte von GN⁺ 2024-11-20 | 5 Kommentare | Auf WhatsApp teilen
  • Eine Erweiterung, mit der sich eine SQLite-DB selbst als SQLITE-Spaltentyp in eine PostgreSQL-Tabelle einbetten lässt
    • Auf diese Weise wird Multitenancy gelöst
  • Mit empty_sqlite eine leere DB erzeugen: CREATE TABLE people (name TEXT NOT NULL, database SQLITE DEFAULT execute_sqlite(empty_sqlite(), 'CREATE TABLE todos (task TEXT)'));
  • Abfragen mit der Funktion query_sqlite möglich, Inserts/Updates mit 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';
  • Bestimmte Spalten mit den Funktionen get_sqlite_text/get_sqlite_integer/get_sqlite_real auslesen: SELECT get_sqlite_text(sqlite_row, 0) FROM query_sqlite(database, 'SELECT * FROM todos');
  • Geschrieben mit Rust + dem Pgrx-Framework
  • Implementierungsdetails:
    • Die DB wird als CBOR-kodiertes Vec<u8> gespeichert
    • Bei der Ausführung einer Abfrage wird sie als Zufallsdatei im Ordner /tmp erzeugt. SQLite lädt die Datei, führt die Abfrage aus und gibt das Ergebnis als Ein-Zeilen-Tabelle zurück, die JSON-kodierte Werte enthält

5 Kommentare

 
sms8377 2024-11-22

WOW..

 
seunghaekim 2024-11-20

Mein Gott...

 
xguru 2024-11-20

Es ist zwar eine irgendwie merkwürdige Erweiterung, aber beim Erstellen eines skalierbaren SaaS könnte sie vielleicht in Fällen nützlich sein, in denen Benutzer einfache DB-Funktionen einbetten müssen.

 
GN⁺ 2024-11-20
Hacker-News-Kommentare
  • Die meisten relationalen Datenbankmanagementsysteme unterstützen keine verschachtelten Datensätze, und auch SQL bietet nur unzureichende Möglichkeiten, verschachtelte Tabellen zu erstellen oder zu nutzen

    • Dazu gibt es die Meinung: „Mit dieser Haltung kommt man nicht weiter“
  • Es wird die Idee vorgeschlagen, das PostgreSQL-Datenbankverzeichnis als tar zu bündeln und in SQLite als binären Blob zu kodieren

    • Praktisch oder nützlich ist das zwar nicht, aber es ist ein Konzept zum Verschachteln von SQL-Datenbanken
  • Es werden Fragen nach Anwendungsfällen für diese Idee aufgeworfen

    • Beim Entwurf eines Datenbankschemas für ein gewöhnliches Produkt lässt sich das nur schwer einsetzen
    • Es wird gefragt, ob das zum direkten Sichern lokaler Benutzerdaten zusammen mit Kontoinformationen in einer hybriden Anwendung gedacht ist
  • Es gibt die Ansicht, dass SQLite-Spalten besser wären als JSON-Spalten in SQLite

    • JSON-Operatoren erfordern das Erlernen einer separaten Abfragesprache und sind eingeschränkt
  • Der /tmp-Dateimechanismus wirkt wie ein Hack, und es wird bezweifelt, ob er wirklich nötig ist

    • Möglicherweise könnte man eine SQLite-In-Memory-Datenbank erzeugen und mit der Backup-API oder VACUUM INTO binäre Blob-Daten laden
  • Bei der Verwendung von PostgreSQL lässt sich das Multitenancy-Problem über Row Level Security (RLS) lösen

    • Es ist sehr einfach, jeder Tabelle eine Tenant-ID-Spalte hinzuzufügen und Richtlinien festzulegen, sodass nur ein Tenant die Daten sehen kann
  • Ein Verbrechen gegen 1NF (erste Normalform)?

  • Es gibt Beschwerden darüber, dass Operatoren fehlen

    • Gewünscht werden Indizes und eine spezielle Operator-Syntax für datenbankübergreifende Joins zwischen mehreren DATABASE-Spalten