Visual Basic, VB .NET, ASP, Active X, Access, SQL Server

Relacionando uma tabela com ela mesma para manter hierarquias no banco de dados

Há ocasiões em que o programador precisa armazenar, no banco de dados, informações sobre entidades que estão contidas umas dentro de outras. Um exemplo disto seria a estrutura de árvore de diretórios num disco rígido.

Nestes casos, a forma simples de resolver o problema do armazenamento é criar uma tabela onde cada registro conterá, além dos dados de uma entidade, dois campos de identificação: um, para identificar a própria entidade;  e outro, para identificar a entidade pai. Assim, sempre que um registro for adicionado à tabela, além dos dados que descrevem a entidade, também será informado o identificador da entidade que lhe é superior na hierarquia. Para mover uma entidade  de um ramo da árvore para outro (e todas as que estão abaixo dela) , basta modificar o identificador da entidade pai no seu registro. Se o mecanismo gerenciador de banco de dados suporta a criação de relacionamentos entre tabelas de modo a garantir a integridade referencial, você pode criar um relacionamento da tabela com ela mesma com exclusão em cascata. Este relacionamento é usado para garantir que, ao excluir um registro, todos os registros que estão abaixo dele na hierarquia também sejam excluídos em cascata. O relacionamento deve ser entre os campos de identificação do pai com o campo de identificação da entidade. Ao  excluir um registro, todos aqueles que o tenham como pai também serão excluídos.

Há, porém, um pequeno inconveniente no que foi dito acima. Quando se quer adicionar o primeiro registro, ou seja, o pai de todos, caso o relacionamento já tenha sido definido, não será possível acrescentar nenhum registro que tenha como pai um valor nulo. E também não será possível adicionar, neste momento, um registro que tenha como identificador de pai um número que será usado como identificador do registro que se está tentando incluir. Isto porque a integridade referencial exigirá a existência prévia de um registro  que tenha como identificador aquele valor informado para o pai, mas, neste momento, o registro do raiz ainda não estará incluído para ser localizado. Ocorrerá um erro de conflito com a integridade referencial. A solução para o problema é adicionar o raiz sem identificador de pai antes de criar o relacionamento com integridade referencial e, após incluí-lo,  atribuir ao seu identificador de pai o mesmo identificador que ele receber após a inclusão. Feito isto, pode-se então criar o relacionamento com a integridade referencial.