Identificar Restrições de Relacionamento no MySQL


    Casualmente nos deparamos com uma situação em que temos que identificar todas as restrições de uma dada tabela. Para constar vou exemplificar como encontrar estas restrições.

    Este será um breve artigo para ajudar na manutenção de bancos de dados MySQL. Se você ainda não viu meu artigo anterior, já lhe informo que este é um complemento para o anterior e uma prévia para o próximo.

    Em minha publicação anterior citei que por vezes precisamos sumarizar tabelas, e demonstrei como fazê-lo no caso mais fácil, que é no caso de tabelas atributivas. Agora pretendo fazer uma preparação para um próximo tópico que vou abordar: Como lidar com o mesmo caso de duplicação de dados, desta vez com muitas tabelas.

    Se você trabalha com um banco de dados de 10 ou 20 tabelas, ainda que sejam poucas não vejo motivos para não utilizar os recursos existentes no MySQL para agilizar o processo de busca de regras de restrições.

    Pois bem veja só o cenário, possuo uma tabela de produtos com dados duplicados, outras tabelas se referenciam a ela, por vezes o usuário do sistema registra uma venda, ou reserva com o produto que quer vender, no caso o produto está duplicado, e ele escolhe por vezes um ou outro. Como todo os sistema funciona corretamente ele não se importa com o pequeno defeito.

    Porém agora temos uma tabela de venda, e uma de reserva com dados inconsistentes. Este tipo de defeito será notado em relatórios. Quando o analista for extrair a informação agrupando por produto ele verá que existe uma duplicação. Consequentemente ele será obrigado a fazer qualquer tipo de gambiarra para unir os produtos. E de gambiarra em gambiarra a performance do sistema e a legibilidade do script vão para o espaço.

    Veja que coisa, alguém começou a vestir as calças pela cabeça, e agora é o analista que deve lidar com isso, para mostrar um relatório perfeito para seus gestores.

    Ok, este é o exemplo que vou usar aqui, mas digamos que você possua 200 ou 300 tabelas. Vai vasculhar uma por uma até encontrar as constraints apontando para a sua tabela problemática? Nada produtivo. Acredito que existam recursos similares para outros tipos de bancos de dados, mas vou exemplificar o feito em MySQL.

A primeira coisa que recomendo é expiar aqui com o comando de descrição de tabelas:

DESC information_schema.KEY_COLUMN_USAGE;

Este comando descreve o conteúdo relativo a tabelas e suas restrições, com base na informação aqui contida, pude montar a seguinte query:

SELECT 
    TABLE_NAME, COLUMN_NAME
FROM
    information_schema.KEY_COLUMN_USAGE
WHERE
    TABLE_SCHEMA = 'empresa' AND REFERENCED_TABLE_NAME = 'produto';

    Eu simplesmente indico o schema da tabela e a tabela alvo, no meu caso a tabela produto. Visto que reserva e venda apontam para ela. A utilidade deste script é tremenda, no pior caso o desenvolvedor desconhece totalmente o sistema, e com isso é possível identificar todas as referências que serão impactadas por uma possível mudança.

    Bem por enquanto é só, no próximo artigo vou demonstrar como sumarizar tabelas exemplificando de forma bem mais prática, por hora deixo este script que acredito que será útil ao desenvolvedor em algum momento.

0 comentários: