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

  1. R tem de ser uma associação de um para um.

    Justificação: Para uma determinda entidade de X só pode corresponder uma entidade de Y (porque A-->B e, A e B são chaves de X e Y respectivamente. O facto de B ser chave de Y significa que os valores de B são únicos, não pode haver repetidos. Logo, a cada entidade de X só pode corresponder uma entidade de Y.) A situação contrária é idêntica e a justificação é semelhante. Isto é, para uma determinada entidade de Y só pode corresponder uma entidade de X.

  2. Sim, basta que B seja também uma chave candidata. Se isso acontecer, B-->C não viola a condição de BCNF.

  3. A diferença é que uma relação é um conjunto. Logo, não pode ter tuplos repetidos. Uma tabela pode ter.

  4. Chave primária: Conjunto de atributos de uma relação que determina univocamente um tuplo da relação (em SQL, apenas pode haver uma chave primária por relação).

    Chave candidata: A definição é idêntica à de chave primária mas sem a restrição de só poder haver uma. Isto é, podem existir várias chaves candidatas mas só pode haver uma chave primária por relação.

    Chave estrangeira: Conjunto de atributos de uma relação que são chave de uma outra relação.

  5. Sim, com uma asserção:
       CREATE ASSERTION b_unico CHECK (
          1 >= ALL (SELECT COUNT(*)
                    FROM R
                    GROUP BY B)
       );
    
    
  6. Não, basta dar um exemplo. Se,
       R:                    S: 
            a | b                a | b 
           -------              -------
            3 | 5                3 | 5 
            1 | 3                2 | 7
            3 | 8
    
    então:
       R-S:                    
            a | b              
           -------             
            1 | 3              
            3 | 8
    
    Fazendo os cálculos para ambas as expressões obtemos resultados diferentes.
    
       PI_a( R-S ) = {1,3}
    
       PI_a( R ) - PI_a( S ) =  {1,3} - {3,2} = {1}
     
    
  7. A única resposta realmente certa é a (a), mas também considerei certo que tivesse colocado a (c).
  8.    SELECT nota, COUNT(*) AS numero
       FROM notas
       GROUP BY nota
       ORDER BY nota DESC;
    
    
  9. O atributo A não pode ser NULL.

    A questão essencial (e que quase ninguém conseguiu ver) é que,

       SELECT * FROM R WHERE A = A
    
    vai dar todos os tuplos de R excepto aqueles em que A é NULL (porque NULL=NULL não é verdadeiro, é UNKNOWN). Logo,
       SELECT * FROM R
       EXCEPT
       SELECT * FROM R WHERE A = A
    
    vai dar os tuplos de R em que A é NULL. Como temos NOT EXISTS no ínicio da asserção, isso significa que R não pode ter tuplos em que A seja NULL.

    (NOTA: havia uma gralha no enunciado da pergunta. Em vez de AS deveria ser CHECK).