Skip to content

[DB] Colunas JSON em texto puro — sem chance de indexação interna #1085

Description

@ElioNeto

Descrição

Várias colunas armazenam dados como text({ mode: "json" }) no Drizzle:

Tabela Coluna Conteúdo
message data InfoData (metadados da mensagem)
part data PartData (arquivos, ferramentas, texto)
session summary_diffs Snapshot.FileDiff[]
session revert { messageID, partID, snapshot?, diff? }
session permission Permission.Ruleset
session model { id, providerID, variant? }
event data Record<string, unknown>

SQLite não permite criar índices sobre campos internos de JSON sem extensões (como json_each() virtual tables). Qualquer filtro que precise acessar propriedades internas força scan completo e parse do JSON em runtime.

Impacto

  • Moderado no momento — esses campos são tipicamente lidos após já ter filtrado por session_id (indexado)
  • Mas se houver necessidade futura de queries como "sessões do provider X" ou "mensagens do tipo Y", não haverá índice para ajudar
  • Overhead de parse de JSON em cada leitura (embora pequeno)

Solução sugerida

  • Curto prazo: Documentar que esses campos não são filtráveis por índice
  • Médio prazo: Mover campos críticos para colunas nativas (ex: model_id, model_provider_id como colunas separadas em vez de JSON blob)
  • Longo prazo: Avaliar se SQLite com extensão json1 + expression indexes atende

Arquivos relacionados

  • packages/teamcode/src/session/session.sql.ts
  • packages/teamcode/src/message/message.sql.ts
  • packages/teamcode/src/sync/event.sql.ts

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions