Skip to content

ERD Completo — canta-igreja

Gerado pelo Architect (Reversa) em 2026-05-11 Confiança: 🟢 CONFIRMADO | 🟡 INFERIDO | 🔴 LACUNA

Banco: cantaIgreja.db (SQLite) — PRAGMA user_version = 15


Diagrama ERD

erDiagram

  musica {
    INTEGER id_musica PK
    TEXT    titulo
    TEXT    letra
    TEXT    contribuidores "JSON: {compositores, letristas, musicistas}"
    TEXT    midias         "JSON: {YouTube(dep), YouTubes[], CifraClub, Partitura}"
    TEXT    rotulos        "JSON: string[] - v11"
    TEXT    informacoes    "JSON: {} - v9, extensível"
    INTEGER crc32
  }

  musica_busca {
    INTEGER rowid  "FK implícita → musica.id_musica"
    TEXT    titulo "Espelho FTS5 (peso 50)"
    TEXT    letra  "Espelho FTS5 (peso 5)"
  }

  livro {
    INTEGER id_livro PK
    TEXT    titulo
  }

  editora {
    INTEGER id_editora PK
    TEXT    nome
    TEXT    site
  }

  edicao_livro {
    INTEGER id_edicao_livro PK
    INTEGER id_livro        FK
    INTEGER id_editora      FK
    TEXT    edicao
    TEXT    ano
    TEXT    descricao
    TEXT    site
    TEXT    detalhes        "JSON: {sigla, ...}"
  }

  cantico_livro {
    INTEGER id_musica       FK
    INTEGER id_edicao_livro FK
    TEXT    indice          "pode ser alfanumérico ex: 23a"
    INTEGER ordem
  }

  tipo_repertorio {
    INTEGER id_tipo_repertorio PK
    TEXT    tipo               "Padrão | Usuário"
    TEXT    descricao
  }

  repertorio {
    INTEGER   id_repertorio            PK
    INTEGER   id_tipo_repertorio       FK
    TEXT      titulo                   "CHECK length <= 50"
    TEXT      resumo
    TEXT      ordem_musicas            "JSON: number[] - ordem dos id_musica"
    TIMESTAMP data_criacao
    TIMESTAMP data_ultima_visualizacao
    TIMESTAMP data_exclusao            "NULL = ativo (soft-delete)"
    TEXT      slug                     "JSON: {referencia, corrente} - v10"
    INTEGER   data_edicao              "Unix timestamp - v10"
    TEXT      metadata                 "JSON: {data, dia_liturgico} - v14"
  }

  item_repertorio {
    INTEGER   id_item_repertorio PK
    INTEGER   id_repertorio      FK
    INTEGER   id_musica          "FK nullable → musica"
    TEXT      termo              "NULL se música; CHECK length <= 300"
    TEXT      momento            "CHECK length <= 300"
    TEXT      tonalidade
    TIMESTAMP data_inclusao
  }

  sugestao_repertorio {
    INTEGER id_sugestao_repertorio PK
    TEXT    id_romcal              "chave romcal"
    TEXT    ano_liturgico          "A|B|C|PAR|ÍMPAR"
    TEXT    titulo
    TEXT    resumo
    TEXT    itens                  "JSON: ItemSugestaoRepertorio[]"
    TEXT    metadata               "JSON: {referencias}"
    INTEGER crc32
  }

  liturgia_cache {
    TEXT    data          PK       "YYYY-MM-DD"
    TEXT    payload                "JSON: resposta DANCRF"
    INTEGER atualizado_em          "Unix timestamp"
  }

  exemplar_biblioteca {
    INTEGER id_exemplar PK
    INTEGER id_obra     "referência externa (API)"
    TEXT    titulo
    TEXT    descricao
    INTEGER crc32
    INTEGER ativo       "1 = ativo, 0 = desativado"
  }

  musica         ||--o{ musica_busca    : "espelha (FTS5)"
  musica         ||--o{ cantico_livro   : "aparece em"
  edicao_livro   ||--o{ cantico_livro   : "contém"
  livro          ||--o{ edicao_livro    : "tem edições"
  editora        ||--o{ edicao_livro    : "publica"
  tipo_repertorio ||--o{ repertorio    : "classifica"
  repertorio     ||--o{ item_repertorio : "contém"
  musica         ||--o{ item_repertorio : "referenciada por (nullable)"

Notas por Entidade

musica

  • 🟢 contribuidores, midias, rotulos e informacoes são colunas TEXT armazenando JSON — sem normalização de relacionamentos.
  • 🟢 midias.YouTube deprecated — usar YouTubes[].
  • 🟡 informacoes está vazio em todos os registros conhecidos — campo de extensão futura.

musica_busca (FTS5 Virtual)

  • 🟢 Tabela virtual. Não tem DDL convencional — mantida automaticamente pelo SQLite.
  • 🟢 rowid aponta para musica.id_musica implicitamente.
  • 🟢 Pesos BM25: título=50, letra=5.

edicao_livro

  • 🟢 detalhes ->> 'sigla' é coluna JSON virtual — usada na UI para exibir sigla do livro.

cantico_livro

  • 🟢 indice pode ser alfanumérico (ex.: "23a").
  • 🔴 ordem está presente mas não é usada na busca por livro (DT-01, DT-02).

repertorio

  • 🟢 ordem_musicas é array JSON com os id_musica na ordem definida pelo usuário — não é posição na tabela item_repertorio.
  • 🟢 data_exclusao IS NOT NULL = soft-deleted.
  • 🟢 id_tipo_repertorio = 1 (Padrão) = intocável pelo usuário.
  • 🟡 slug.referenciaslug.corrente quando o repertório foi importado de outra conta e re-compartilhado.

item_repertorio

  • 🟢 id_musica pode ser NULL (item de texto livre / termo).
  • 🟢 momento e tonalidade são sugeridos automaticamente com base no histórico de uso.

sugestao_repertorio

  • 🟢 itens é JSON inline — ItemSugestaoRepertorio com metadata.ignorar para soft-delete interno.
  • 🟢 Índice em (id_romcal, ano_liturgico).

exemplar_biblioteca

  • 🟡 id_obra é referência externa à API — não há tabela local de obras.
  • 🟢 Apenas 1 exemplar ativo por obra. O anterior é desativado (ativo = 0) no import.

Chaves e Índices

Tabela Índice / Constraint Confiança
musica PK id_musica 🟢
musica_busca FTS5 (gerenciado pelo SQLite) 🟢
livro PK id_livro 🟢
editora PK id_editora 🟢
edicao_livro PK id_edicao_livro, FK id_livro, FK id_editora 🟢
cantico_livro FK id_musica, FK id_edicao_livro 🟢
tipo_repertorio PK id_tipo_repertorio 🟢
repertorio PK id_repertorio, FK id_tipo_repertorio, CHECK length(titulo) <= 50 🟢
item_repertorio PK id_item_repertorio, FK id_repertorio, FK id_musica (nullable), CHECK length(termo) <= 300 🟢
sugestao_repertorio PK id_sugestao_repertorio, INDEX (id_romcal, ano_liturgico) 🟢
liturgia_cache PK data 🟢
exemplar_biblioteca PK id_exemplar 🟢