Modelagem de Dados¶
Arquitetura de Persistência (Híbrida)¶
O sistema utiliza uma arquitetura híbrida de bancos de dados, onde MongoDB é o banco principal para os dados de negócio, e MySQL é utilizado para dados transacionais críticos.

Por que MongoDB como principal? - Diferentes máquinas possuem especificações variadas - Schema flexível permite cadastro dinâmico de atributos - Dados não-estruturados são mais utilizados no sistema
Schemas MongoDB¶
estrutura inicial sugerida (provavelmente vai mudar)
Empresas¶
{
_id: ObjectId,
razao_social: String,
cnpj: String, // único, indexado
endereco: {
logradouro: String,
numero: String,
cidade: String,
estado: String,
cep: String
},
contato: {
email: String,
telefone: String
},
configuracoes: Object, // flexível por empresa
created_at: Date,
updated_at: Date
}
Fábricas¶
{
_id: ObjectId,
empresa_id: ObjectId, // referência à empresa
nome: String,
tipo: String, // "galpão", "fábrica", "unidade"
dimensoes: {
largura: Number,
comprimento: Number,
altura: Number
},
localizacao: {
latitude: Number,
longitude: Number
},
layout: String, // referência ao Digital Twin
capacidade: Number,
created_at: Date,
updated_at: Date
}
Máquinas (Schema Dinâmico)¶
{
_id: ObjectId,
fabrica_id: ObjectId, // referência à fábrica
nome: String,
tipo: String, // "prensa", "cnc", "robô", etc.
coordenadas: {
x: Number,
y: Number,
z: Number
},
status: String, // "ativo", "manutencao", "inativo"
especificacoes: Object, // ← CAMPO DINÂMICO
/*
* Exemplos de especificacoes por tipo:
*
* Prensas: { tonelagem, course, force }
* CNC: { axes, spindle_speed, workspace }
* Robôs: { reach, payload, axes_count }
* Custom: qualquer campo específico
*/
manutencao: {
ultima: Date,
proxima: Date,
historico: [{
data: Date,
tipo: String,
descricao: String
}]
},
created_at: Date,
updated_at: Date
}
Produções¶
{
_id: ObjectId,
fabrica_id: ObjectId,
maquina_id: ObjectId,
ordem: String, // número da ordem de produção
data_inicio: Date,
data_fim: Date,
quantidade: Number,
status: String, // "em_andamento", "concluido", "cancelado"
pecas: [{
tipo: String,
quantidade: Number,
tempo_por_unidade: Number
}],
created_at: Date,
updated_at: Date
}
Peças (Rastreamento)¶
{
_id: ObjectId,
producao_id: ObjectId,
codigo: String, // único, código de rastreamento
tipo: String,
etapas: [{
nome: String,
maquina_id: ObjectId,
inicio: Date,
fim: Date,
status: String
}],
localizacao_atual: String,
created_at: Date,
updated_at: Date
}
Tabelas MySQL¶
Usuários¶
CREATE TABLE usuarios (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
empresa_id VARCHAR(24), -- ObjectId MongoDB
nome VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
senha_hash VARCHAR(255) NOT NULL,
role ENUM('admin', 'gerente', 'operador', 'viewer') NOT NULL,
ativo BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
);
Auditoria/Logs de Sistema¶
CREATE TABLE logs_auditoria (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
usuario_id BIGINT,
acao VARCHAR(100) NOT NULL,
entidade VARCHAR(100) NOT NULL,
entidade_id VARCHAR(24), -- ObjectId MongoDB
detalhes JSON,
ip_address VARCHAR(45),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE SET NULL
);
Índices Recomendados (MongoDB)¶
// Empresas
db.empresas.createIndex({ cnpj: 1 }, { unique: true });
db.empresas.createIndex({ razao_social: 1 });
// Fábricas
db.fabricas.createIndex({ empresa_id: 1 });
db.fabricas.createIndex({ empresa_id: 1, nome: 1 });
// Máquinas
db.maquinas.createIndex({ fabrica_id: 1, status: 1 });
db.maquinas.createIndex({ fabrica_id: 1, tipo: 1 });
// Produções
db.producoes.createIndex({ fabrica_id: 1, data_inicio: -1 });
db.producoes.createIndex({ maquina_id: 1, status: 1 });
// Peças
db.pecas.createIndex({ codigo: 1 }, { unique: true });
db.pecas.createIndex({ producao_id: 1 });
db.pecas.createIndex({ "etapas.maquina_id": 1 });
Diagrama de Relacionamentos¶
EMPRESA (MongoDB)
│
│ 1:N
▼
FÁBRICA (MongoDB)
│
│ 1:N
▼
MÁQUINA (MongoDB)
│
│ 1:N
▼
PRODUÇÃO (MongoDB)
│
│ 1:N
▼
PEÇA (MongoDB)
────────────────────────────────────
USUÁRIO (MySQL)
│
│ N:1 (empresa_id)
▼
EMPRESA (MongoDB)
LOG_AUDITORIA (MySQL)
│
│ N:1 (usuario_id)
▼
USUÁRIO (MySQL)
Ações de auditoria¶
┌───────────────┬────────────────────────────────────┐
│ Ação │ Descrição │
├───────────────┼────────────────────────────────────┤
│ CRIACAO │ Novo registro criado │
├───────────────┼────────────────────────────────────┤
│ ATUALIZACAO │ Registro modificado │
├───────────────┼────────────────────────────────────┤
│ EXCLUSAO │ Registro removido │
├───────────────┼────────────────────────────────────┤
│ LOGIN │ Usuário autenticado │
├───────────────┼────────────────────────────────────┤
│ LOGOUT │ Usuário desconectado │
├───────────────┼────────────────────────────────────┤
│ ACESSO_NEGADO │ Tentativa de acesso não autorizado │
├───────────────┼────────────────────────────────────┤
│ IMPORTACAO │ Importação de dados (CSV/Excel) │
└───────────────┴────────────────────────────────────┘