Base de Dados, 2004/2004
Resolução do exame de época de recurso

  1. 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.

  2.    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).

  3.    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 )
       );
    
  4. 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 
         );
    
  5. 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ó
         );
    
  6. 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
         );
    
  7. 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.