Em ambos os casos, a chave deve ser constituída apenas pelo atributo filho. Justificação: existe a dependência funcional,
filho --> pai (na relação PaiDe) filho --> mãe (na relação MãeDe)
Isto é, uma pessoa só pode ter um pai e só pode ter uma mãe. Por outras palavras, não pode haver filhos repetidos na relação PaiDe e MãeDe.
CREATE TABLE PaiDe( pai VARCHAR(30), filho VARCHAR(30) PRIMARY KEY ); CREATE TABLE MãeDe( mãe VARCHAR(30), filho VARCHAR(30) PRIMARY KEY );
NOTA: Em vez de VARCHAR poderia ser INTEGER (nesse caso seria uma espécie de código associado à pessoa).
CREATE TABLE PaiDe( pai VARCHAR(30), filho VARCHAR(30) PRIMARY KEY, CHECK( pai <> filho ) ); CREATE TABLE MãeDe( mãe VARCHAR(30), filho VARCHAR(30) PRIMARY KEY, CHECK( mãe <> filho ) );
Podemos ter avô paterno (pai do pai) ou materno (pai da mãe). A mesma coisa para avó.
CREATE VIEW AvôDe(avô,neto) AS ( -- avô paterno: pai do pai SELECT P1.pai, P2.filho FROM PaiDe P1, PaiDe P2 WHERE P1.filho = P2.pai ) UNION ( -- avô materno: pai da mãe SELECT P.pai, M.filho FROM PaiDe P, MãeDe M WHERE P.filho = M.mãe ); CREATE VIEW AvóDe(avó,neto) AS ( -- avó materna: mãe da mãe SELECT M1.mãe, M2.filho FROM MãeDe M1, MãeDe M2 WHERE M1.filho = M2.mãe ) UNION ( -- avó paterna: mãe do pai SELECT M.mãe, P.filho FROM MãeDe M, PaiDe P WHERE M.filho = P.pai );
A ideia é utilizar as views avô e avó feitas anteriormente. Um bisavô é alguém que é pai de um avô (ou pai de uma avó). O caso de bisavó é idêntico.
CREATE VIEW BisavôDe(bisavô,bisneto) AS ( -- pai do avô SELECT P.pai, A.neto FROM PaiDe P, AvôDe A WHERE P.filho = A.avô ) UNION ( -- pai da avó SELECT P.pai, A.neto FROM PaiDe P, AvóDe A WHERE P.filho = A.avó ); CREATE VIEW BisavóDe(bisavó,bisneto) AS ( -- mãe do avô SELECT M.mãe, A.neto FROM MãeDe M, AvêDe A WHERE M.filho = A.avô ) UNION ( -- mãe da avó SELECT M.mãe, A.neto FROM MãeDe M, AvóDe A WHERE M.filho = A.avó );
Vou assumir que meio-irmãos são irmãos. Assim, 2 pessoas são irmãos se tiverem o mesmo pai ou a mesma mãe.
CREATE VIEW Manos(pessoa1,pessoa2) AS ( -- pares de pessoas que têm o mesmo pai SELECT P1.filho, P2.filho FROM PaiDe P1, PaiDe P2 WHERE P1.pai = P2.pai AND P1.filho < P2.filho ) UNION ( -- pares de pessoas que têm a mesma mãe SELECT M1.filho, M2.filho FROM MãeDe M1, MãeDe M2 WHERE M1.mãe = M2.mãe AND M1.filho < M2.filho );
A chave deveria ser os composta pelos dois atributos: {pessoa1,pessoa2}. A justificação é que uma pessoa pode ter vários irmãos e irmãs. Isto é, pode haver duplicados nos atributos pessoa1 e pessoa2.