3 pontos por GN⁺ 2024-11-20 | 5 comentários | Compartilhar no WhatsApp
  • Extensão que permite incorporar o próprio banco de dados SQLite em tabelas PostgreSQL por meio do tipo de coluna SQLITE
    • Resolve multitenancy dessa forma
  • Cria um banco vazio com empty_sqlite: CREATE TABLE people (name TEXT NOT NULL, database SQLITE DEFAULT execute_sqlite(empty_sqlite(), 'CREATE TABLE todos (task TEXT)'));
  • É possível consultar com a função query_sqlite e fazer insert/update com 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';
  • Lê colunas específicas com as funções get_sqlite_text/get_sqlite_integer/get_sqlite_real: SELECT get_sqlite_text(sqlite_row, 0) FROM query_sqlite(database, 'SELECT * FROM todos');
  • Escrito com Rust + framework Pgrx
  • Detalhes de implementação:
    • Armazena o banco como Vec<u8> codificado em CBOR (Concise Binary Object Representation)
    • Ao executar a consulta, cria um arquivo aleatório na pasta /tmp. O SQLite carrega o arquivo, executa a consulta e retorna o resultado como uma tabela de linha única contendo valores codificados em JSON

5 comentários

 
sms8377 2024-11-22

Uau..

 
seunghaekim 2024-11-20

Meu Deus...

 
xguru 2024-11-20

É uma extensão meio estranha, mas acho que talvez dê para usar em casos como ao criar um SaaS escalável e o usuário precisar incorporar funções simples de banco de dados.

 
GN⁺ 2024-11-20
Comentários do Hacker News
  • A maioria dos sistemas de gerenciamento de bancos de dados relacionais não oferece suporte a registros aninhados, e o SQL também carece de recursos para criar ou utilizar tabelas aninhadas

    • Há a opinião de que "essa postura não serve"
  • Foi proposta a ideia de empacotar o diretório do banco de dados PostgreSQL em um tar e codificá-lo como um blob binário no SQLite

    • Não é algo prático nem útil, mas é o conceito de aninhar bancos de dados SQL
  • Levantaram dúvidas sobre os casos de uso dessa ideia

    • É difícil usar isso ao projetar o esquema de banco de dados de um produto comum
    • Há curiosidade se isso serviria para, em aplicações híbridas, fazer backup direto dos dados locais do usuário junto com as informações da conta
  • Há a opinião de que uma coluna SQLite seria superior a uma coluna JSON no SQLite

    • Os operadores de JSON exigem aprender uma linguagem de consulta separada e são limitados
  • O mecanismo de arquivo em /tmp parece uma gambiarra, e há dúvidas se ele é realmente necessário

    • Pode ser possível criar um banco de dados SQLite em memória e usar a API de backup ou VACUUM INTO para carregar os dados do blob binário
  • No caso de uso do PostgreSQL, é possível resolver problemas de multitenancy com Row Level Security (RLS)

    • Adicionar uma coluna de ID do tenant em cada tabela e definir uma política para que apenas um tenant possa ver os dados é muito fácil
  • Crime contra a 1NF (Primeira Forma Normal)?

  • Reclamação sobre a ausência de operadores

    • Querem índices para joins entre bancos de dados cruzando várias colunas DATABASE, além de uma sintaxe de operadores peculiar para isso