3 puntos por GN⁺ 2024-11-20 | 5 comentarios | Compartir por WhatsApp
  • Una extensión que permite incrustar la propia base de datos SQLite en tablas de PostgreSQL mediante el tipo de columna SQLITE
    • Con este enfoque se resuelve la multitenencia
  • Crear una base de datos vacía con empty_sqlite: CREATE TABLE people (name TEXT NOT NULL, database SQLITE DEFAULT execute_sqlite(empty_sqlite(), 'CREATE TABLE todos (task TEXT)'));
  • Se puede consultar con la función query_sqlite, e insertar/actualizar con 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';
  • Leer una columna específica con las funciones get_sqlite_text/get_sqlite_integer/get_sqlite_real: SELECT get_sqlite_text(sqlite_row, 0) FROM query_sqlite(database, 'SELECT * FROM todos');
  • Escrito con Rust + el framework Pgrx
  • Detalles de implementación:
    • La base de datos se guarda como un Vec<u8> codificado en CBOR (Concise Binary Object Representation)
    • Al ejecutar una consulta, se crea como un archivo aleatorio en la carpeta /tmp. SQLite carga el archivo, ejecuta la consulta y devuelve el resultado como una tabla de una sola fila con valores codificados en JSON

5 comentarios

 
sms8377 2024-11-22

WOW..

 
seunghaekim 2024-11-20

Dios mío...

 
xguru 2024-11-20

Es una extensión algo rara, pero me hace pensar que quizá podría servir en casos como cuando estás creando un SaaS escalable y el usuario necesita incrustar funciones básicas de base de datos de forma sencilla.

 
GN⁺ 2024-11-20
Comentarios de Hacker News
  • La mayoría de los sistemas de gestión de bases de datos relacionales no admiten registros anidados, y SQL también carece de capacidades para crear o aprovechar tablas anidadas

    • Hay opiniones de que “con esa actitud no se puede”
  • Se propone la idea de empaquetar el directorio de la base de datos de PostgreSQL en un tar y codificarlo como un blob binario en SQLite

    • No es algo práctico ni especialmente útil, pero es el concepto de anidar bases de datos SQL
  • Se cuestionan los casos de uso de esta idea

    • Sería difícil usarla al diseñar el esquema de base de datos en un producto común
    • Se preguntan si serviría en aplicaciones híbridas para respaldar directamente los datos locales del usuario junto con la información de la cuenta
  • Hay quien opina que una columna de SQLite sería mejor que una columna JSON de SQLite

    • Los operadores JSON exigen aprender un lenguaje de consultas aparte y además son limitados
  • El mecanismo de archivos en /tmp parece un hack, y se cuestiona si realmente es necesario

    • Podría ser posible crear una base de datos SQLite en memoria y usar la API de respaldo o VACUUM INTO para cargar los datos del blob binario
  • Si ya se usa PostgreSQL, el problema de multi-tenancy puede resolverse con Row Level Security (RLS)

    • Es muy fácil agregar una columna de ID de tenant a cada tabla y establecer políticas para que solo un tenant pueda ver los datos
  • ¿Un crimen contra 1NF (primera forma normal)?

  • Hay quejas por la falta de operadores

    • Quieren índices y una sintaxis de operadores peculiar para hacer joins entre bases de datos cruzando varias columnas DATABASE con otras