[quote=Jokabeludoido]Olá…
Estou trabalhando com inferências sobre dados em Bancos de dados relacionais.
Minhas inferências dão origem a grafos, que também são armazenados no BD e carregados na aplicação quando a inferência é iniciada.
o grafo que quero armazenar no BD no momento, representa átomos lógicos conectados por conectivos lógicos (no momento apenas AND e OR). Assim, meu grafo tem origem em um conjunto de nodos inter-relacionados, onde cada nodo pode ser um átomo lógico ou um conectivo lógico. Pensei nas seguintes tabelas para armazenar o grafo:
->Nodo
int ID: identificador
->Nodo_Atomo_Logico
int ID: identificador
int ID_Polaridade: faz referência à polaridade do átomo (se é uma afirmação ou uma negação). Referência à tabela Tipo_Polaridade
->Nodo_Conectivo_logico
int ID: identificador
int ID_Conectivo: faz referência a um tipo de conectivo (AND ou OR, neste caso). Referência à tabela Tipo_Conectivo
->Aresta
int ID_Pai: identificador do nodo pai. Faz referência à tabela Nodo
int ID_Filho: identificador do nodo filho. Faz referência à tabela Nodo
Como podem ver, “Nodo_Atomo_Logico” e “Nodo_Conectivo_Logico” precisariam ser especializações de “Nodo”. Sempre que eu inserisse um registro de um destes dois tipos, seria inserido um registro em Nodo. É preciso fazer esta modelagem para manter uma normalização na modelagem da Aresta, porque arestas podem ser estabelecidas entre dois nodos de qualquer tipo.
Queria saber como posso implementar esta herança em um banco de dados relacional. Estou usando o Oracle 10g XE em meus testes.[/quote]
Há basicamente três soluções para herança em BD relacional
- Uma tabela para toda a hierarquia de classe. É a solução proposta pelo Adelar. Você teria uma única tabela:
->Nodo
int ID: identificador
byte TIPO: indica à que classe pertence
int ID_Polaridade: faz referência à polaridade do átomo (se é uma afirmação ou uma negação). Referência à tabela Tipo_Polaridade
int ID_Conectivo: faz referência a um tipo de conectivo (AND ou OR, neste caso). Referência à tabela Tipo_Conectivo
Vantagens: simplicidade de implementação e facilidade no acesso aos dados
Desvantagens: Alto acoplamento;
- Uma tabela por classe concreta: Você teria 2 tabelas
->Nodo_Atomo_Logico
int ID: identificador
int ID_Polaridade: faz referência à polaridade do átomo (se é uma afirmação ou uma negação). Referência à tabela Tipo_Polaridade
->Nodo_Conectivo_logico
int ID: identificador
int ID_Conectivo: faz referência a um tipo de conectivo (AND ou OR, neste caso). Referência à tabela Tipo_Conectivo
Vantagens: Implementação fácil e menor acoplamento que a primeira abordagem
Desvantagens: Baixo suporte a polimorfismo. Caso você precise realizar um select de todos os nodos, terá que contar com metadados
- Uma tabela por classe: Você teria 3 tabelas
->Nodo
int ID: identificador
->Nodo_Atomo_Logico
int ID: identificador
int ID_Polaridade: faz referência à polaridade do átomo (se é uma afirmação ou uma negação). Referência à tabela Tipo_Polaridade
->Nodo_Conectivo_logico
int ID: identificador
int ID_Conectivo: faz referência a um tipo de conectivo (AND ou OR, neste caso). Referência à tabela Tipo_Conectivo
Vantagens: Baixo acoplamento, alto suporte a polimorfismo e é o mais aderente à OO
Desvantagem: Implementação difícil e busca de informação menos eficiente.
Abraços