Compreender o Metamodelo Orientado a Dados
A maioria das ferramentas de EA codifica o seu modelo de objetos diretamente no código-fonte da aplicação. O Canopy adota uma abordagem diferente: todos os conceitos estruturais — tipos de cartão, campos, subtipos, relações, funções de partes interessadas e campos calculados — são armazenados como dados na base de dados, não como código. Esta página explica porque foi tomada essa decisão e o que significa na prática.
O que é o metamodelo
O metamodelo é o esquema do seu modelo de EA. Define:
- Tipos de cartão — os tipos de entidades que acompanha (Application, BusinessCapability, Initiative, etc.)
- Campos — as propriedades que essas entidades podem conter (estado do ciclo de vida, custo, responsável, pilha tecnológica, etc.)
- Subtipos — variantes mais detalhadas de um tipo que partilham o mesmo conjunto de campos (por exemplo, Application → Microservice, SaaS, AI Agent)
- Tipos de relação — as ligações permitidas entre tipos (Application "executa em" ITComponent, Initiative "concretiza" BusinessCapability, etc.)
- Funções de partes interessadas — as funções que os utilizadores podem desempenhar num cartão específico (Responsável Técnico, Responsável de Negócio, Gestor de Dados, etc.)
- Campos calculados — fórmulas que derivam valores de campo a partir de outros dados no momento de guardar
Todos estes elementos são linhas em card_types, relation_types e colunas JSONB associadas. Nenhum deles requer uma alteração de código ou o reinício da aplicação para ser modificado.
Porquê dados e não código?
Personalização sem ramificações
As diferentes organizações têm metamodelos de EA muito distintos. Algumas equipas acompanham "Fornecedor", "Licença" e "SLA". Outras acompanham "Domínio de Dados", "Capacidade ESG" e "Cadeia de Valor". Se o metamodelo fosse código, cada personalização exigiria uma ramificação do produto ou um sistema de extensões — ambos com custos elevados de manutenção.
Com um metamodelo orientado a dados, um administrador pode adicionar um novo campo, renomear um tipo de cartão ou definir um tipo de relação personalizado em minutos, através da interface ou da API. O frontend adapta-se automaticamente: a grelha de Inventário ganha uma nova coluna, a página de Detalhe do Cartão exibe a nova secção, e os relatórios podem filtrar pelo novo campo. Sem necessidade de nova implementação.
Evolução do esquema sem migrações por cliente
Quando o Canopy lança um novo tipo de cartão ou campo integrado, fá-lo através de seed.py — uma rotina de arranque que verifica se a linha integrada existe e só a cria se estiver em falta. As personalizações existentes nunca são alteradas. Isto significa que:
- Atualizar o Canopy não substitui os seus campos personalizados
- Os tipos integrados continuam a ser editáveis (pode alterar o ícone, a cor ou o nome de "Application" sem criar uma ramificação)
- Se um valor predefinido integrado se desviar do valor original, uma migração Alembic condicionada corrige apenas as linhas não modificadas
Multi-arrendamento num único código-fonte
Como o metamodelo é dados, uma única implementação do Canopy pode servir equipas com modelos de objetos completamente diferentes — ou a mesma implementação pode ser reconfigurada inteiramente sem tocar no código-fonte.
A estrutura fields_schema
Cada tipo de cartão armazena as suas definições de campo como uma matriz JSONB de secções:
[
{
"section": "Technology",
"columns": 2,
"fields": [
{
"key": "techStack",
"label": "Technology Stack",
"type": "multiple_select",
"options": [{"key": "java", "label": "Java"}, {"key": "python", "label": "Python"}],
"weight": 2
}
]
}
]
O weight em cada campo alimenta a pontuação de qualidade de dados — os cartões são pontuados entre 0 e 100% com base na quantidade de campos ponderados que estão preenchidos. Isto transforma o metamodelo num mecanismo de controlo de qualidade: define o que são "bons" dados atribuindo pesos mais elevados aos campos mais importantes.
O que não pode ser alterado através do metamodelo
O metamodelo governa a forma, não o comportamento. Alguns aspetos permanecem no código:
- O motor de cálculo — a sandbox segura que avalia fórmulas é uma biblioteca Python (
simpleeval). As fórmulas em si são dados, mas o avaliador é código. - O sistema de permissões — o conjunto de chaves de permissão válidas é uma lista de permissões em
backend/app/core/permissions.py. Adicionar uma nova chave de permissão (não apenas concedê-la) requer uma alteração de código. - O esquema de base de dados — adicionar uma nova tabela de nível superior (por exemplo, um novo módulo como PPM ou GRC) requer uma migração Alembic. O esquema de atributos de cartão expande-se sem migrações porque os atributos são JSONB.
Consulte também
- Administração do metamodelo — como adicionar e editar tipos através da interface
- Cálculos — como definir fórmulas para campos calculados
- Permissões e Funções — como o modelo de permissões interage com os tipos de cartão