# Cheat sheet

Definições, condições e padrões para rever o teste individual de bases de dados e aplicações web.

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

## Requisitos e modelos

| Conceito | Fixar |
| --- | --- |
| Ator | Papel ou sistema externo; não um componente interno. |
| História | Quem, o que pretende e para quê; critérios de sucesso, falha e autorização. |
| Qualidade | Medida, limite, carga, dados e ambiente definidos. |
| Multiplicidade | Quantos objetos da extremidade para um do lado oposto; ler os dois sentidos. |
| Especialização | Total/partial e disjoint/overlapping são dimensões independentes. |
| N:N | Tabela associativa. O par só é chave se houver no máximo uma ocorrência por par. |

[Requisitos](https://resumos.rgo.pt/cadeiras/lbaw/requisitos/), [UML](https://resumos.rgo.pt/cadeiras/lbaw/modelo-conceptual/) e [esquema](https://resumos.rgo.pt/cadeiras/lbaw/esquema-relacional/).

## Restrições e normalização

| Regra | Condição |
| --- | --- |
| PK | Única e não nula. Outras chaves candidatas continuam a ser regras do domínio. |
| FK | A referência existe; não garante que cada pai tenha filhos. |
| CHECK | PostgreSQL aceita verdadeiro ou desconhecido. NOT NULL é independente. |
| UNIQUE | PostgreSQL permite vários NULL por defeito. |
| CASCADE | Propaga do objeto referenciado para as linhas que o referem. |
| X⁺ | Começa em X; aplica dependências até estabilizar. |
| Superchave / candidata | Determina todos os atributos / além disso é mínima por inclusão. |
| Atributo primo | Pertence a alguma chave candidata. |
| 1FN | Cada atributo tem um valor do seu domínio, sem grupos repetidos na mesma célula. |
| 2FN | 1FN e sem dependência parcial de não primos numa parte própria de uma chave candidata. |
| 3FN | 1FN e, para X→A não trivial, X é superchave ou A é primo. |
| BCNF | 1FN e, para X→Y não trivial, X é superchave. |
| Sem perda, binária | A interseção determina uma das relações, sob as dependências funcionais. |
| Preservação | Regras projetadas permitem verificar as originais sem junção. É uma propriedade diferente. |

[Normalização](https://resumos.rgo.pt/cadeiras/lbaw/normalizacao/).

## SQL

*   Ordem lógica: FROM/JOIN, WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, LIMIT.
*   WHERE conserva verdadeiro; NULL em comparações dá desconhecido. Usa IS NULL.
*   COUNT(\*) conta linhas; COUNT(coluna) conta valores não nulos. SUM vazio dá NULL.
*   LEFT JOIN conserva o lado esquerdo. Filtro da direita no WHERE pode eliminar as linhas sem correspondência.
*   NOT IN pode dar desconhecido com NULL. NOT EXISTS testa ausência de linhas.
*   «Todos»: não existe um candidato sem correspondência. Sobre conjunto vazio, pode aceitar por vacuidade, por isso verifica a condição de existência quando a pergunta a exige.
*   UNION elimina repetidos; UNION ALL conserva. Janela OVER mantém linhas; GROUP BY reduz grupos.
*   Álgebra relacional clássica usa conjuntos; SQL conserva repetidos por defeito.

[Consultas](https://resumos.rgo.pt/cadeiras/lbaw/consultas-relacionais/).

## Índices e pesquisa

| Escolha | Condição |
| --- | --- |
| B-tree composto | Igualdades iniciais e intervalo seguinte limitam a região. Ordem das colunas importa. |
| Hash, PostgreSQL | Igualdade simples; não serve para intervalo ou ordem e não impõe UNIQUE. |
| Parcial | A consulta tem de permitir demonstrar o predicado do índice. |
| Por expressão | Adequado a consultas com a expressão correspondente. |
| PK / UNIQUE | Criam índice; FK no lado que referencia não cria índice automaticamente. |
| EXPLAIN | Estimativas; cost não são milissegundos. |
| EXPLAIN ANALYZE | Executa; observa tempos, rows e loops. Pode alterar dados. |
| Seq Scan | Pode ser mais barato mesmo com índice. |
| Texto | tsvector @@ tsquery; GIN pode apoiar correspondência; rank ordena. |
| Precisão / recall | Relevantes devolvidos / todos devolvidos; relevantes devolvidos / todos os relevantes. |
| Ranking | Correspondência depende da consulta; qualidade estática pode ser pré-calculada e atualizada. |

[Índices](https://resumos.rgo.pt/cadeiras/lbaw/sql-indices/).

## Transações

*   ACID: atomicidade, consistência, isolamento e durabilidade. Consistência exige invariantes e protocolo corretos.
*   COUNT num trigger não reserva capacidade. Duas transações podem observar o mesmo lugar livre.
*   Read Committed: snapshot por instrução. UPDATE condicionado da mesma linha coordena a reserva; verifica linhas afetadas.
*   Repeatable Read: snapshot estável em PostgreSQL, mas não garante ausência de toda a anomalia de serialização.
*   Serializable: pode abortar; repetir a transação completa com novo snapshot.
*   Deadlock: ciclo de espera; ordenar bloqueios reduz risco.
*   SAVEPOINT: ROLLBACK TO anula o que vem depois do ponto.
*   BEFORE por linha pode alterar NEW ou ignorar a linha devolvendo NULL. AFTER continua dentro da transação; não significa depois de COMMIT.
*   Trigger por instrução corre mesmo com zero linhas afetadas. OLD/NEW dependem da operação.
*   Pagamento externo não é anulado pelo ROLLBACK da base de dados.
*   PostgreSQL: função participa em expressões; procedure usa CALL. Controlo transacional interno tem condições; não generalizar para outro SGBD.

[Concorrência](https://resumos.rgo.pt/cadeiras/lbaw/triggers-transacoes/).

## HTTP, arquitetura e segurança

| Mecanismo | Fixar |
| --- | --- |
| GET/HEAD | Seguros e idempotentes. |
| PUT/DELETE | Idempotentes; respostas repetidas podem diferir. |
| POST/PATCH | Idempotência não garantida pelo método. |
| 401 / 403 | Autenticação necessária / operação recusada. |
| 303 / 304 | Redirecionar para GET / representação em cache válida. |
| no-cache / no-store | Guardar com validação / pedir que não se guarde. |
| Sessão | Identificador opaco no cliente; regenerar após autenticar. |
| HttpOnly | Impede leitura do cookie por JavaScript; não impede todas as ações de XSS. |
| Origem | Esquema, host e porta. CORS não é autenticação nem proteção completa CSRF. |
| MVC | Controlador coordena; modelo representa dados; vista produz representação; middleware e policies participam. |
| auth / policy / validate | Identidade / permissão sobre operação e objeto / domínio dos dados. |
| fillable | Atribuição em massa, não autorização. |
| N+1 / `@can` em ciclo | Uma consulta inicial e uma por objeto; antecipa relações ou avalia a decisão fora do ciclo. |
| PHP | Variável de função é local; global é explícito. fn captura variáveis exteriores por valor. |
| SQL injection | Parâmetros para valores; lista autorizada para identificadores. |
| XSS | Codificação por contexto ou sanitização de HTML permitido. |
| CSRF | Token verificado no servidor e defesas complementares. POST sozinho não chega; `Lax` não cobre escritas por `GET`. |
| Palavra-passe | Hash próprio com salt e custo; password\_verify, sem recuperar o original. |

[HTTP](https://resumos.rgo.pt/cadeiras/lbaw/http-estado/), [Laravel](https://resumos.rgo.pt/cadeiras/lbaw/aplicacao-laravel/) e [segurança](https://resumos.rgo.pt/cadeiras/lbaw/seguranca-web/).

## Informação, cliente e NoSQL

| Conceito de IA | Fixar |
| --- | --- |
| Organização | Agrupar, rotular, navegar e pesquisar. Sitemap descreve a estrutura; wireframe, a página. |
| Wireflow | Liga esboços pelos controlos que iniciam transições; protótipo permite experimentar. |
| Navegação | Global, local e contextual. Personalização usa um modelo; customização dá controlo explícito. |
| Teste com utilizadores | Observar tarefas reais; distinguir o que a pessoa diz do que consegue fazer. |

| Cliente web | Fixar |
| --- | --- |
| Teclado | Tab percorre focáveis, não todos os títulos. Rótulos, erros e foco têm de ser reconhecíveis. |
| Leitor de ecrã | Apresenta voz ou braille e navega pela estrutura semântica; nav e cabeçalhos transmitem papéis. |
| CSS | `li.destaque` é o próprio li com a classe; `li .destaque` é um descendente. Espaço, `>` e `+` são descendente, filho e irmão seguinte. |
| JavaScript | `var` tem âmbito de função, `let`/`const` de bloco. Modo estrito recusa atribuir a nomes não declarados; `const` não congela objetos. |
| fetch | Pode resolver com erro HTTP; verifica `ok`/estado. Respostas podem chegar fora de ordem. |
| AJAX | Atualiza partes da página sem recarga completa; HTML, JSON e XML são contratos possíveis. Escolhe `text()`/`json()` pelo corpo. |
| Medição | Mede o percurso completo. Latência e débito (throughput) diferem; média e percentis também. |

| Armazenamento NoSQL | Fixar |
| --- | --- |
| Documentos | Embebidos aproximam leituras; referências evitam certas duplicações. |
| Atomicidade | A de um documento não implica a de vários. Verifica sistema e versão. |
| CAP | Durante partição, há conflito entre as garantias de consistência forte e disponibilidade; não é «escolher duas» sem contexto. |
| Cópia histórica | Preço pago registado na compra permanece após mudança do preço atual; decide por campo se o valor acompanha mudanças ou preserva contexto. |

[Informação](https://resumos.rgo.pt/cadeiras/lbaw/interfaces-acessiveis/), [desempenho](https://resumos.rgo.pt/cadeiras/lbaw/cliente-desempenho/) e [NoSQL](https://resumos.rgo.pt/cadeiras/lbaw/nosql/).

## Notação A5, schema e sequências

*   A5: `UK` unicidade, `NN` obrigatório, `DF` omissão, `CK` verificação, `->` referência. Traduz cada marca para `UNIQUE`, `NOT NULL`, `DEFAULT`, `CHECK` e `REFERENCES`.
*   Schema: base de dados contém schemas; `search_path` escolhe o schema ativo. Cria `CREATE SCHEMA lbawXXg` e `SET search_path TO lbawXXg`.
*   Sequências: `IDENTITY` gera identificadores; `RETURNING id` lê o id da inserção; `currval` lê o último valor obtido pela ligação atual. Exige utilização prévia da sequência nessa ligação; números consumidos não são recuperados por ROLLBACK.
*   A6: cada transação declara e justifica o isolamento; população em script separado da criação.

## Referências, agregados e integração

*   **FK composta:** exige o par na mesma linha referida. Duas FKs independentes não garantem pertença entre componentes. NOT NULL é necessário em ambos se forem obrigatórios; MATCH SIMPLE dispensa correspondência quando algum é NULL. Confere o efeito de eliminar a linha referida.
*   **Duas relações 1:N:** a junção multiplica ocorrências antes de somar. Agrega cada relação por sessão antes de as juntar. SUM DISTINCT elimina preços iguais de compras legítimas; não é uma correção geral.
*   **Cancelamento:** liga libertação de capacidade ao RETURNING da transição reservada para cancelada do comprador autenticado. Repetição não produz transição; uma falha do contador anula a instrução inteira.
*   **Trigger em lote:** ROW dispara por linha processada, mesmo se o valor ficar igual; STATEMENT dispara também com zero linhas. O teste de mudança real pode impedir a ação sem impedir a ativação.
*   **Protótipo vertical:** demonstra uma história através de interface, HTTP, autorização, regra e persistência. Verifica recarregamento, repetição e pedido direto de outra pessoa. Não confundir sucesso visual com escrita confirmada.

[Referência a um par](https://resumos.rgo.pt/cadeiras/lbaw/esquema-relacional/#uma-refer%C3%AAncia-a-um-par), [agregação sem multiplicação](https://resumos.rgo.pt/cadeiras/lbaw/consultas-relacionais/#duas-rela%C3%A7%C3%B5es-podem-multiplicar-a-mesma-venda), [cancelamento](https://resumos.rgo.pt/cadeiras/lbaw/triggers-transacoes/#cancelar-sem-libertar-duas-vezes) e [protótipo vertical](https://resumos.rgo.pt/cadeiras/lbaw/aplicacao-laravel/#validar-uma-funcionalidade-num-prot%C3%B3tipo-vertical).
