Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Análise - árvore
Message
General information
Forum:
Visual FoxPro
Category:
Coding, syntax & commands
Miscellaneous
Thread ID:
00741965
Message ID:
00742192
Views:
15
This message has been marked as a message which has helped to the initial question of the thread.
Oi Pedro,

Acrescentando às opções já citadas pelos colegas, você poderia considerar a utilização de somente uma entidade (tabela) para modelar esta situação. Neste caso, você teria um auto-relacionamento entre a tabela correspondente, ou seja, a chave-estrangeira da tabela referenciaria a chave-primária da própria tabela. Veja abaixo uma sugestão de esquema para esse modelo (podes rodar diretamente na Command Window):
CREATE DATABASE DBParentes

CREATE TABLE Parentes ;
  (ID Integer PRIMARY KEY , ;
   Nome Char(20) NOT NULL, ;
   Pai Integer REFERENCES Parentes NULL, ;
   Mae Integer REFERENCES Parentes NULL ;
  )
  
INSERT INTO Parentes VALUES (1, "Gaspar",    NULL, NULL)
INSERT INTO Parentes VALUES (2, "Fátima",    NULL, NULL)
INSERT INTO Parentes VALUES (3, "Gonçalves", 1,    2)
INSERT INTO Parentes VALUES (4, "Ernestina", NULL, NULL)
INSERT INTO Parentes VALUES (5, "Antonio",   3,    4)
INSERT INTO Parentes VALUES (6, "Maria",     NULL, NULL)
INSERT INTO Parentes VALUES (7, "João",      5,    6)
Um exemplo de consulta que retornaria a relação direta de pai/mãe-filho poderia ser escrita da seguinte forma:
SELECT Filho.Nome as Nome , Pai.Nome as Eh_filho_de, Mae.Nome as E ;
  FROM Parentes Filho, Parentes Pai, Parentes Mae ;
  WHERE Filho.Pai = Pai.ID AND ;
        Filho.Mae = Mae.ID AND ;
        NOT ISNULL(Filho.Pai) ;
  INTO CURSOR curRelacoes
Note que este tipo de modelagem hierárquica em modelos relacionais não é a ideal, especialmente quando se deseja permitir indeterminados nívels hieráquicos (bisavô/avô/pai/filho/neto,etc). Isto porque seria necessário vários "joins" para a mesma tabela a fim de selecionar estes níveis (veja que o exemplo acima usa três joins somente para um nível hierárquico).

Obviamente, uma rotina que usasse recursividade poderia também ajudar aqui, mas como sabemos, recursividade não é a coisa mais rápida e flexível do mundo...

Existem outras abordagens mais adequadas para modelos relacionais como a técnica de listas de adjacência muito bem explorada no modelo SQL nos livros do Joe Celko. Para não estender ainda mais esta mensagem não abordarei esta idéia aqui, mas oportunamente poderíamos trocar uma idéia ;)

Um abraço!
-----
Fabio Vazquez
http://www.fabiovazquez.com
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform