# Cheat sheet

Chaves, formas normais, decomposição, álgebra, SQL, isolamento e decisões de desenho.

Página: https://resumos.rgo.pt/cadeiras/bd/folha-consulta/

Esta folha reúne as regras e decisões já explicadas nas lições, para rever antes de resolver exercícios. Cada secção indica o procedimento, as condições e os erros frequentes, com ligações para a explicação completa.

## Modelação e relações

| Construção | Tradução e cuidado |
| --- | --- |
| Classe | Relação com atributos e chave. Um nome repetível não identifica um objeto. |
| 1:N | FK no lado N; `NOT NULL` se tiver de referenciar alguém. Não obriga cada objeto do lado 1 a participar. |
| N:M | Relação da associação, FKs e chave segundo as multiplicidades. Atributos da ligação ficam aqui. |
| 1:1 | FK com `UNIQUE`; `NOT NULL` para obrigatoriedade no lado que a guarda. |
| Ternária | Relação com os participantes. Multiplicidade num lado conta-o para um par fixo dos outros dois. |
| Generalização | Por classe, por tipo concreto ou tabela única. Confere completude e disjunção separadamente. |

A multiplicidade junto de uma classe conta objetos **dessa classe** por objeto da outra. Uma classe de associação não distingue várias ligações do mesmo par. Uma FK não impõe mínimos de participação no lado referenciado.

Erro frequente: ler a multiplicidade do lado errado e concluir a participação inversa. Outro erro: usar `DISTINCT` para esconder uma junção errada em vez de escolher o id correto.

[UML](https://resumos.rgo.pt/cadeiras/bd/modelo-conceptual-uml/#associa%C3%A7%C3%B5es-e-multiplicidades) · [Mapeamento](https://resumos.rgo.pt/cadeiras/bd/mapeamento-relacional/#associa%C3%A7%C3%B5es-um-para-muitos).

## Dependências e formas normais

$X\to Y$ significa que concordar em X obriga a concordar em Y em todas as instâncias válidas.

Para $X^+$, começa em X e aplica DFs cujas esquerdas já tens, até estabilizar. Superchave: fecho completo. Candidata: superchave mínima. Primo: pertence a alguma candidata.

Erros frequentes: concluir uma DF a partir de uma amostra; separar a esquerda de $AB\to C$; testar redundância sem retirar a DF antes do fecho.

[Fechos e chaves](https://resumos.rgo.pt/cadeiras/bd/normalizacao/#fecho-de-um-conjunto-de-atributos).

| Forma | Critério |
| --- | --- |
| 1FN | Valores atómicos no modelo, sem grupos repetidos. |
| 2FN | Não primo não depende de parte própria de candidata. |
| 3FN | Para cada DF não trivial $X\to A$, X é superchave ou A é primo. |
| BCNF | Em toda a DF não trivial, X é superchave. |

Pode haver 3FN sem BCNF: $AB\to C$, $C\to B$, candidatas AB e AC. C não é superchave, mas B é primo. [Classificação](https://resumos.rgo.pt/cadeiras/bd/normalizacao/#classificar-uma-rela%C3%A7%C3%A3o).

## Decomposição

| Objetivo | Como conferir |
| --- | --- |
| Sem perda, binária | O comum determina um dos lados: $(R_1\cap R_2)\to R_1$ ou $R_2$. |
| Sem perda, geral | Chase. Unifica pelas DFs; procura uma linha só com símbolos distinguidos. |
| Preservar DFs | A união das projeções implica as DFs originais. Confere por fechos. |
| BCNF | Pela violação $X\to Y$, separa $X\cup Y$ e $R-(Y-X)$; projeta e repete. |
| Síntese 3FN | Cobertura mínima, relação por DF, retira esquemas contidos e acrescenta candidata se nenhuma relação a contiver. |

A síntese tem de cobrir todos os atributos, incluindo os ausentes das DFs, e conter uma candidata. Recuperar uma coluna sem conservar as suas combinações não garante junção sem perda.

O algoritmo de decomposição BCNF garante junção sem perda, mas pode perder preservação. Cobertura mínima: separa direitas, reduz esquerdas, retira DFs redundantes. Para testar redundância de uma DF, retira-a antes do fecho. No chase, mostra os tableaux sucessivos: cada unificação muda símbolos até estabilizar. [Decomposição](https://resumos.rgo.pt/cadeiras/bd/decomposicao/#decompor-at%C3%A9-bcnf).

## Álgebra relacional

| Operador | Efeito |
| --- | --- |
| $\sigma_p$ | Filtra tuplos. |
| $\pi_X$ | Escolhe atributos e elimina duplicados. |
| $\rho$ | Renomeia relação ou atributos. |
| $\times$ | Todos os pares; cardinalidade $m n$. |
| $\bowtie_p$ | Seleção de pares que satisfazem p. |
| $\bowtie$ | Igualdade de todos os nomes comuns; sem comuns, produto. |
| $\ltimes_p$ | Conserva tuplos da esquerda com correspondência, sem colunas da direita. |
| $\gamma$ | Agrupa e agrega, extensão da álgebra clássica. |
| $\cup,\cap,-$ | Esquemas compatíveis; diferença tem direção. |
| $R(X,Y)\div S(Y)$ | X ligados a todos os Y de S. |

Divisão: candidatos $\pi_X(R)$; faltas $(\pi_X(R)\times S)-R$; retira candidatos com faltas. Se S vazia, devolve $\pi_X(R)$. Para outro universo de candidatos, define-o explicitamente. [Álgebra](https://resumos.rgo.pt/cadeiras/bd/algebra-relacional/#divis%C3%A3o-perguntas-com-todos).

## SQLite e SQL

*   `PRAGMA foreign_keys = ON` por ligação, antes da transação. FK composta declara-se em conjunto.
*   `CHECK` rejeita falso, não desconhecido. Usa `NOT NULL` para obrigatoriedade.
*   `UNIQUE` permite vários `NULL`. Em primárias textuais/compostas comuns, declara `NOT NULL` explicitamente.
*   `INTEGER` é afinidade em tabelas comuns; `VARCHAR(20)` não limita comprimento. `STRICT` tem outro contrato.
*   Na atribuição automática habitual, `INTEGER PRIMARY KEY` usa um id superior ao maior presente e pode reutilizar ids apagados. `AUTOINCREMENT` proíbe reutilização, com custo de `sqlite_sequence`.
*   `5 / 2 = 2`; usa operando real para divisão real.
*   `WHERE` filtra linhas; `HAVING` filtra grupos. Não agregues depois de uma junção sem conferir a multiplicação de linhas.
*   `COUNT(*)` conta linhas; `COUNT(x)` ignora nulos; `COUNT(DISTINCT x)` ignora nulos e repetições.
*   Agregação vazia sem `GROUP BY`: `COUNT = 0`; `SUM/AVG/MIN/MAX = NULL`. Com `GROUP BY`, não há grupos.
*   `LEFT JOIN` conserva a esquerda. Filtros da direita no `WHERE` podem remover as linhas sem correspondência.
*   `NULL = NULL` é desconhecido; usa `IS NULL`. `WHERE` conserva apenas verdadeiro.
*   `NOT IN` com nulos pode não produzir a ausência pretendida. `NOT EXISTS` exprime ausência de correspondências.
*   “Todos” equivale a `NOT EXISTS` de uma falta, usando outro `NOT EXISTS` dentro. Requisitos vazios satisfazem a condição universal.
*   `DISTINCT` aplica-se à combinação completa. `ORDER BY` define a ordem; `LIMIT 1` não resolve empates por si só.

[DDL](https://resumos.rgo.pt/cadeiras/bd/sql-definicao-dados/#create-table-e-restri%C3%A7%C3%B5es) · [Consultas](https://resumos.rgo.pt/cadeiras/bd/sql-consultas/#group-by-e-having) · [Subconsultas](https://resumos.rgo.pt/cadeiras/bd/sql-subconsultas/#perguntas-com-todos).

## CTEs, vistas, gatilhos e acessos

CTE dura uma instrução. Recursão tem parte inicial, passo e prova de terminação. `UNION` elimina tuplos completos, não apenas o id; acrescentar profundidade pode impedir a eliminação de ciclos. D’Hondt: recursão só gera divisores 1..M; quocientes por produto cartesiano; top M com desempate explícito. [Recursão](https://resumos.rgo.pt/cadeiras/bd/sql-recursao/#divisores-e-distribui%C3%A7%C3%A3o-de-mandatos).

Contagens em níveis diferentes usam agregações separadas antes da junção. Máximos por grupo exigem correlação pelo grupo; `LIMIT 1` global não escolhe um máximo de cada grupo. Ao reunir origens, conserva `(tipo,id)` como identidade. Para A superar B em todos os grupos, procura um grupo sem comparação verdadeira, incluindo empate, desconhecido e resultado ausente. [CTEs](https://resumos.rgo.pt/cadeiras/bd/sql-recursao/#comparar-contagens-de-n%C3%ADveis-diferentes).

Vista virtual guarda uma pergunta; materializada guarda resultados. SQLite atualiza vistas através de `INSTEAD OF`, não automaticamente. Gatilhos SQLite são por linha: INSERT tem NEW, DELETE tem OLD, UPDATE tem ambos. `UPDATE OF` não prova mudança de valor. Prefere restrições declarativas. [Vistas e gatilhos](https://resumos.rgo.pt/cadeiras/bd/vistas-gatilhos-acessos/#gatilhos-evento-condi%C3%A7%C3%A3o-e-a%C3%A7%C3%A3o).

Validar compatibilidade e stock pode exigir `BEFORE`; debitar a inserção aceite usa `AFTER`. `ABORT` desfaz o lote inteiro e os seus gatilhos. Na mudança de quantidade da mesma reserva, usa disponibilidade `stock + OLD.qtd` e variação `OLD.qtd - NEW.qtd`. Gatilhos de inserção não tratam alterações e eliminações. [Stock](https://resumos.rgo.pt/cadeiras/bd/vistas-gatilhos-acessos/#validar-compatibilidade-e-reservar-stock).

SQLite não tem `GRANT`/`REVOKE`/RLS. PostgreSQL separa privilégios, papéis e políticas por linha. RLS não concede privilégios; proprietário, superutilizador e `BYPASSRLS` têm regras de exceção. Parâmetros separam dados de código. [Acessos](https://resumos.rgo.pt/cadeiras/bd/vistas-gatilhos-acessos/#autentica%C3%A7%C3%A3o-e-autoriza%C3%A7%C3%A3o).

## Índices e transações

Índice não único acelera acesso, sem impor unicidade. Um composto ordena pela ordem das colunas; igualdade no prefixo e intervalo no seguinte são um padrão útil. Mais índices aumentam custo de escrita. Confere plano e distribuição. [Índices](https://resumos.rgo.pt/cadeiras/bd/indices-transacoes/#%C3%ADndices-compostos).

ACID: atomicidade, consistência, isolamento, durabilidade. `COMMIT` confirma; `ROLLBACK` desfaz a transação; `ROLLBACK TO` regressa ao savepoint. Um erro SQLite pode desfazer só a instrução. Confere linhas afetadas e trata o erro antes de confirmar. [Transações](https://resumos.rgo.pt/cadeiras/bd/indices-transacoes/#um-erro-n%C3%A3o-faz-sempre-rollback-de-tudo).

## Concorrência

| Anomalia | O que acontece |
| --- | --- |
| Suja | Lê alteração ainda não confirmada. |
| Não repetível | Relê a linha e observa outra versão confirmada. |
| Fantasma | Muda o conjunto que satisfaz um predicado. |
| Perdida | Uma escrita sobrepõe outra atualização. |
| Write skew | Escritas em linhas distintas quebram uma regra conjunta. |

Grafo: conflito é mesmo item e pelo menos uma escrita; aresta da operação anterior para a posterior. Sem ciclo, uma ordenação topológica dá a ordem serial equivalente; com ciclo, reprova. Snapshot estável não prova serializabilidade. PostgreSQL RR também evita fantasmas; serializable pode abortar e exige repetição. SQLite tem um escritor e pode rejeitar promoção de snapshot antigo. [Isolamento](https://resumos.rgo.pt/cadeiras/bd/concorrencia/#n%C3%ADveis-do-modelo-sql).

## Analítica e NoSQL

Define o grão antes das medidas. Factos ligam dimensões. Não somes saldos ao longo do tempo nem faças médias de percentagens sem pesos. Estrela tem dimensões diretas; floco normaliza dimensões; constelação partilha dimensões entre factos.

OLAP: roll-up agrega; drill-down detalha; slice fixa; dice restringe subconjuntos; pivot muda eixos. ROLLUP usa prefixos, CUBE todos os subconjuntos; não são comandos SQLite. [Armazéns](https://resumos.rgo.pt/cadeiras/bd/armazens-dados-nosql/#gr%C3%A3o-e-dimens%C3%B5es).

NoSQL inclui chave-valor, documentos, famílias de colunas e grafos. Esquema flexível não dispensa validação; NoSQL não exclui ACID. `distinct` devolve valores distintos; `countDocuments` conta documentos de um filtro. `$lookup` junta correspondências num array; `$facet` corre subpipelines independentes sobre a mesma entrada e devolve um documento com um array por saída. CAP trata consistência linearizável e disponibilidade **durante uma partição**, não a consistência de invariantes de ACID. Replicar copia; particionar distribui subconjuntos. [NoSQL](https://resumos.rgo.pt/cadeiras/bd/armazens-dados-nosql/#replica%C3%A7%C3%A3o-parti%C3%A7%C3%A3o-e-cap).
