Pular para conteúdo

Modelagem de Dados

← Início

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.

Arquitetura de Persistencia

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)    │
└───────────────┴────────────────────────────────────┘

← Início