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,rotuloseinformacoessão colunas TEXT armazenando JSON — sem normalização de relacionamentos. - 🟢
midias.YouTubedeprecated — usarYouTubes[]. - 🟡
informacoesestá 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.
- 🟢
rowidaponta paramusica.id_musicaimplicitamente. - 🟢 Pesos BM25: título=50, letra=5.
edicao_livro
- 🟢
detalhes ->> 'sigla'é coluna JSON virtual — usada na UI para exibir sigla do livro.
cantico_livro
- 🟢
indicepode ser alfanumérico (ex.:"23a"). - 🔴
ordemestá presente mas não é usada na busca por livro (DT-01, DT-02).
repertorio
- 🟢
ordem_musicasé array JSON com osid_musicana ordem definida pelo usuário — não é posição na tabelaitem_repertorio. - 🟢
data_exclusao IS NOT NULL= soft-deleted. - 🟢
id_tipo_repertorio = 1(Padrão) = intocável pelo usuário. - 🟡
slug.referencia≠slug.correntequando o repertório foi importado de outra conta e re-compartilhado.
item_repertorio
- 🟢
id_musicapode ser NULL (item de texto livre /termo). - 🟢
momentoetonalidadesão sugeridos automaticamente com base no histórico de uso.
sugestao_repertorio
- 🟢
itensé JSON inline —ItemSugestaoRepertoriocommetadata.ignorarpara 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 |
🟢 |