Classe para verificar dependências entre tabelas.

Em muitos casos, principalmente em sistemas legados, temos dificuldade em rastrear dependências entre tabelas no banco de dados.

Lendo um artigo chamado “Identificar Restrições de Relacionamento no MySQL” de um amigo meu tive a ideia de criar estra classe para em ajudar com estas dependências.

Sei que por padrão não se colocar mais que uma classe por arquivo, mas para este caso especifico não achei necessário a criação de um novo arquivo para separação.

A execução é bem simples. A função busca informações da tabela indicada na base de informação do banco de dados (Mysql). O resultado é bem direto, com os relacionamentos entre as tabelas. Tudo que fiz foi organizar estes dados de forma a ser utilizados mais facilmente.

Neste LINK tem um exemplo de como posso usar a classe para desenhar as dependências usando esta classe.

arquivo nome: dependencia.php

<?php

class tabela {
    public $tabela;
    public $referencia;
    public $coluna;
}

class Dependencia {
    private $con;
    private $database;
    public $grafo;
    public $grafoFull;

    public function __construct($host, $user, $passwd, $database, $port) {
        $this->con = mysqli_connect($host, $user, $passwd, $database, $port);
        $this->grafo = array();
        $this->grafoFull = array();
        $this->database = $database;
    }

    public function dependencias($tabelaName) {
        $query = "SELECT TABLE_NAME, COLUMN_NAME
        FROM information_schema.KEY_COLUMN_USAGE
        WHERE TABLE_SCHEMA = '" . $this->database . "' AND REFERENCED_TABLE_NAME = '" . $tabelaName . "';";
        $resultSet = mysqli_query($this->con, $query);
        while ($row = mysqli_fetch_assoc($resultSet)) {
            $tabela = new tabela ();
            $tabela->tabela = $row ['TABLE_NAME'];
            $tabela->coluna = $row ['COLUMN_NAME'];
            $tabela->referencia = $tabelaName;
            if (!in_array($tabela, $this->grafo)) {
                $this->grafo [] = $tabela;
                $this->dependencias($row ['TABLE_NAME']);
            }
        }
    }

    public function dependenciasFull() {
        $this->grafo = array();
        $query = "SELECT TABLE_NAME
            FROM information_schema.TABLES
            WHERE TABLE_SCHEMA = '" . $this->database . "';";
        $resultSet = mysqli_query($this->con, $query);
        while ($row = mysqli_fetch_assoc($resultSet)) {
            $this->dependencias($row ['TABLE_NAME']);
            if (!empty($this->grafo))
                $this->grafoFull [$row ['TABLE_NAME']] = $this->grafo;
            $this->grafo = array();
        }
    }

}

Qualquer dúvida ou dicas, entre em contato: leandrolt@gmail.com

Leave a Reply

Your email address will not be published. Required fields are marked *