O modelo relacional

Aprenda como os bancos de dados relacionais organizam dados antes de escrever sua primeira consulta. Veja por que as organizações mantêm dados compartilhados em um banco de dados em vez de uma planilha, o que faz um sistema de gerenciamento de banco de dados e qual é o papel da SQL. Leia tabelas, linhas e colunas, escolha tipos de dados adequados e trate valores ausentes (NULL) sem cair nas armadilhas mais comuns. Use chaves primárias e estrangeiras para identificar linhas e conectar tabelas, reconheça relacionamentos um para muitos e muitos para muitos e leia um esquema de banco de dados e seu diagrama para descobrir onde cada informação está armazenada.

BásicoAula 1 de 6 do curso Curso de Noções básicas de SQL

O que você vai aprender

  1. Descrever por que as organizações mantêm dados compartilhados em bancos de dados relacionais, o que faz um sistema de gerenciamento de banco de dados e como a SQL é usada para trabalhar com ele.
    • Explicar por que as organizações usam bancos de dados
      Distinguir dados, banco de dados e sistema de gerenciamento de banco de dados e explicar o que um banco de dados relacional faz melhor que uma planilha compartilhada ou arquivos avulsos.
    • Reconhecer sistemas de banco de dados e o papel da SQL
      Nomear sistemas de banco de dados relacionais comuns, descrever como os aplicativos se conectam a eles e explicar o que é SQL e como suas instruções são agrupadas.
  2. Usar o vocabulário de tabelas, linhas e colunas para ler dados corretamente e explicar as regras que tornam uma tabela relacional.
    • Descrever as partes de uma tabela
      Identificar tabelas, linhas, colunas e valores em dados de exemplo e relacionar os termos cotidianos a seus nomes relacionais formais.
    • Explicar as regras que tornam uma tabela relacional
      Aplicar as regras do modelo relacional sobre linhas, colunas e valores e reconhecer onde tabelas SQL e planilhas se comportam de forma diferente.
  3. Associar cada coluna a um tipo de dados adequado, evitar erros comuns de tipo com valores monetários, códigos e datas e trabalhar corretamente com NULL.
    • Reconhecer os principais tipos de dados da SQL
      Identificar os tipos numéricos, de texto, de data e booleanos comuns, ler suas configurações de tamanho e precisão e saber onde os sistemas de banco de dados diferem.
    • Escolher um tipo de dados para dados do mundo real
      Escolher tipos adequados para valores monetários, quantidades, códigos, datas e nomes, perguntando como os valores serão usados, e evitar erros causados por tipos inadequados.
    • Trabalhar corretamente com NULL
      Explicar o significado de NULL, distingui-lo de zero e texto vazio e prever como NULL se comporta em comparações, cálculos e restrições.
  4. Usar chaves primárias para identificar cada linha, chaves estrangeiras para vincular tabelas e reconhecer os relacionamentos um para muitos, um para um e muitos para muitos que elas criam.
    • Identificar chaves candidatas e a chave primária
      Determinar quais colunas ou combinações de colunas identificam cada linha de forma única e explicar as regras que uma chave primária deve seguir.
    • Escolher entre chaves naturais e substitutas
      Comparar identificadores do mundo real com os gerados pelo sistema, avaliar quais são boas chaves primárias e proteger identificadores naturais com restrições de unicidade.
    • Relacionar tabelas com chaves estrangeiras
      Explicar como uma chave estrangeira faz referência a uma linha de outra tabela, o que a integridade referencial protege e o que acontece quando linhas referenciadas são alteradas ou excluídas.
    • Reconhecer relacionamentos um para muitos, um para um e muitos para muitos
      Determinar quantas linhas de cada lado de um vínculo podem estar relacionadas e mostrar como chaves estrangeiras e tabelas associativas representam cada tipo de relacionamento.
  5. Ler um esquema escrito como definições de tabelas ou desenhado como diagrama e usá-lo com dados de exemplo para descobrir onde as informações são armazenadas e como as tabelas se conectam.
    • Ler um esquema e as definições de suas tabelas
      Distinguir um esquema dos dados que ele descreve, ler a notação de esquema e instruções CREATE TABLE e interpretar as restrições que elas declaram.
    • Ler um diagrama do esquema
      Interpretar as caixas, os marcadores de chave, as linhas de conexão e os símbolos da notação pé de galinha de um diagrama do esquema e expressar em palavras cada relacionamento que ele mostra.
    • Responder a perguntas usando um esquema e dados de exemplo
      Localizar onde cada informação é armazenada, seguir chaves entre tabelas manualmente e usar as restrições do esquema para determinar quais dados são permitidos.

Guia de estudo de Modelo relacional

5 capítulos

1

O que um banco de dados faz

Uma loja pode começar com uma planilha, mas os dados compartilhados logo levantam perguntas mais difíceis: quais dados dos clientes estão atualizados, quem pode alterá-los e o que acontece quando um pagamento é interrompido pela metade? Um sistema de banco de dados oferece um lugar comum para tratar essas questões. Separe os fatos armazenados do software que os gerencia e veja como os aplicativos usam SQL para solicitar dados e fazer alterações. As mesmas ideias dão suporte a um pequeno aplicativo de celular e ao sistema de relatórios de uma grande empresa.

1.1 Informações compartilhadas e alterações confiáveis

Um nome de cliente, uma data de pedido e um preço são dados: fatos registrados. Um banco de dados é uma coleção organizada de dados relacionados. Um sistema de gerenciamento de banco de dados, ou SGBD, é o software que armazena e gerencia essa coleção. PostgreSQL é um SGBD; o banco de dados store de uma loja é uma das coleções que ele gerencia.

Armazene cada informação em seu lugar

Suponha que uma planilha repita o telefone de Maria Garcia em todas as suas 14 vendas. Uma mudança de telefone exige 14 edições. Uma célula esquecida deixa registros conflitantes. Em um banco de dados relacional, customers contém os dados de Maria uma única vez, sob customer_id 1. Cada venda registra esse identificador. Atualizar seu telefone em uma linha de cliente fornece um único número atual para buscas posteriores.

Um banco de dados relacional organiza informações em tabelas. “Relacional” vem de relação, o nome matemático de uma tabela. E. F. Codd apresentou o modelo em 1970. Sua separação central é útil: os usuários descrevem os dados que desejam por meio de tabelas e valores; o SGBD cuida de como encontrar esses dados em disco.

Regras e acesso compartilhado

Uma tabela tem colunas nomeadas, tipos de dados e restrições. Uma restrição é uma regra que o SGBD verifica, como “um pedido deve fazer referência a um cliente existente”. Essas verificações protegem dados compartilhados quando vários aplicativos usam o mesmo banco de dados. A imposição de tipos varia: PostgreSQL rejeita texto como 'twelve' em uma coluna de preço numérica, enquanto tabelas comuns do SQLite têm tipos flexíveis.

Um SGBD também gerencia usuários simultâneos, permissões, cópias de segurança e recuperação. Dois funcionários podem trabalhar com dados compartilhados sem trocar cópias separadas de uma planilha. As permissões podem permitir que um usuário de relatórios leia as vendas e, ao mesmo tempo, limitar quem pode alterá-las. Um processo de cópia de segurança e recuperação ajuda a restaurar os dados após uma falha.

Mantenha um conjunto de alterações unido

Uma transação trata várias alterações como uma unidade: todas são salvas ou nenhuma é. Transferir R$ 200 entre contas exige subtrair o valor da conta-corrente e adicioná-lo à poupança. Se uma falha interromper a transferência antes de sua conclusão, o SGBD poderá desfazer a transação inacabada. Salvar apenas a subtração deixaria um saldo incorreto.

Uma planilha continua útil para pequenos cálculos e layouts flexíveis. Um banco de dados oferece uma estrutura definida para registros compartilhados e regras. Uma planilha do Excel tem um limite fixo de 1.048.576 linhas; bancos de dados costumam gerenciar coleções muito maiores, sujeitas aos limites de armazenamento, hardware e produto.

Dados e tarefas diferentes

Dados estruturados se encaixam em colunas nomeadas compartilhadas por todas as linhas. Dados semiestruturados, como documentos JSON, podem ter campos diferentes em registros diferentes. Dados não estruturados, como áudio ou e-mails de texto livre, não têm essa estrutura tabular fixa. As organizações frequentemente combinam bancos de dados relacionais com armazenamentos de documentos, armazenamentos de chave-valor ou armazenamento de arquivos.

A carga de trabalho também importa. Um sistema transacional, também chamado de OLTP, registra eventos cotidianos por meio de muitas pequenas leituras e gravações: um pedido, um pagamento, uma mudança de endereço. Um sistema analítico, ou OLAP, lê muitos registros armazenados para responder a perguntas como “Como as vendas mensais variaram por região?”. Ambos podem usar tabelas e chaves relacionais.

Principais conclusões

  • Um banco de dados contém dados relacionados; um SGBD os gerencia.
  • Dados relacionais são organizados em tabelas, com regras verificadas pelo SGBD.
  • Uma transação salva ou desfaz um conjunto de alterações em conjunto.
  • Dados compartilhados de clientes podem ser atualizados em um só lugar e encontrados por meio de um identificador.
  • O trabalho transacional registra eventos; o trabalho analítico resume dados armazenados.

1.2 SQL, produtos de banco de dados e aplicativos

SQL, sigla de Structured Query Language, é uma linguagem. PostgreSQL, MySQL, SQLite, Microsoft SQL Server e Oracle Database são produtos que a usam. SQL Server é um SGBD, não outro nome para a própria SQL.

Como um aplicativo acessa os dados

Em um sistema cliente-servidor, um programa servidor gerencia o banco de dados. Um cliente, como um site, uma ferramenta de relatórios ou um editor de consultas, envia solicitações a esse servidor. PostgreSQL, MySQL, SQL Server e Oracle geralmente funcionam dessa forma. Ferramentas como psql, pgAdmin, DBeaver e SQL Server Management Studio permitem que as pessoas inspecionem bancos de dados e enviem solicitações.

Um mecanismo embarcado é executado dentro de um aplicativo. O SQLite usa uma biblioteca e um arquivo de banco de dados comum, como store.db, sem um servidor de banco de dados separado. Ele é comum em celulares, navegadores e aplicativos de desktop. Um serviço gerenciado em nuvem, como Azure SQL Database, Amazon RDS ou Google Cloud SQL, permite que um provedor administre os servidores de banco de dados. “Gerenciado” descreve quem opera o serviço; isso não substitui tabelas e chaves por um modelo diferente.

Uma instalação de SGBD pode gerenciar vários bancos de dados, como store e payroll. Uma conexão seleciona o banco de dados a ser usado, sujeito a permissões.

Diga qual resultado você deseja

SQL é declarativa: ela descreve o resultado necessário enquanto o SGBD escolhe como obtê-lo. Leia esta instrução:

SELECT first_name, city
FROM customers
WHERE state = 'TX';

Ela solicita os primeiros nomes e as cidades das linhas de clientes cujo estado é TX. Ela não diz qual página do disco deve ser lida primeiro. Palavras-chave em maiúsculas facilitam a leitura da instrução; select e SELECT significam a mesma coisa. Um ponto e vírgula normalmente encerra uma instrução.

Reconheça a função da instrução
GrupoFinalidadeExemplos
Definição de dados, DDLDefinir ou alterar a estruturaCREATE TABLE, ALTER TABLE, DROP TABLE
Manipulação de dados, DMLLer ou alterar linhasSELECT, INSERT, UPDATE, DELETE
Controle de dados, DCLGerenciar permissõesGRANT, REVOKE
Controle de transaçõesSalvar ou desfazer uma transaçãoCOMMIT, ROLLBACK

Alguns livros colocam SELECT em um grupo separado de linguagem de consulta de dados. A distinção útil é a função efetiva da instrução: adicionar uma coluna altera a estrutura; adicionar um cliente altera os dados.

SQL se tornou um padrão ANSI em 1986 e é padronizada internacionalmente como ISO/IEC 9075. Os produtos acrescentam seus próprios dialetos. Um limite de dez linhas aparece como LIMIT 10 no SQLite, PostgreSQL e MySQL, TOP 10 no SQL Server ou FETCH FIRST 10 ROWS ONLY na SQL padrão e no Oracle.

Leia textos e outros objetos de banco de dados

Literais de texto usam aspas simples: 'TX'. A SQL padrão usa aspas duplas para identificadores, como nomes de colunas. Um apóstrofo dentro de um texto é duplicado: 'O''Brien' representa O'Brien.

Uma visão é uma consulta salva usada como uma tabela; uma visão comum não tem linhas armazenadas próprias. Um índice é uma estrutura de busca que pode ajudar a encontrar linhas rapidamente. A maioria dos sistemas indexa chaves primárias automaticamente. Procedimentos armazenados e funções são códigos salvos que podem ser executados pelo nome.

Principais conclusões

  • SQL descreve um resultado desejado; o SGBD escolhe como obtê-lo.
  • Sistemas cliente-servidor aceitam solicitações por meio de um servidor; o SQLite é embarcado em um aplicativo.
  • DDL altera a estrutura, enquanto DML lê ou altera linhas.
  • Aspas simples marcam texto; um apóstrofo dentro do texto é duplicado.
  • Uma visão salva uma consulta; um índice permite buscas mais rápidas.
  • Os dialetos SQL compartilham as ideias relacionais, mas diferem em parte da sintaxe.
2

Ler uma tabela corretamente

Uma tabela dá uma estrutura clara a cada tipo de registro: linhas descrevem elementos individuais, e colunas descrevem suas propriedades. Leia a estrutura antes de interpretar um valor. Depois, distinga as regras lógicas da tabela da organização de uma planilha: a posição não identifica um registro, uma lista de telefones contém mais de um valor e uma linha de total tem significado diferente de uma venda. Essas distinções facilitam muito o trabalho posterior com chaves e esquemas.

2.1 Linhas, colunas e valores

Uma tabela armazena informações sobre um tipo de elemento. Cada linha em customers descreve um cliente; cada coluna contém uma propriedade. Sua interseção contém um valor.

Leia um registro de ponta a ponta

Veja algumas colunas de clientes:

customer_idfirst_namelast_namecitystatezip_code
1MariaGarciaAustinTX78701
2JamesWilsonDenverCO80202
3AishaJohnsonBostonMA02108
4WeiChenSeattleWA98101

Encontre customer_id 4 e leia city: a cidade de Wei é Seattle. Para descobrir quem mora em Denver, leia o nome na linha de Denver: James Wilson. Uma linha vizinha descreve outro cliente.

A tabela completa tem oito colunas: customer_id, first_name, last_name, email, phone, city, state e zip_code. O telefone de James é NULL: o valor está ausente, mas sua linha ainda tem a coluna de telefone.

Relacione os termos
Termo cotidianoTermo relacional formalOutro termo comum
TabelaRelação-
LinhaTuplaRegistro
ColunaAtributoCampo

Uma tupla é uma linha inteira, não uma célula. Um atributo nomeia uma propriedade compartilhada por todas as linhas. “Registro 4” pode significar um identificador ou uma posição na exibição; verifique qual deles, pois as posições podem mudar.

Conte a estrutura

O grau conta as colunas; a cardinalidade da tabela conta as linhas. A tabela completa tem grau 8 e cardinalidade 4. A exibição acima mostra seis colunas sem alterar o grau da tabela.

Adicionar um cliente aumenta a cardinalidade para 5; o grau permanece 8. Adicionar birth_date aumenta o grau para 9 e dá a cada linha um lugar para esse valor, mesmo quando ele está ausente. Um novo cliente acrescenta uma linha, não uma coluna.

A cardinalidade do relacionamento, como um para muitos, descreve os vínculos permitidos, não a quantidade de linhas de uma tabela.

Leia nomes qualificados

Os nomes das colunas são únicos dentro de uma tabela. orders.customer_id e customers.customer_id distinguem colunas com o mesmo nome em tabelas diferentes: o ponto separa os nomes da tabela e da coluna.

snake_case usa palavras minúsculas separadas por sublinhados, como em zip_code. Nomes com espaços precisam estar entre aspas em SQL. Nomes de tabelas no singular ou no plural podem funcionar; use uma convenção consistente.

Principais conclusões

  • Uma linha descreve um elemento; uma coluna descreve uma propriedade.
  • Relação, tupla e atributo significam tabela, linha e coluna.
  • O grau conta as colunas; a cardinalidade da tabela conta as linhas.
  • Um nome qualificado pela tabela identifica a qual tabela uma coluna pertence.

2.2 As regras por trás da grade

Uma tabela relacional tem uma estrutura lógica além de sua aparência retangular. No modelo formal, ela é um conjunto de linhas. Conjuntos não contêm elementos duplicados e não têm ordem. As colunas são identificadas pelo nome, então mover uma coluna na exibição não altera a informação que ela representa.

A identidade não vem da posição

Um SGBD pode retornar linhas em uma ordem diferente após atualizações, exclusões ou uma mudança na forma como lê o armazenamento. “A terceira linha” não é uma forma duradoura de identificar um cliente. customer_id 3 continua identificando Aisha mesmo quando sua linha aparece em primeiro lugar. Uma consulta que precisa de uma ordem específica a solicita com ORDER BY.

Tabelas SQL diferem de relações formais: sem uma chave primária ou outra restrição de unicidade adequada, elas podem conter linhas idênticas. Duas cópias de ('Coffee mug', 12.50) não oferecem um valor que as diferencie nessas colunas. Uma chave primária dá a cada linha um identificador único e impede linhas completamente duplicadas.

Uma coluna, um domínio

Um domínio é o conjunto de valores permitidos em uma coluna. Uma quantidade tem um tipo inteiro e também pode precisar de uma regra que exija que ela seja positiva. Um código de estado é texto, mas nem todo valor de texto é um código de estado válido. Tipos de dados e restrições descrevem os valores permitidos para o SGBD.

Todas as linhas compartilham as mesmas colunas. Um pedido não pode receber uma coluna extra de mensagem para presente apenas para ele. A tabela pode ter uma coluna gift_note para todos os pedidos, com NULL onde nenhuma mensagem foi registrada. Informações opcionais ainda têm um lugar definido.

Mantenha valores individuais separados

Um valor atômico é um valor para a finalidade da coluna. Uma célula de telefone que contém “512-555-0147, 512-555-0199” contém uma lista de dois números. Encontrar, verificar ou remover apenas um número se torna difícil. Uma tabela customer_phones pode dar a cada telefone sua própria linha, com customer_id indicando de quem é o número.

Atômico não significa que todo valor de texto deva ser dividido em suas menores partes. Um nome de cidade pode conter várias palavras e continuar sendo um único valor de cidade. A questão é se a célula armazena uma informação do tipo que a coluna representa ou uma coleção que deve ser tratada separadamente.

Leia uma exportação de planilha com atenção

Uma planilha de vendas pode incluir um cabeçalho repetido no meio, uma linha inferior identificada como “TOTAL” e um preço escrito como “12,50 (promoção)”. Essas escolhas de organização são úteis para uma pessoa, mas misturam tipos diferentes de conteúdo nas mesmas colunas.

Para lê-la como uma tabela relacional:

  1. Trate os nomes das colunas como cabeçalho, não como registros de venda.
  2. Mantenha cada linha de dados referente a uma venda; calcule o total a partir dessas linhas.
  3. Armazene o preço numérico separadamente de uma observação sobre a promoção.
  4. Dê a cada venda uma chave para que sua linha possa ser identificada.

Uma linha de total misturada com vendas poderia ser contada como outra venda ou somada novamente ao total. Uma observação misturada a um preço numérico impede operações numéricas comuns.

Tabelas lógicas e armazenamento físico

Uma tabela é a visão lógica do usuário. O SGBD pode armazenar seus dados em arquivos, páginas e índices organizados para acesso eficiente. Independência de dados significa que alterações nessa organização física não precisam alterar os nomes das tabelas, os significados das colunas ou as solicitações usadas pelos aplicativos.

Principais conclusões

  • Uma relação formal tem linhas distintas e sem ordem; SQL precisa de restrições para impedir duplicatas.
  • A ordem das linhas deve ser solicitada com ORDER BY.
  • O domínio de uma coluna descreve seus valores permitidos.
  • Cada célula contém um valor para a finalidade de sua coluna.
  • Todas as linhas têm as mesmas colunas, incluindo espaços para valores ausentes.
3

Escolher tipos e interpretar dados ausentes

O tipo de uma coluna afeta o que pode ser armazenado, como os valores são ordenados e quais cálculos fazem sentido. Dígitos podem representar uma contagem ou um código; esses usos exigem tipos diferentes. Valores monetários precisam de armazenamento exato, enquanto medidas muitas vezes podem usar valores aproximados. Informações ausentes precisam de tratamento próprio como NULL. Aprenda essas escolhas junto com as diferenças importantes entre produtos, especialmente o armazenamento flexível do SQLite e o tratamento de comparações desconhecidas pela SQL.

3.1 Os principais tipos de dados da SQL

Um tipo de dados informa ao SGBD que tipo de valor uma coluna contém e como trabalhar com ele. Adição numérica, comparação de texto e ordenação de datas são operações diferentes. Um nome de tipo familiar também pode se comportar de maneira diferente em produtos de banco de dados distintos.

Números: inteiros, exatos e aproximados
TipoTipos comunsUso adequado
Números inteirosINTEGER, SMALLINT, BIGINTContagens, quantidades e identificadores inteiros
Decimais exatosDECIMAL(p, s), NUMERIC(p, s)Valores monetários e outros valores decimais exatos
Números aproximadosREAL, FLOAT, DOUBLE PRECISIONMedidas com diferenças de arredondamento aceitáveis

No PostgreSQL, MySQL e SQL Server, INTEGER varia de −2147483648 a 2147483647. BIGINT alcança 9.223.372.036.854.775.807; o armazenamento de inteiros do SQLite também pode alcançar esse intervalo.

Para decimais, precisão é o número total de dígitos e escala é o número de dígitos após a vírgula decimal. DECIMAL(8, 2) deixa seis dígitos antes da vírgula: seu máximo é 999999,99. O preço 12,50 cabe; 1234567,00 não cabe. PostgreSQL, MySQL, SQL Server e Oracle oferecem armazenamento decimal exato. O SQLite aceita essa declaração, mas não impõe sua precisão nem escala e pode armazenar frações como números binários de ponto flutuante.

O ponto flutuante aproxima muitas frações decimais. Em precisão dupla, somar 0,1 e 0,2 resulta em 0,30000000000000004. O SQLite trata esses literais decimais como ponto flutuante. O PostgreSQL trata literais decimais sem tipo explícito como numéricos exatos, então o mesmo cálculo escrito ali pode ser exato; valores explicitamente definidos em precisão dupla mostram a aproximação.

Texto, datas e indicadores

CHAR(n) é texto de comprimento fixo; PostgreSQL e SQL Server completam valores menores com espaços. VARCHAR(n) permite comprimentos variáveis até um limite. O SQLite ignora ambas as configurações de comprimento e não completa com espaços. TEXT armazena textos longos no SQLite, PostgreSQL e MySQL. O SQL Server usa VARCHAR(MAX) ou NVARCHAR(MAX) para essa finalidade; seu tipo TEXT mais antigo está obsoleto.

Um DATE armazena uma data do calendário, um TIME uma hora do dia e o TIMESTAMP da SQL padrão uma data e uma hora. Escreva datas na forma ano-mês-dia, como '2026-03-02', para evitar confundir 2 de março com 3 de fevereiro. Datas tipadas têm um formato interno de armazenamento; o aplicativo escolhe seu formato de exibição. O SQLite não tem um tipo de data dedicado e geralmente armazena datas como texto ISO. O SQL Server usa DATETIME2 para data e hora: seu TIMESTAMP significa ROWVERSION, um contador binário de versões.

Um BOOLEAN representa TRUE ou FALSE, ou NULL quando o valor está ausente. PostgreSQL tem um tipo booleano; SQL Server usa BIT, MySQL trata BOOLEAN como um inteiro pequeno e SQLite armazena os indicadores como 1 e 0. Tipos binários como BLOB ou BYTEA do PostgreSQL armazenam bytes, incluindo pequenas imagens. Arquivos maiores costumam ser armazenados separadamente, com um caminho ou URL em uma tabela.

Afinidade de tipo do SQLite

Em tabelas comuns do SQLite, um tipo declarado é uma preferência chamada afinidade de tipo. Uma coluna INTEGER converte '42' no número 42, mas pode manter 'abc' como texto. Uma tabela STRICT do SQLite rejeita texto que não pode se tornar um inteiro válido.

Principais conclusões

  • Inteiros armazenam números inteiros; decimais exatos e ponto flutuante atendem a necessidades diferentes.
  • A precisão conta todos os dígitos; a escala conta os dígitos fracionários.
  • Texto de data ISO usa a ordem ano-mês-dia.
  • Comprimentos de texto, armazenamento booleano e tipos de data variam entre dialetos.
  • A afinidade do SQLite é flexível; tabelas STRICT impõem seus tipos suportados.
  • O TIMESTAMP do SQL Server é uma versão de linha, não uma data e hora.

3.2 Escolha um tipo conforme a função do valor

Comece pelo significado de um valor e por como ele será usado. Um CEP americano contém dígitos, mas ninguém soma CEPs americanos para obter um total significativo. Uma quantidade também contém dígitos, e somar quantidades é útil. A aparência, por si só, é uma orientação ruim para escolher o tipo.

Faça cinco perguntas
  1. Quais são os valores típicos e quais extremos precisam caber?
  2. Os valores serão usados em cálculos?
  3. Eles precisam ser exatos ou uma aproximação é aceitável?
  4. Como devem ser ordenados e comparados?
  5. Que tamanho comporta valores futuros realistas?
Valores monetários e medidas

Valores monetários precisam ser exatos. No PostgreSQL, MySQL e SQL Server, um preço pode usar DECIMAL(8, 2). Três itens a R$ 12,50 custam exatamente R$ 37,50. O armazenamento binário de ponto flutuante pode deixar pequenos erros após somas repetidas, tornando comparações exatas pouco confiáveis. No SQLite, declarar DECIMAL não oferece armazenamento decimal exato; use centavos inteiros para valores exatos, de modo que R$ 12,50 seja armazenado como 1250.

Uma medida como peso pode usar REAL quando pequenas diferenças de arredondamento são aceitáveis. Escolha a unidade como parte do significado da coluna: weight_lb torna a unidade libra visível em seu nome. Um tipo numérico sozinho não registra essa unidade.

A moeda também precisa ser identificada. Se uma tabela mistura moedas, acrescente currency_code, como USD, EUR ou JPY. As casas decimais variam conforme a moeda, e moedas diferentes devem ser convertidas antes que seus valores possam ser somados.

Códigos e nomes são texto

Use texto para CEPs americanos, telefones, números de conta e códigos de estoque. O CEP americano de Boston '02108' perde o zero inicial quando convertido em inteiro. VARCHAR(10) também pode armazenar ZIP+4, como '02108-1234'. Telefones podem conter um sinal de mais, espaços e hífens. Esses caracteres fazem parte da representação de um identificador, não são sinais aritméticos.

Reserve espaço para nomes e endereços reais. “Christopher Montgomery” tem 22 caracteres, então VARCHAR(10) é curto demais. PostgreSQL e SQL Server rejeitam o valor; MySQL o rejeita no modo estrito e pode truncá-lo nos demais casos. O SQLite o armazena porque ignora os comprimentos de texto declarados. Um campo de comprimento variável generoso evita rejeitar nomes comuns sem reservar seu comprimento máximo para cada linha.

A ordenação revela uma escolha errada

A ordenação de texto compara caracteres. Números armazenados como texto podem aparecer na ordem '1', '10', '2', '25', '3'. Uma coluna numérica ordena esses valores numericamente. Escolher texto para todos os campos transfere o trabalho de verificação e conversão para os cálculos posteriores.

Datas apresentam uma armadilha semelhante. Datas em texto no formato dos EUA colocam '12/01/2025' depois de '03/02/2026' na ordem de texto, embora dezembro de 2025 seja anterior. Use um tipo de data ou texto ISO formatado de maneira consistente no SQLite para preservar a ordem do calendário.

Leia os tipos de um produto em conjunto

Um produto pode usar product_id INTEGER, sku VARCHAR(20), name VARCHAR(100), price DECIMAL(8, 2), weight_lb REAL, in_stock BOOLEAN e added_on DATE. Cada tipo atende a uma função: identificação, armazenamento de código, nome, valor monetário exato, medida, indicador ou data. No SQLite, armazene o preço como centavos inteiros e a data como texto ISO.

Principais conclusões

  • Escolha tipos conforme o significado, os cálculos, a exatidão, a ordenação e um tamanho realista.
  • Armazene códigos como texto para preservar zeros iniciais e pontuação.
  • Use decimal exato para valores monetários onde houver suporte e centavos inteiros no SQLite.
  • Um valor numérico precisa de uma moeda, e uma medida precisa de uma unidade.
  • O armazenamento como texto resulta em ordenação de texto, mesmo quando todos os caracteres são dígitos.

3.3 NULL e resultados desconhecidos

NULL marca um valor ausente. Ele é diferente de zero, do texto vazio '' e do texto 'NULL'. Um desconto conhecido de 0 significa que não há desconto; um desconto NULL significa que o valor não foi registrado. Uma coluna que permite NULL aceita dados ausentes, enquanto NOT NULL exige um valor.

Ausência tem mais de um significado

James Wilson não tem telefone registrado. O pedido 102 não tem data de envio porque ainda não foi enviado. Uma empresa cadastrada como cliente pode não ter um sobrenome aplicável. Todos podem ser representados por NULL, mas NULL não registra qual motivo se aplica. Um dicionário de dados deve informar o significado em cada coluna.

Texto vazio é um valor de texto presente no PostgreSQL e no SQLite. Atualmente, o Oracle trata texto vazio como NULL. Ferramentas de consulta podem exibir ambos como uma célula aparentemente vazia, então a aparência sozinha não permite distingui-los.

Comparações podem ser desconhecidas

Comparações SQL têm três resultados possíveis: TRUE, FALSE e UNKNOWN. Uma comparação que envolve NULL, incluindo NULL = NULL, resulta em UNKNOWN. Não se sabe se duas informações ausentes têm o mesmo valor.

Uma cláusula WHERE mantém apenas resultados TRUE. Leia estas condições:

  • phone IS NULL encontra telefones ausentes.
  • phone IS NOT NULL encontra telefones registrados.
  • phone = NULL resulta em UNKNOWN e não encontra nenhuma linha.

Negar uma comparação não recupera um valor ausente. Acrescente Daniel Brown, cujo estado é NULL, aos quatro clientes da loja. A condição state <> 'TX' mantém CO, MA e WA: três linhas. Daniel é excluído porque a comparação de seu estado é UNKNOWN. Para incluir também estados ausentes, a condição é state <> 'TX' OR state IS NULL.

Combine condições com cuidado

Pense em UNKNOWN como “pode ser TRUE ou FALSE”. Um resultado só é determinado se ambas as possibilidades produzirem o mesmo resultado.

ExpressãoResultadoMotivo
TRUE AND UNKNOWNUNKNOWNA segunda parte decide se ambas são verdadeiras.
FALSE AND UNKNOWNFALSEUma parte falsa já torna AND falso.
TRUE OR UNKNOWNTRUEUma parte verdadeira já satisfaz OR.
FALSE OR UNKNOWNUNKNOWNA segunda parte decide OR.
NOT UNKNOWNUNKNOWNA negação não pode fornecer a informação ausente.
Cálculos e resumos

A aritmética comum com NULL resulta em NULL: 5 + NULL é NULL. O preço de um item multiplicado por uma quantidade ausente também é ausente, não zero. Concatenar texto com || e NULL resulta em NULL no PostgreSQL e no SQLite; a concatenação do Oracle trata NULL como texto vazio.

Funções de resumo geralmente ignoram entradas NULL. Com cinco clientes, incluindo James e Daniel sem telefone, COUNT(*) conta as cinco linhas. COUNT(phone) conta os três telefones registrados. A média de 4, NULL e 2 é 3, porque os dois números conhecidos são divididos por dois; tratar NULL como zero resultaria incorretamente em 2.

Use NOT NULL para informações que devem estar presentes, como uma data de pedido. Isso não exige um número positivo nem texto não vazio: essas são regras separadas. Chaves primárias exigem identificadores diferentes de NULL; tabelas comuns do SQLite têm uma exceção histórica para algumas declarações de chave primária, então NOT NULL explícito é importante nesse caso.

Principais conclusões

  • NULL marca uma informação ausente; 0 e texto vazio têm significados diferentes.
  • Teste valores ausentes com IS NULL ou IS NOT NULL.
  • Comparações que envolvem NULL produzem UNKNOWN; WHERE mantém apenas TRUE.
  • AND, OR e NOT devem levar UNKNOWN em conta.
  • A aritmética comum com NULL produz NULL.
  • COUNT(*) conta linhas; COUNT(column) conta entradas diferentes de NULL.
  • Documente por que NULL é permitido em cada coluna.
4

Identificar e conectar registros

As chaves respondem a duas perguntas diferentes: “Que linha é esta?” e “A qual linha relacionada ela faz referência?”. Uma chave primária fornece a uma tabela um identificador principal, enquanto uma chave estrangeira contém uma referência. Teste possíveis identificadores com dados futuros, não apenas com uma pequena amostra. Depois, leia os vínculos nas duas direções, incluindo se um vínculo é opcional. Chaves compostas e tabelas associativas estendem as mesmas ideias a registros identificados por combinações e a relacionamentos muitos para muitos.

4.1 Chaves candidatas e chaves primárias

Uma chave identifica uma linha por meio de seus valores. Nomes podem se repetir; identificadores de clientes distinguem registros para que possam ser lidos, alterados ou vinculados.

Teste a unicidade e a minimalidade

Uma superchave é uma coluna ou combinação que identifica uma linha de forma única. Uma chave candidata é uma superchave mínima: remover qualquer coluna faz essa garantia desaparecer. Escolha uma candidata como chave primária; as demais são chaves alternativas.

Suponha que employee_id, ssn e email sejam cada um obrigatório e único. Cada um é uma chave candidata. (employee_id, department) é uma superchave, mas não uma candidata: employee_id sozinho identifica o funcionário. Um sobrenome repetido não passa no teste de unicidade.

TermoTeste
SuperchaveA combinação identifica uma linha?
Chave candidataEla é única, sem colunas desnecessárias?
Chave primáriaQual candidata é o identificador principal?
Chave alternativaQual outra candidata permanece disponível?

Quatro clientes com sobrenomes diferentes não estabelecem uma chave: um quinto pode compartilhar um sobrenome. A unicidade deve valer para todos os dados futuros permitidos. Uma repetição refuta uma chave proposta; uma amostra sem repetições ainda precisa de uma regra de negócio que a sustente.

Leia a declaração

Uma tabela tem no máximo uma chave primária. Seus valores são únicos e suas colunas não podem conter NULL. Valores estáveis evitam alterações repetidas nas referências. Procure PRIMARY KEY: nem o nome nem a posição de uma coluna a declara como chave.

Se o cliente 1 existe, outro cliente com a chave 1 é rejeitado. Uma chave omitida precisa de um valor padrão ou gerado. INTEGER PRIMARY KEY do SQLite gera um inteiro quando o valor é omitido ou informado como NULL. Historicamente, algumas outras declarações de chave primária em tabelas comuns do SQLite permitem NULL; NOT NULL explícito, uma tabela STRICT ou a forma de chave primária inteira elimina essa brecha.

Leia uma chave composta

Em enrollments(student_id, course_id, term, grade), um aluno pode cursar várias disciplinas e cursar uma delas novamente em outro período. (student_id, course_id, term) identifica uma matrícula: uma chave primária composta, não três chaves primárias separadas.

Os componentes individuais podem se repetir; a combinação completa não pode. A maioria dos SGBDs cria um índice de chave primária para buscas, mas a chave não garante a ordem dos resultados de uma consulta.

Principais conclusões

  • Uma chave candidata é uma superchave mínima.
  • Uma candidata é a chave primária; as demais são chaves alternativas.
  • A unicidade de uma chave deve valer para os dados futuros permitidos.
  • Uma chave primária é única, não permite NULL e pode abranger várias colunas.
  • A declaração estabelece a chave, não seu nome ou posição.

4.2 Identificadores naturais e gerados

Uma chave natural vem de dados do mundo real, como o VIN de um veículo, o ISBN de uma edição de livro ou um código de estado. Uma chave substituta existe apenas para identificar uma linha, muitas vezes como um inteiro gerado ou UUID.

Escolha um identificador duradouro

Prefira valores únicos, presentes, estáveis, compactos e seguros para compartilhar. Nomes se repetem; telefones e e-mails mudam ou são compartilhados. Números de seguridade social são sensíveis e alguns clientes não os têm; usá-los em tabelas que fazem referências espalha essas informações.

Um customer_id gerado permite que Maria mantenha o identificador 1 quando seus dados de contato mudam. Um state_code natural, como TX, pode funcionar bem porque é compacto, padronizado e útil em registros de endereço.

Proteja identificadores de negócio separadamente

A mesma pessoa pode se cadastrar duas vezes e receber dois identificadores substitutos. Os identificadores distinguem linhas; eles não detectam pessoas duplicadas.

Se o e-mail deve identificar cada conta, use NOT NULL UNIQUE. UNIQUE sozinho permite vários valores NULL no PostgreSQL, SQLite e MySQL. O SQL Server normalmente permite um NULL em uma restrição de unicidade de uma única coluna. Presença e unicidade são regras separadas.

O e-mail obrigatório e único é uma chave alternativa. Alterá-lo deixa o número substituto do cliente nos pedidos existentes inalterado. Alterar uma chave primária referenciada também exige que suas referências nas tabelas filhas permaneçam consistentes.

Reconheça a sintaxe de chave gerada
SistemaForma comum de inteiro gerado
SQL padrão, PostgreSQL, OracleGENERATED ALWAYS AS IDENTITY
MySQLAUTO_INCREMENT
SQL ServerIDENTITY(1,1)
SQLiteINTEGER PRIMARY KEY

O PostgreSQL também tem a forma mais antiga SERIAL. Exclusões, inserções malsucedidas e operações canceladas podem deixar lacunas. Os identificadores 1, 2 e 4 identificam três linhas, não quatro. Renumerar para fechar lacunas pode quebrar referências.

Reconheça UUIDs

Um UUID é um identificador de 128 bits, normalmente escrito com 36 caracteres e hífens: 7c9e6679-7425-40de-944b-e07fc1f90ae7. Computadores podem gerá-los independentemente com risco muito baixo de colisão, o que é útil quando registros de vários lugares serão combinados.

UUIDs ocupam mais espaço e são mais difíceis de ler que inteiros pequenos. Escolha de acordo com a forma como os registros são criados e referenciados. Qualquer um dos tipos de chave é um rótulo: seu valor máximo não é uma contagem de linhas, e sua ordem não precisa indicar os horários dos eventos.

Principais conclusões

  • Chaves naturais vêm de identificadores do mundo real; chaves substitutas existem para identificar linhas.
  • Prefira chaves primárias estáveis, compactas, presentes e seguras para compartilhar.
  • Uma chave substituta não impede registros duplicados do mesmo elemento do mundo real.
  • NOT NULL UNIQUE pode proteger um identificador alternativo obrigatório.
  • Lacunas em identificadores gerados são normais; identificadores são rótulos, não contagens.
  • UUIDs permitem gerar identificadores independentemente com risco muito baixo de colisão.

4.3 Chaves estrangeiras e referências válidas

Uma chave estrangeira é uma coluna ou grupo de colunas que faz referência a uma chave primária ou a outra chave única adequada. A tabela que contém a referência é a filha; a tabela para a qual ela aponta é a pai. Um valor de chave estrangeira diferente de NULL deve corresponder a uma chave pai existente quando a restrição é imposta.

Siga um valor entre tabelas
order_idcustomer_idorder_dateshipped_date
10112026-03-022026-03-04
10222026-03-05NULL
10312026-03-092026-03-10

orders.customer_id faz referência a customers.customer_id. O pedido 102 aponta para o cliente 2, James Wilson. Os pedidos 101 e 103 apontam para a cliente 1, Maria Garcia. A repetição é permitida na chave estrangeira; a chave pai referenciada é única.

Essa regra é a integridade referencial. Um pedido para o cliente 99 é rejeitado se o cliente 99 não existir. Caso contrário, seria uma linha órfã: uma linha filha sem uma linha pai correspondente. Um nome sozinho não cria uma restrição. Uma chave estrangeira chamada placed_by ainda pode fazer referência a customer_id; a referência declarada cria o vínculo, com tipos correspondentes para as colunas de chave.

Opcional ou obrigatório

Um coupon_id que permite NULL pode ser NULL quando um pedido não tem cupom. Um customer_id declarado NOT NULL exige que todo pedido tenha uma referência a cliente, e a chave estrangeira exige que esse cliente exista. Essas duas restrições funcionam juntas: uma exige um valor e a outra verifica a referência.

Chaves estrangeiras não precisam atravessar limites de tabelas. Em employees(employee_id, name, manager_id), manager_id pode fazer referência a employee_id na mesma tabela. A pessoa que dirige a empresa pode ter uma referência NULL para gerente.

Alterações na tabela pai precisam de uma regra
AçãoEfeito quando uma linha pai referenciada é excluída
NO ACTION ou RESTRICTRecusa a exclusão enquanto restarem referências, sujeito ao momento de verificação da restrição
CASCADETambém exclui as linhas filhas que fazem referência
SET NULLMantém as linhas filhas e apaga sua referência; a coluna deve permitir NULL

Com a ação padrão, a cliente 1 não pode ser excluída enquanto os pedidos 101 e 103 ainda fizerem referência a ela. A propagação em cascata de um pedido para seus itens pode fazer sentido porque esses itens pertencem ao pedido. ON UPDATE especifica o comportamento correspondente quando uma chave pai muda. A propagação em cascata não significa que excluir uma linha filha exclua sua linha pai.

Referências compostas e aplicação

Se um item de pedido é identificado por (order_id, product_id), um envio que faz referência a esse item precisa de ambas as colunas. A combinação deve corresponder a um item existente. Encontrar um pedido e um produto separadamente não basta: esse produto pode nunca ter aparecido naquele pedido. Uma referência composta obrigatória declara todas as suas colunas como NOT NULL.

PostgreSQL, SQL Server, Oracle e o mecanismo InnoDB usual do MySQL impõem as chaves estrangeiras declaradas. No SQLite, habilite e verifique a aplicação de chaves estrangeiras em cada conexão com PRAGMA foreign_keys = ON; antes de depender dela. Uma restrição declarada, mas desativada, não pode proteger as linhas. Chaves estrangeiras também não combinam resultados de consultas por si só; uma consulta deve seguir o vínculo explicitamente, geralmente por meio de uma junção.

Principais conclusões

  • Um valor de chave estrangeira diferente de NULL deve corresponder a uma chave referenciada existente.
  • Valores de chave estrangeira podem se repetir; valores de chave pai são únicos.
  • NOT NULL torna o vínculo obrigatório.
  • Ações referenciais controlam as linhas filhas quando uma linha pai muda.
  • Uma referência composta deve corresponder à combinação completa da chave pai.
  • A aplicação de chaves estrangeiras no SQLite deve ser habilitada em cada conexão.

4.4 Leia as quantidades do relacionamento nas duas direções

Para identificar um relacionamento, faça duas perguntas: “Para uma linha aqui, quantas linhas ali podem ser vinculadas?” e depois a pergunta inversa. Inclua o mínimo e o máximo. A amostra de hoje mostra o que aconteceu; as restrições descrevem o que é permitido.

Um cliente, muitos pedidos

Um cliente pode fazer zero ou mais pedidos. Cada pedido da loja pertence a exatamente um cliente porque orders.customer_id é uma chave estrangeira que não permite NULL. Esse é um relacionamento um para muitos. A chave estrangeira pertence a orders, o lado muitos: cada pedido armazena uma referência a cliente.

Maria tem os pedidos 101 e 103; James tem o pedido 102. Aisha e Wei não têm nenhum. Sua ausência de orders é válida. Uma chave estrangeira exige uma linha pai para cada linha filha, mas não exige que toda linha pai tenha uma linha filha.

Um para um também exige unicidade

Em user_profiles(user_id, bio, photo_url), considere que user_id seja tanto a chave primária quanto uma chave estrangeira para users. Cada perfil faz referência a um usuário, e um usuário pode ter no máximo um perfil porque a chave do perfil não pode se repetir. Um usuário pode ainda não ter perfil.

Uma chave estrangeira sem unicidade permitiria vários perfis para o mesmo usuário, resultando em um para muitos. A restrição de unicidade altera o máximo. Essas tabelas de perfil separadas podem manter dados opcionais ou sensíveis à parte do registro principal do usuário.

Muitos para muitos usa uma tabela de pares

Um pedido pode conter vários produtos, e um produto pode aparecer em vários pedidos. Uma tabela associativa, também chamada de tabela de junção, de ligação ou intermediária, registra cada combinação:

order_idproduct_idquantityunit_price
10111212,50
1011218,99
10213134,00
10311412,50

order_id faz referência a orders; product_id faz referência a products. A chave primária composta (order_id, product_id) permite o mesmo produto em pedidos diferentes, mas impede que o mesmo par apareça duas vezes. Dois vínculos um para muitos implementam o relacionamento muitos para muitos.

quantity e unit_price pertencem à combinação. Eles descrevem quanto daquele produto foi vendido naquele pedido e o preço cobrado naquele momento. O preço atual de um produto pode mudar depois; isso não deve reescrever o valor cobrado no passado.

Para o pedido 101, os dois valores de item são duas canecas a R$ 12,50, resultando em R$ 25,00, e um carregador a R$ 8,99. Juntos, custam R$ 33,99. A quantidade indica quantas canecas foram compradas; armazenar duas linhas duplicadas de caneca entraria em conflito com a chave escolhida para essa tabela.

Evite listas e espaços fixos

Uma célula product_ids contendo “11,12” esconde várias referências dentro de um valor de texto. Colunas como product1, product2 e product3 impõem um limite fixo e deixam espaços sem uso. Uma tabela associativa acrescenta uma linha para cada combinação adicional e permite que o SGBD verifique cada referência separadamente.

Um relacionamento autorreferente usa o mesmo padrão dentro de uma tabela: muitos funcionários podem fazer referência ao mesmo gerente por meio de manager_id. O gerente também é uma linha de funcionário. Leia cada vínculo como um papel, para manter distintos o identificador do funcionário e a referência ao gerente.

Principais conclusões

  • Leia o mínimo e o máximo permitidos em cada direção.
  • Um relacionamento um para muitos armazena a chave estrangeira no lado muitos.
  • Uma chave estrangeira única limita o relacionamento a no máximo uma linha filha por linha pai.
  • Uma tabela associativa representa vínculos muitos para muitos por meio de linhas de pares.
  • Informações como quantidade e preço de venda podem pertencer a uma combinação.
  • Uma autorreferência vincula papéis dentro de uma tabela.
5

Ler um esquema e seguir seus vínculos

Um esquema registra a estrutura que dá significado às tabelas: tipos de colunas, identificadores, referências e restrições. Um diagrama torna esses vínculos visíveis, enquanto uma definição de tabela estabelece as regras com precisão. Use ambas as formas para encontrar o caminho de uma pergunta até sua resposta e depois use as linhas reais para fornecer os valores. Mantenha separados a estrutura e os dados atuais: saber que pedidos fazem referência a clientes não informa quais clientes fizeram pedidos hoje.

5.1 Estrutura, dados atuais e restrições

Um esquema descreve tabelas, colunas, tipos de dados e restrições. Uma instância é o conjunto de dados armazenados em um determinado momento. Adicionar um pedido altera a instância; adicionar uma nova coluna altera o esquema. O esquema informa o que pode ser armazenado, enquanto as linhas mostram o que está armazenado agora.

Leia uma descrição abreviada

customers(customer_id, first_name, last_name, email, phone, city, state, zip_code) lista uma tabela e suas colunas. Anotações podem sublinhar chaves primárias ou marcá-las com PK e marcar referências com FK. Por exemplo, orders(order_id PK, customer_id FK → customers, order_date, shipped_date) identifica a chave principal e o vínculo com o cliente.

Leia uma definição completa de tabela
CREATE TABLE orders (
  order_id INTEGER PRIMARY KEY,
  customer_id INTEGER NOT NULL REFERENCES customers (customer_id),
  order_date DATE NOT NULL,
  shipped_date DATE
);

Leia uma coluna de cada vez. order_id é a chave primária inteira. customer_id é obrigatório e deve fazer referência a um cliente. order_date é obrigatório. shipped_date pode ser NULL. Essa definição fornece a estrutura permitida, não uma lista dos pedidos existentes.

As restrições respondem a perguntas diferentes:

RestriçãoO que ela verifica
PRIMARY KEYUm identificador único de linha, possivelmente composto
NOT NULLUm valor está presente
UNIQUEValores não NULL repetidos são proibidos; o tratamento de NULL varia
REFERENCESUma referência corresponde a uma chave pai
CHECKUma condição não pode ser FALSE
DEFAULTFornece um valor quando ele é omitido

Um valor padrão não substitui um valor inválido informado. Se status tem DEFAULT 'pending', omitir o status fornece 'pending'; um valor informado ainda deve atender às demais regras da coluna.

Combine regras para um item de pedido
CREATE TABLE order_items (
  order_id INTEGER NOT NULL REFERENCES orders (order_id),
  product_id INTEGER NOT NULL REFERENCES products (product_id),
  quantity INTEGER NOT NULL CHECK (quantity > 0),
  unit_price DECIMAL(8, 2) NOT NULL,
  PRIMARY KEY (order_id, product_id)
);

A chave primária na parte inferior usa duas colunas. Um segundo item para o mesmo pedido e produto é rejeitado. A quantidade 0 não passa na verificação. Uma quantidade ausente não passa em NOT NULL: a verificação sozinha permitiria NULL porque NULL > 0 é UNKNOWN, não FALSE. NOT NULL explícito em ambas as partes da chave também evita a exceção histórica do SQLite para chaves compostas que permitem NULL. No SQLite, use centavos inteiros para um unit_price exato; a declaração decimal sozinha não oferece armazenamento exato.

Encontre o esquema e seus significados

No terminal do SQLite, .schema orders exibe a definição; no psql do PostgreSQL, \d orders a descreve. As visões INFORMATION_SCHEMA listam metadados estruturais no PostgreSQL, MySQL e SQL Server. O SQLite lista objetos em sqlite_schema, e ferramentas gráficas mostram tabelas e colunas em uma árvore.

“Esquema” também é o nome de um espaço de nomes em sistemas como PostgreSQL e SQL Server. sales.orders significa a tabela de pedidos no esquema de vendas. Um dicionário de dados fornece significados que a estrutura não consegue expressar, como a moeda do preço ou se uma data de envio ausente significa “não enviado”. Para ver as linhas, uma consulta como SELECT * FROM orders; lê a instância atual.

Principais conclusões

  • Um esquema é a estrutura; uma instância são os dados em um momento.
  • Leia o tipo de uma coluna e todas as suas restrições em conjunto.
  • Um número positivo obrigatório precisa de NOT NULL e de uma verificação de valor positivo.
  • Uma chave primária composta é declarada sobre toda a combinação.
  • Um dicionário de dados registra significados e unidades além do esquema.

5.2 Leia as extremidades de uma linha do esquema

Um diagrama do esquema representa cada tabela como uma caixa. O título nomeia a tabela; o conteúdo lista as colunas e muitas vezes os tipos. PK marca chaves primárias, e FK marca chaves estrangeiras. Linhas de relacionamento mostram qual chave estrangeira faz referência a qual chave pai.

Primeiro identifique o tipo de linha

Alguns diagramas usam uma seta de uma chave estrangeira para sua chave referenciada. Uma seta de orders.customer_id para customers.customer_id descreve a direção da referência. Outras ferramentas usam símbolos nas extremidades para descrever quantas linhas podem ser vinculadas. Verifique a legenda do diagrama: a direção de uma seta e a quantidade de linhas em um relacionamento são informações diferentes.

Leia os símbolos de pé de galinha

Na notação pé de galinha, uma barra significa um, um círculo significa zero e um pé de três pontas significa muitos. Cada extremidade de linha indica um mínimo e um máximo. O símbolo mais próximo da tabela fornece o máximo; o outro fornece o mínimo.

Símbolos na extremidadeNúmero permitido de linhas nessa extremidade
Barra e barraExatamente um
Círculo e barraZero ou um
Barra e pé de galinhaUm ou mais
Círculo e pé de galinhaZero ou mais

Ao ler a partir de uma tabela, olhe os símbolos ao lado da outra tabela. Esses símbolos descrevem quantas linhas ali podem corresponder à sua linha inicial.

Analise clientes e pedidos

A linha da loja tem símbolos de exatamente um junto a customers e símbolos de zero ou mais junto a orders.

  1. Comece com um cliente. Olhe a extremidade de pedidos: o cliente pode ter zero ou mais pedidos.
  2. Comece com um pedido. Olhe a extremidade de clientes: o pedido pertence a exatamente um cliente.
  3. Verifique a definição: a chave estrangeira que não permite NULL está em orders, então esse é o lado muitos, e cada pedido precisa de um cliente válido.

O pé de galinha fica junto à tabela que contém a chave estrangeira repetível. Ler a extremidade próxima ao começar pela mesma tabela inverte o significado. Uma referência a cliente que permitisse NULL mudaria a extremidade de clientes para zero ou um; ela não limitaria cada cliente a um pedido.

Reconheça uma tabela associativa

A loja tem vínculos um para muitos de orders para order_items e de products para order_items. Ambas as extremidades muitos se encontram em order_items. Suas duas chaves estrangeiras formam a chave primária. Essa estrutura permite que um pedido contenha vários produtos e que um produto apareça em vários pedidos.

O diagrama descreve conexões permitidas, não as contagens de hoje. Ele permite que Maria tenha vários pedidos e que Aisha não tenha nenhum. Para saber quantos pedidos cada uma realmente tem, leia as linhas. Um mínimo de um da tabela pai para a filha pode expressar uma regra de negócio adicional; uma chave estrangeira sozinha não exige que uma linha pai tenha linhas filhas.

Reconheça estilos de diagrama relacionados

Um diagrama entidade-relacionamento criado durante o projeto pode mostrar entidades do negócio antes de as tabelas existirem. Diagramas no estilo Chen usam ovais para atributos e losangos para relacionamentos. Um diagrama do esquema mostra as tabelas reais e suas chaves declaradas. Ambos ajudam a comunicar a estrutura, mas seus símbolos precisam ser lidos de acordo com suas próprias legendas.

Principais conclusões

  • Um diagrama do esquema mostra tabelas e vínculos de chave declarados.
  • Em cada extremidade da linha, leia o mínimo e o máximo usando a legenda.
  • A extremidade oposta descreve as linhas vinculadas a uma linha inicial.
  • A extremidade muitos de um vínculo um para muitos contém a chave estrangeira repetível.
  • Duas extremidades muitos que se encontram em uma tabela podem revelar uma tabela associativa.
  • Um diagrama fornece conexões permitidas; as linhas fornecem as contagens reais.

5.3 Encontre informações seguindo chaves

Localize cada informação solicitada e siga as chaves que a conectam ao registro inicial. Nomes podem se repetir ou mudar; compare os valores das chaves.

Encontre o cliente de um pedido

“Em que cidade mora o cliente que fez o pedido 102?” segue este caminho:

  1. Encontre o pedido 102 por orders.order_id.
  2. Leia seu customer_id: 2.
  3. Encontre o cliente 2 por customers.customer_id.
  4. Leia customers.city: Denver.

O número de pedido 102 não é o identificador do cliente. Junções SQL automatizam essas correspondências de chave; posições na exibição não conectam os registros.

Encontre produtos e um total histórico

O pedido 101 tem estas linhas em order_items. Siga cada product_id até products para obter seu nome:

product_idquantityunit_priceNome do produto
11212,50Caneca de café
1218,99Carregador de celular

Use o preço registrado no item para obter o valor cobrado:

  • Duas canecas a R$ 12,50 custam R$ 25,00.
  • Um carregador a R$ 8,99 custa R$ 8,99.
  • Total: R$ 33,99.

O preço atual do produto poderia indicar incorretamente o custo de um pedido antigo. O pedido 102 tem uma luminária a R$ 34,00; o pedido 103 tem quatro canecas a R$ 12,50, totalizando R$ 50,00.

Interprete valores ausentes e regras

A data de envio do pedido 102 é NULL, documentado aqui como “não enviado”. Teste-a com IS NULL, não com igualdade a NULL.

Leia todas as restrições relevantes ao avaliar uma alteração:

  • Um item para o pedido 104 é rejeitado se esse pedido não existir.
  • Outro item com a chave (101, 11) é rejeitado porque o par já existe.
  • A quantidade 0 não passa na verificação de quantidade positiva.
  • O comportamento padrão da chave estrangeira bloqueia a exclusão do produto 11 enquanto itens fizerem referência a ele.

Uma chave não usada não torna uma linha válida quando sua referência está ausente.

Identifique as novas linhas

Um cliente já cadastrado que compra dois produtos diferentes já existentes acrescenta uma linha a orders e duas linhas a order_items. O cliente e os produtos já existem. Oferecer um novo produto acrescenta uma linha a products, sem exigir um pedido.

Principais conclusões

  • Localize cada informação solicitada antes de seguir o caminho de referências entre chaves.
  • Associe valores de chave estrangeira às chaves referenciadas, não a nomes ou posições de linhas.
  • Use o preço do item de venda para totais históricos de pedidos.
  • Verifique todas as restrições aplicáveis ao avaliar uma alteração proposta.
  • Um novo evento acrescenta linhas às tabelas cujas informações ele cria.

Exercícios resolvidos de Modelo relacional

5 Lições Interativas

1

Dos registros compartilhados às solicitações ao banco de dados

12 passos
Veja como um SGBD mantém registros relacionados utilizáveis e acompanhe uma solicitação de um aplicativo ao banco de dados.
  1. 1
    IntroduçãoQuem cuida das informações compartilhadas?

    As equipes de vendas, atendimento e gestão de uma loja usam os mesmos registros de clientes. Um banco de dados guarda essas informações compartilhadas, e um software chamado SGBD as gerencia.

    Acompanhe como um sistema de banco de dados compartilha essas informações, mantém as alterações consistentes (tarefa de uma transação) e responde a solicitações de aplicativos.

  2. 2
    ExplicaçãoSepare a coleção do software

    Dados são fatos registrados. Um banco de dados é uma coleção organizada de dados relacionados; um SGBD é o software que a gerencia.

    Os clientes e pedidos da loja são dados. O PostgreSQL os armazena, verifica regras e responde a solicitações.

  3. 3
    ExemploAtualize um telefone

    O telefone de Maria aparece em 14 vendas na planilha. Uma edição esquecida deixa cópias conflitantes.

    Armazene o telefone dela uma vez sob customer_id 1 e faça as vendas se referirem a ela. Uma mudança de telefone exige então uma atualização; cada venda mantém suas próprias informações.

  4. 4
    AnalogiaMantenha duas alterações juntas

    Uma transferência subtrai da conta-corrente e adiciona à poupança. Salvar apenas a subtração deixaria saldos incorretos.

    Uma transação salva as duas alterações juntas ou desfaz ambas, mesmo em linhas ou tabelas diferentes.

  5. 5
    DesafioEscolha a proteção

    Uma reserva reduz a quantidade de assentos disponíveis, mas o salvamento de seu registro de pagamento falha. As duas alterações pertencem a uma transação. O que deve permanecer após essa transação ser desfeita?

    ---reveal---

    Nenhuma das alterações deve permanecer. Desfazer a redução de assentos restaura a disponibilidade anterior, e nenhum registro de pagamento dessa transação malsucedida é salvo. Manter apenas a alteração dos assentos deixaria uma reserva parcial.

  6. 6
    ConexãoReconheça a carga de trabalho

    Fazer um pedido é trabalho transacional: algumas leituras e gravações rápidas. Comparar vendas mensais por região é trabalho analítico: resumir muitos registros históricos.

    Um banco de dados de vendas pode atender às duas atividades.

  7. 7
    ExplicaçãoAcompanhe a solicitação do aplicativo

    Clientes enviam solicitações a um servidor de banco de dados, como ocorre com PostgreSQL ou SQL Server. O SQLite é executado como uma biblioteca dentro do aplicativo, sem um servidor separado.

    Um provedor gerenciado em nuvem opera servidores para seus usuários; tabelas e solicitações continuam sendo usadas.

  8. 8
    ExemploLeia uma solicitação declarativa

    SELECT first_name, city FROM customers WHERE state = 'TX'; solicita duas colunas dos clientes em TX.

    SQL é declarativa: ela informa o resultado e deixa as etapas de recuperação para o SGBD. SQL é a linguagem; PostgreSQL é um dos produtos que a interpretam.

  9. 9
    DicaLeia a função da instrução

    ALTER TABLE altera a estrutura; INSERT adiciona uma linha; GRANT gerencia permissões; COMMIT salva uma transação.

    Texto usa aspas simples: 'TX'. Duplique um apóstrofo interno: 'O''Brien'. Um ponto e vírgula normalmente encerra uma instrução.

  10. 10
    DesafioEscolha entre estrutura e dados

    Uma loja adiciona uma coluna delivery_note e depois a preenche para um pedido. Ambas são alterações em linhas?

    ---reveal---

    Adicionar a coluna altera a estrutura: definição de dados. Preenchê-la altera os dados armazenados: manipulação de dados.

  11. 11
    DesafioReúna as partes

    Um site envia SQL a um servidor PostgreSQL para registrar uma compra. Mais tarde, um gerente lê uma visão comum de vendas. A visão contém outra cópia armazenada de todas essas linhas de compra?

    ---reveal---

    Não. Uma visão comum salva uma consulta que lê os dados subjacentes; ela não armazena linhas de resultado separadas. O PostgreSQL continua sendo o SGBD que gerencia os registros de compra, enquanto o site e a ferramenta de relatórios são clientes.

  12. 12
    RecapitulaçãoUma coleção compartilhada com responsabilidades claras

    Um banco de dados contém informações; um SGBD gerencia armazenamento, regras, acesso e recuperação. Transações mantêm alterações juntas.

    Solicitações SQL tratam de estrutura, linhas, permissões ou controle de transações. Identifique a função antes de ler os detalhes.

2

Leia o significado por trás de uma tabela

10 passos
Localize uma informação, conte a estrutura da tabela e distinga regras relacionais da organização da exibição.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoComece pelo que uma linha representa
  2. 2
    ExemploEncontre a cidade de um cliente
  3. 3
    ExplicaçãoUse os nomes formais
  4. 4
    DesafioPreveja dois tipos de adição
  5. 5
    Ideia-chaveIdentifique registros sem posições
  6. 6
    AnalogiaMantenha um valor para cada propriedade
  7. 7
    ExplicaçãoAssocie um tipo a seu domínio
  8. 8
    DesafioInterprete uma exportação de planilha
  9. 9
    DesafioVerifique um novo registro e seus valores
  10. 10
    RecapitulaçãoLeia a estrutura antes dos valores
3

Escolha o armazenamento e raciocine com NULL

15 passos
Aplique escolhas de tipos a dados de negócio e preveja o efeito de valores ausentes em comparações e cálculos.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoDuas escolhas para cada coluna
  2. 2
    ExplicaçãoSepare as famílias numéricas
  3. 3
    DicaObserve as diferenças entre produtos
  4. 4
    DesafioVerifique um intervalo decimal
  5. 5
    ConexãoReconheça datas e indicadores
  6. 6
    ExplicaçãoEscolha conforme a finalidade do valor
  7. 7
    ExemploArmazene valores monetários com exatidão
  8. 8
    DesafioCorrija um código e uma quantidade
  9. 9
    ExplicaçãoLeia o que está ausente
  10. 10
    ExemploAcompanhe uma comparação desconhecida
  11. 11
    Ideia-chaveUse o teste de valor ausente
  12. 12
    DesafioCombine conhecido e desconhecido
  13. 13
    ExemploConte o que está presente
  14. 14
    DesafioVerifique a interpretação de um relatório
  15. 15
    RecapitulaçãoDeixe o significado orientar o armazenamento
4

Crie vínculos confiáveis a partir de chaves

18 passos
Teste identificadores, acompanhe chaves estrangeiras e leia relacionamentos um para muitos, um para um e muitos para muitos.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoA identificação vem antes do vínculo
  2. 2
    ExplicaçãoTeste unicidade e minimalidade
  3. 3
    DesafioTeste uma matrícula futura
  4. 4
    DicaDeclare uma chave primária
  5. 5
    ExplicaçãoEscolha um rótulo estável
  6. 6
    Ideia-chaveMantenha uma regra de negócio separada
  7. 7
    DesafioLeia uma lacuna sem renumerar
  8. 8
    ExemploSiga a referência de um pedido
  9. 9
    ExplicaçãoReferências obrigatórias e opcionais
  10. 10
    DesafioLeia uma regra de exclusão
  11. 11
    ConexãoVerifique a referência completa
  12. 12
    ExplicaçãoLeia um para muitos nas duas direções
  13. 13
    ExemploLimite um vínculo a um
  14. 14
    ExemploRepresente cada combinação de produto
  15. 15
    Ideia-chaveArmazene uma informação sobre o par
  16. 16
    DesafioEscolha um vínculo para uma nova situação
  17. 17
    DesafioCombine identificação e referências
  18. 18
    RecapitulaçãoChaves cumprem funções diferentes em conjunto
5

Leia um esquema para responder a uma pergunta

14 passos
Leia definições e extremidades de diagramas, depois acompanhe registros e avalie se alterações propostas são válidas.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoSepare o mapa dos registros
  2. 2
    ExemploLeia uma definição de pedido
  3. 3
    Ideia-chaveCombine uma verificação com um valor obrigatório
  4. 4
    DesafioClassifique duas alterações
  5. 5
    DicaEncontre as regras completas
  6. 6
    ExplicaçãoLeia a legenda de um diagrama
  7. 7
    ExemploComece com uma linha e olhe para o outro lado
  8. 8
    DesafioPreveja um vínculo opcional
  9. 9
    ConexãoIdentifique uma tabela de pares
  10. 10
    ExemploSiga o pedido 102 até sua cidade
  11. 11
    ExemploCalcule a partir dos itens de venda
  12. 12
    DesafioAvalie um item proposto
  13. 13
    DesafioConecte dados, regras e significado
  14. 14
    RecapitulaçãoUse cada fonte para suas próprias informações

Questões de Modelo relacional

50 Questões de Prática em 5 conjuntos

Conjunto 1: Aplicar regras em um pequeno banco de dados10 Questões de Prática

Questão 1 de 10

Um aplicativo usa uma visão comum chamada open_jobs e um índice em jobs.job_id. Qual é a função de cada um?
  1. A visão contém linhas copiadas; o índice altera o esquema.
  2. A visão salva uma consulta; o índice ajuda a localizar linhas.
  3. A visão concede acesso; o índice fornece valores ausentes.
  4. A visão armazena a tabela; o índice salva uma consulta.
Mostrar respostaOcultar resposta
Resposta: B
Uma visão salva uma consulta; um índice ajuda a localizar linhas. Uma visão comum não mantém cópias das linhas de resultado: os registros atuais de trabalhos permanecem na tabela subjacente.

Questão 2 de 10

Uma empresa lê vários anos de linhas de faturas para comparar a receita anual por região. Que tipo de carga de trabalho é essa?
  1. Carga de trabalho transacional
  2. Carga de trabalho embarcada
  3. Carga de trabalho analítica
  4. Carga de trabalho de definição de dados
Mostrar respostaOcultar resposta
Resposta: C
Esse é um trabalho analítico: resumir muitas faturas armazenadas. O trabalho transacional registra eventos individuais, como a emissão de uma fatura. Classifique a atividade, mesmo quando ambas usam os mesmos dados.

Questão 3 de 10

Um relatório mostra o item 8 antes do item 3. Uma execução posterior mostra o item 3 primeiro, com todos os valores inalterados. O que explica a mudança?
  1. A ordem dos resultados não é especificada se não for solicitada.
  2. O primeiro item se tornou a chave primária.
  3. As posições das colunas agora identificam itens diferentes.
  4. A tabela deve ter perdido uma regra de unicidade.
Mostrar respostaOcultar resposta
Resposta: A
A ordem dos resultados não é especificada a menos que seja solicitada. Mover uma linha na tela não altera sua identidade nem seus valores. Uma chave primária identifica a linha; ela não obriga a menor chave a aparecer primeiro.

Questão 4 de 10

Cada leitor de uma biblioteca pode pegar muitos livros emprestados, e cada livro pode ser emprestado a muitos leitores ao longo do tempo. Qual estrutura representa um empréstimo?
  1. Uma linha com referências ao leitor e ao livro, além da data do empréstimo
  2. Uma linha de leitor com uma lista separada por vírgulas de todos os livros emprestados
  3. Uma linha de livro com uma lista separada por vírgulas de todos os leitores anteriores
  4. Uma linha de leitor com colunas fixas de referência book_1, book_2 e book_3
Mostrar respostaOcultar resposta
Resposta: A
Uma linha de empréstimo vincula um leitor e um livro e pode conter a data do evento. Essas linhas de ligação representam a conexão muitos para muitos sem incorporar listas. Espaços fixos para livros limitariam quantas referências um leitor poderia ter; também dificultariam o registro de empréstimos repetidos.

Questão 5 de 10

Uma tabela contém atualmente os identificadores gerados 2, 5 e 8. Quantas linhas ela contém?
  1. 8 linhas
  2. 3 linhas
  3. 5 linhas
  4. 6 linhas
Mostrar respostaOcultar resposta
Resposta: B
Há 3 linhas, uma para cada identificador listado. Identificadores gerados são rótulos e podem ter lacunas após exclusões ou operações malsucedidas. Tomar o maior identificador, 8, como a contagem de linhas pressupõe uma sequência consecutiva que chaves geradas não garantem.

Questão 6 de 10

Um diagrama tem símbolos de exatamente um junto a Departamentos e símbolos de zero ou mais junto a Funcionários. Lendo a partir de um departamento, quantos funcionários podem estar vinculados?
  1. Exatamente um funcionário
  2. Um ou mais funcionários
  3. Zero ou um funcionário
  4. Zero ou mais funcionários
Mostrar respostaOcultar resposta
Resposta: D
Leia os símbolos na extremidade de Funcionários para descrever os funcionários vinculados a um departamento: zero ou mais. Os símbolos de exatamente um em Departamentos respondem à pergunta inversa, sobre o departamento de um funcionário. Ler a extremidade inicial trocaria as duas direções.

Questão 7 de 10

Cinco leituras de inspeção são 6, NULL, 12, NULL e 9. Quais são os valores de COUNT(*) e AVG(reading)?
  1. 5 e 5,4
  2. 3 e 9
  3. 5 e 9
  4. 3 e 5,4
Mostrar respostaOcultar resposta
Resposta: C
COUNT(*) conta todas as 5 linhas. AVG ignora as duas leituras ausentes e divide o total conhecido, 27, por três, resultando em 9. Dividir por cinco trata entradas ausentes como zero, embora NULL não forneça evidência de que alguma das medidas ausentes fosse zero.

Questão 8 de 10

Uma tabela comum do SQLite declara label VARCHAR(4). Uma linha fornece o texto “Inverno”. O que o SQLite faz?
  1. Armazena apenas as quatro primeiras letras.
  2. Completa a palavra com dois espaços.
  3. Rejeita a linha por excesso de comprimento.
  4. Armazena a palavra completa de sete letras.
Mostrar respostaOcultar resposta
Resposta: D
O SQLite ignora o argumento de comprimento em VARCHAR(4), então armazena o texto completo. A declaração fornece afinidade de texto, não um limite de quatro caracteres. Esperar a rejeição aplica ao SQLite o comportamento de sistemas como PostgreSQL, mas no SQLite comprimentos de caracteres declarados não oferecem essa proteção.

Questão 9 de 10

Orders tem o pedido 620 com account_id 14. Accounts tem a conta 14 em Phoenix e a conta 620 em Tulsa. O account_id do pedido faz referência a Accounts.account_id. Onde está a conta do pedido 620?
  1. Tulsa, associando os dois identificadores 620
  2. Phoenix, seguindo account_id 14
  3. Qualquer uma das cidades, pois ambos os identificadores existem
  4. Nenhuma das cidades, pois os nomes das chaves diferem
Mostrar respostaOcultar resposta
Resposta: B
O pedido 620 aponta por meio de seu valor account_id 14, então sua conta está em Phoenix. Associar order_id 620 diretamente a account_id 620 ignora o vínculo declarado. Identificadores de tabelas diferentes podem compartilhar um número sem representar o mesmo registro ou relacionamento.

Questão 10 de 10

Uma oficina permite uma inscrição por participante, sessão e data. Participantes podem frequentar sessões diferentes em uma data e repetir uma sessão em uma data posterior. Uma sessão pode ter muitos participantes. Qual combinação identifica uma inscrição?
  1. member_id e session_id
  2. member_id e data
  3. member_id, session_id e data
  4. session_id e data
Mostrar respostaOcultar resposta
Resposta: C
A combinação completa de participante, sessão e data é necessária. Remover a data confunde participações repetidas na mesma sessão; remover a sessão confunde duas sessões frequentadas na mesma data. Remover o participante reuniria pessoas diferentes na mesma sessão, então cada um dos três componentes é necessário.
Conjunto 2: Ler registros, tipos e vínculos simples10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

No PostgreSQL, quantos dígitos podem aparecer antes da vírgula decimal em um valor DECIMAL(7, 2)?
  1. 2
  2. 7
  3. 5
  4. 9
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Uma reserva salva a atribuição de um assento e um registro de pagamento correspondente. Qual recurso do banco de dados garante que ambas as alterações sejam salvas ou ambas sejam desfeitas?
  1. Uma restrição de unicidade
  2. Uma definição de tabela
  3. Uma transação
  4. Uma visão salva
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma tabela tem 6 colunas nomeadas e 18 linhas. Após a adição de mais duas linhas, quais são seu grau e sua cardinalidade?
  1. Grau 20, cardinalidade 6
  2. Grau 6, cardinalidade 18
  3. Grau 8, cardinalidade 20
  4. Grau 6, cardinalidade 20
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma tabela de equipamentos armazena o bem 46 com a entrada de telefone “212-555-0108, 212-555-0116”. A equipe precisa verificar cada número separadamente. Como os dados de telefone devem ser organizados?
  1. Manter uma célula de texto e aumentar seu comprimento.
  2. Usar linhas de telefone relacionadas, uma por número.
  3. Adicionar uma segunda linha de bem com a mesma chave.
  4. Usar um tipo numérico maior para os dois números.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

As regras da empresa exigem que badge_number esteja presente e seja único. Departamentos se repetem. Por que (badge_number, departamento) é uma superchave, mas não uma chave candidata?
  1. Um valor de departamento pode aparecer em várias linhas.
  2. Uma chave primária deve sempre conter duas colunas.
  3. Os valores de crachá podem deixar de ser únicos mais tarde.
  4. Remover departamento ainda deixa uma chave única.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Um código de depósito pode ser “0047” ou “47-A”. Ele é comparado a rótulos e nunca é usado em cálculos. Qual tipo preserva melhor esses valores?
  1. Um tipo de texto de comprimento variável
  2. Um tipo numérico inteiro
  3. Um tipo numérico decimal exato
  4. Um tipo de ponto flutuante aproximado
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Quatro linhas têm os valores de região “NE”, “SW”, NULL e “NW”. Quantas linhas passam por WHERE region <> 'NE'?
  1. 3
  2. 2
  3. 4
  4. 1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Tickets tem uma chave estrangeira event_id para Events, imposta e que não permite NULL. Os eventos 12 e 19 existem. Dois ingressos já fazem referência ao evento 12. O que acontece com um terceiro ingresso que faz referência ao evento 12?
  1. Ele é permitido porque a linha pai existe.
  2. Ele é rejeitado porque event_id se repete.
  3. Ele cria outra linha para o evento 12.
  4. Ele altera um ingresso existente para o evento 12.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma pessoa desenvolvedora descreve as linhas necessárias para um relatório e deixa que o PostgreSQL escolha como encontrá-las. Que propriedade da SQL isso ilustra?
  1. Ela é declarativa.
  2. Ela é um mecanismo.
  3. Ela é um formato de arquivo.
  4. Ela é um banco de dados.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Leia quantity INTEGER CHECK (quantity > 0) e status TEXT DEFAULT 'new'. Nenhuma das colunas tem NOT NULL. Uma nova linha informa quantidade NULL e omite o status. O que é armazenado?
  1. A linha é rejeitada pela verificação de quantidade.
  2. A quantidade se torna 0; o status se torna “new”.
  3. A quantidade continua NULL; o status continua NULL.
  4. A quantidade continua NULL; o status se torna “new”.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 3: Escolher tipos e rastrear registros vinculados10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Na extremidade da tabela pai de um diagrama, um círculo e uma barra mostram zero ou um. A extremidade da tabela filha mostra zero ou mais. Qual referência na tabela filha corresponde a esses símbolos?
  1. Uma chave estrangeira obrigatória sem regra de unicidade
  2. Uma chave estrangeira obrigatória que também é única
  3. Uma chave estrangeira que permite NULL e também é única
  4. Uma chave estrangeira que permite NULL sem regra de unicidade
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Um aplicativo SQLite precisa armazenar cobranças exatas em reais e centavos de 7,35 e 2,80. Qual escolha de armazenamento mantém os valores exatos?
  1. Valores REAL 7,35 e 2,80
  2. Valores DECIMAL 7,35 e 2,80
  3. Centavos INTEGER 735 e 280
  4. Valores TEXT usados diretamente em cálculos
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

A fatura 75 tem dois itens: produto 6, quantidade 3, preço unitário cobrado 4,20; produto 8, quantidade 2, preço unitário cobrado 6,50. Seus preços atuais de catálogo são 4,80 e 6,00. Qual foi o total cobrado na fatura?
  1. 25,60
  2. 26,40
  3. 27,40
  4. 24,60
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

No PostgreSQL, um envio tem delay_days NULL e status “urgent”. Qual é o resultado de (delay_days > 2) OR (status = 'urgent'), e WHERE mantém a linha?
  1. UNKNOWN; a linha é omitida
  2. TRUE; a linha é mantida
  3. FALSE; a linha é omitida
  4. UNKNOWN; a linha é mantida
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma tabela adiciona tracking_note como uma nova coluna para cada entrega. Qual propriedade muda diretamente?
  1. Seu grau
  2. Sua quantidade de linhas
  3. Seu índice
  4. Sua chave primária
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma tabela de associados usa member_id gerado como chave primária. O e-mail deve estar presente e identificar no máximo uma conta. Qual declaração adicional impõe ambas as regras de e-mail no PostgreSQL?
  1. email TEXT PRIMARY KEY
  2. email TEXT NOT NULL
  3. email TEXT UNIQUE
  4. email TEXT NOT NULL UNIQUE
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Um serviço repete o telefone atual de cada fornecedor em todas as linhas de envio. A equipe deixa de atualizar algumas cópias. Que alteração resolve a inconsistência?
  1. Dar a cada envio um identificador maior.
  2. Ordenar os envios pelo telefone do fornecedor.
  3. Armazenar telefones como números em vez de texto.
  4. Armazenar os dados do fornecedor uma vez e referenciá-los.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Profiles.user_id é sua chave primária e também uma chave estrangeira para Users.user_id. Nenhuma regra exige que um usuário tenha um perfil. O que isso permite?
  1. Muitos perfis por usuário; um usuário por perfil
  2. Um ou mais perfis por usuário; um usuário por perfil
  3. Zero ou um perfil por usuário; um usuário por perfil
  4. Um perfil por usuário; muitos usuários por perfil
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma nova linha de fatura é adicionada sem alterar colunas ou restrições. O que mudou?
  1. O esquema, mas não a instância
  2. A instância, mas não o esquema
  3. Tanto o esquema quanto a instância
  4. Nem o esquema nem a instância
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

StockRows tem a chave primária (warehouse_id, item_id) com as linhas (4, 7) e (5, 9). Reservations tem uma chave estrangeira composta, obrigatória e imposta para StockRows. Uma reserva para (4, 9) é permitida?
  1. Não; o par referenciado completo está ausente.
  2. Sim; o depósito 4 e o item 9 aparecem.
  3. Sim; cada componente da chave é individualmente único.
  4. Não; todos os pares existentes precisariam ter o depósito 4.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 4: Ler restrições e explicar consequências10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Uma tabela de vendas contém linhas de venda e uma linha inferior chamada “TOTAL” com a soma de seus valores. Por que essa linha é um problema quando a coluna de valores é somada novamente?
  1. Ela transforma o valor de cada venda em texto.
  2. Ela obriga todas as linhas de venda a ter a mesma chave.
  3. Ela altera o número de colunas de cada venda.
  4. Ela adiciona um resumo como se fosse outra venda.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Dois preços são 30 USD e 30 EUR. Por que eles não podem ser somados diretamente como um total monetário significativo?
  1. Eles precisam de chaves primárias distintas.
  2. Seus comprimentos de texto são iguais.
  3. Suas unidades de moeda são diferentes.
  4. Seus valores não têm escala.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Um registro de cursos permite que cada aluno frequente muitos cursos, incluindo o mesmo curso em períodos diferentes. Cada curso tem muitos alunos. Qual linha de ligação e chave atendem a essas regras?
  1. Referências a aluno e curso; chave learner_id
  2. Referências a aluno e curso; chave (learner_id, course_id)
  3. Aluno, curso e período; chave (learner_id, course_id, período)
  4. Aluno, curso e período; chave (course_id, período)
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma tabela tem 9 colunas e 24 linhas. Três linhas são excluídas e depois duas colunas são adicionadas. Quais são seu grau e sua cardinalidade?
  1. Grau 11, cardinalidade 21
  2. Grau 6, cardinalidade 26
  3. Grau 9, cardinalidade 23
  4. Grau 21, cardinalidade 11
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Um diagrama mostra Orders e Products, cada uma vinculada a Lines por um relacionamento um para muitos. Lines tem a chave primária (order_id, product_id), e ambas as partes são chaves estrangeiras. O que isso mostra entre pedidos e produtos?
  1. Um para um, porque cada par é único
  2. Muitos para muitos, por meio da tabela Lines
  3. Um para muitos, com Products como tabela pai
  4. Muitos para um, com Orders como tabela filha
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Passes permite uma credencial ativa por pessoa e por armário. Tanto person_id quanto locker_id são obrigatórios e individualmente únicos. A chave primária é person_id. Como locker_id deve ser classificado?
  1. Apenas uma chave estrangeira
  2. Uma superchave não mínima
  3. Uma segunda chave primária
  4. Uma chave candidata alternativa
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Um esquema declara o preço como DECIMAL(8, 2). Que informação adicional é necessária para interpretar um preço armazenado de 45,00 como um valor do mundo real?
  1. O endereço físico da página em disco
  2. O número de índices da tabela
  3. A posição da linha na exibição
  4. A moeda usada pela coluna
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um site e uma ferramenta de relatórios se conectam a um servidor PostgreSQL que gerencia bancos de dados de loja e folha de pagamento. Qual descrição separa corretamente esses componentes?
  1. PostgreSQL é um cliente; loja e folha de pagamento são dialetos SQL.
  2. O site é SQL; PostgreSQL e folha de pagamento são bancos de dados.
  3. PostgreSQL é o SGBD; loja e folha de pagamento são bancos de dados.
  4. A ferramenta de relatórios é o SGBD; PostgreSQL são seus dados armazenados.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Duas tabelas comuns do SQLite declaram o valor DECIMAL(6, 2) e o rótulo VARCHAR(3). Linhas fornecem o valor 1234567,89 e o rótulo “Verão”. O que essas declarações impõem por si só?
  1. Tanto a precisão do valor quanto o comprimento do rótulo
  2. Nem a precisão do valor nem o comprimento do rótulo
  3. A precisão do valor, mas não o comprimento do rótulo
  4. O comprimento do rótulo, mas não a precisão do valor
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Um identificador de cliente é referenciado por muitas faturas antigas. Clientes frequentemente mudam de e-mail, e a empresa exige que os e-mails continuem únicos e presentes. Qual organização atende melhor a essas regras?
  1. Identificador substituto estável; e-mail declarado NOT NULL UNIQUE
  2. E-mail como chave primária; identificador gerado sem regra de unicidade
  3. Telefone como chave primária; e-mail armazenado sem restrições
  4. E-mail como chave primária; nova linha de cliente após cada alteração
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 5: Resolver questões sobre dados ausentes e restrições relacionadas10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Um SGBD reconstrói um índice e reorganiza páginas armazenadas. Os aplicativos continuam usando os mesmos nomes de tabelas e colunas para solicitar dados inalterados. Que princípio isso demonstra?
  1. Independência de dados
  2. Cardinalidade da junção
  3. Transações atômicas
  4. Chaves compostas de linha
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Scans usa a chave primária (batch_id, page_no). O par (18, 4) existe. Números de lote e de página podem se repetir separadamente. Qual linha proposta é rejeitada especificamente por duplicar essa chave?
  1. Lote 18, página 5, nova imagem
  2. Lote 19, página 4, nova imagem
  3. Lote 18, página 4, imagem diferente
  4. Lote 19, página 5, imagem diferente
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Um serviço de empréstimos deve impedir que um pagamento faça referência a um empréstimo inexistente, mesmo quando vários aplicativos gravam dados. Onde essa regra compartilhada deve ser imposta?
  1. Nos cabeçalhos de coluna de cada relatório
  2. Em uma restrição de referência imposta no banco de dados
  3. No texto do rótulo de exibição do empréstimo
  4. Na ordem usada para exibir linhas de pagamento
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

O que significa um círculo seguido de uma barra na extremidade de um diagrama com notação pé de galinha?
  1. Zero ou uma linha
  2. Exatamente uma linha
  3. Zero ou mais linhas
  4. Uma ou mais linhas
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

A venda 810 pertence ao cliente 26, que já existe. Uma nova compra desse mesmo cliente inclui três produtos diferentes já existentes, com um item por produto. Quantas novas linhas pertencem a Clients, Sales e SaleLines?
  1. 1 cliente, 1 venda, 3 itens
  2. 0 clientes, 3 vendas, 3 itens
  3. 0 clientes, 1 venda, 1 item
  4. 0 clientes, 1 venda, 3 itens
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Inicialmente, Orders.customer_id é uma chave estrangeira para Customers que não permite NULL e não tem regra de unicidade. Clientes podem não ter pedidos. Adicionar UNIQUE a Orders.customer_id deixa as outras regras inalteradas. Como o relacionamento muda?
  1. Clientes passam de muitos pedidos para exatamente um; cada pedido mantém um cliente.
  2. Clientes passam de zero ou muitos pedidos para zero ou um; cada pedido mantém um cliente.
  3. Clientes mantêm zero ou muitos pedidos; cada pedido passa a ter zero ou um cliente.
  4. Clientes passam de zero ou muitos pedidos para zero ou um; cada pedido passa a ter zero ou um cliente.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Uma conexão SQLite está com a aplicação de chaves estrangeiras desativada. Há uma referência declarada, mas uma linha órfã é aceita. O que precisa mudar para que gravações futuras possam contar com essa restrição?
  1. Tornar o identificador pai uma coluna de texto.
  2. Ordenar as linhas filhas pela chave estrangeira.
  3. Habilitar chaves estrangeiras apenas na consulta de relatório.
  4. Habilitar chaves estrangeiras na conexão antes das gravações.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Seis contas têm os valores de cidade “Miami”, NULL, “Dallas”, “Miami”, NULL e “Boise”. Quantas passam por WHERE NOT (city = 'Miami') OR city IS NULL?
  1. 2
  2. 3
  3. 6
  4. 4
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma tabela SQLite define a INTEGER NOT NULL, b INTEGER NOT NULL, PRIMARY KEY (a, b) e q INTEGER NOT NULL CHECK (q > 0). Não há linhas. Qual linha proposta satisfaz todas essas restrições?
  1. a = 2, b = NULL, q = 3
  2. a = 2, b = 5, q = 0
  3. a = 2, b = 5, q = 3
  4. a = 2, b = 5, q = NULL
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

O projeto 31 tem as tarefas 7 e 9 por meio de uma chave estrangeira project_id que permite NULL, com ON DELETE SET NULL. A nota 4 faz referência à tarefa 7 por meio de uma chave estrangeira imposta com ON DELETE CASCADE. Depois que o projeto 31 é excluído, a tarefa 7 é excluída. O que resta da tarefa 9 e da nota 4?
  1. A tarefa 9 permanece com project_id NULL; a nota 4 é excluída.
  2. A tarefa 9 permanece com project_id 31; a nota 4 é excluída.
  3. A tarefa 9 é excluída; a nota 4 permanece vinculada à tarefa 7.
  4. A tarefa 9 permanece com project_id NULL; a nota 4 permanece.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Travou em uma questão sua? Ajuda com Tarefas

Termos-Chave

76 Termos-Chave, cada um com sua definição

A

Ação referencial
Uma ação referencial especifica como uma chave estrangeira trata a exclusão de uma linha pai referenciada ou a alteração de sua chave, por exemplo bloqueando ou propagando a operação em cascata.
ON DELETE SET NULL mantém as linhas filhas, mas remove sua referência à linha pai, então essa referência deve permitir NULL.
Afinidade de tipo
A afinidade de tipo do SQLite é uma preferência pelo tipo de armazenamento de uma coluna, com tentativas de conversão e valores armazenados flexíveis.
Uma coluna inteira comum do SQLite pode manter abc como texto quando a conversão para inteiro falha.

B

Banco de dados
Um banco de dados é uma coleção organizada de dados relacionados que podem ser pesquisados, atualizados e compartilhados.
Um banco de dados de loja mantém registros de clientes, produtos e pedidos juntos para vários aplicativos.
Banco de dados relacional
Um banco de dados relacional usa tabelas: colunas descrevem propriedades e linhas descrevem registros.
Uma loja mantém pedidos em uma tabela e usa identificadores de clientes para fazer referência a uma tabela separada de clientes.

C

Caminho de referências entre chaves
Um caminho de referências entre chaves é uma sequência de referências declaradas seguida entre tabelas para conectar um registro inicial às informações necessárias para uma resposta.
Para encontrar a cidade de um pedido, siga seu customer_id até uma linha de cliente e leia a cidade nessa linha.
Cardinalidade da tabela
A cardinalidade de uma tabela é o número de linhas que ela contém atualmente, que muda quando registros são adicionados ou removidos.
Uma tabela de clientes da loja que atualmente contém quatro registros tem cardinalidade de tabela igual a quatro.
Cardinalidade do relacionamento
A cardinalidade do relacionamento descreve quantas linhas de cada lado de um vínculo podem se relacionar com uma linha do outro lado.
Um cliente pode ter muitos pedidos, enquanto cada pedido da loja deve fazer referência a exatamente um cliente.
Carga de trabalho analítica (OLAP)
Uma carga de trabalho analítica resume muitos registros armazenados para comparar totais ou padrões.
Um relatório mensal compara vendas entre regiões lendo os registros armazenados de muitas compras.
Carga de trabalho transacional (OLTP)
Uma carga de trabalho transacional registra eventos cotidianos por meio de pequenas leituras e gravações.
Um sistema de ingressos registra cada reserva e pagamento enquanto clientes compram assentos ao longo do dia.
Centavos armazenados como inteiros
Centavos armazenados como inteiros representam um valor como uma quantidade inteira da menor unidade de centavo da moeda, oferecendo armazenamento exato para moedas baseadas em centavos.
Um preço de R$ 12,50 no SQLite pode ser armazenado como 1250 centavos e formatado em reais para exibição.
Chave alternativa
Uma chave alternativa é uma chave candidata não escolhida como chave primária, geralmente imposta pela combinação de valores obrigatórios com unicidade.
O e-mail obrigatório e único de uma conta pode continuar sendo uma chave alternativa junto com um account_id gerado.
Chave candidata
Uma chave candidata é uma superchave mínima: seus valores identificam uma linha de forma única e remover qualquer componente eliminaria essa garantia.
Um e-mail de funcionário obrigatório e único pode ser uma chave candidata mesmo quando employee_id se torna a chave primária.
Chave composta
Uma chave composta identifica linhas por uma combinação de colunas cujos valores completos devem ser únicos, mesmo que partes individuais se repitam.
Aluno, curso e período juntos identificam uma matrícula quando um aluno pode cursar novamente um curso mais tarde.
Chave estrangeira
Uma chave estrangeira é uma coluna ou combinação cujas referências diferentes de NULL devem corresponder a uma chave primária pai existente ou a uma chave única adequada.
Várias linhas de pedido podem conter customer_id 1, cada uma fazendo referência ao mesmo registro único de cliente.
Chave natural
Uma chave natural usa um identificador do elemento do mundo real que está sendo registrado, como um número de identificação de veículo ou código de estado.
Uma tabela de estados pode usar um state_code de duas letras como chave primária legível em registros de endereço.
Chave primária
Uma chave primária é a chave candidata escolhida como identificador principal das linhas de uma tabela, com valores únicos e diferentes de NULL, podendo ter várias colunas.
A tabela de clientes usa customer_id como chave primária para que pedidos possam fazer referência a um cliente específico.
Chave substituta (chave artificial)
Uma chave substituta é um identificador criado apenas para distinguir linhas de banco de dados, como um inteiro gerado sem significado de negócio.
Um customer_id permanece fixo quando o cliente muda de endereço de e-mail, telefone ou sobrenome.
Código de moeda
Um código de moeda é um rótulo padronizado de três letras que identifica a moeda de um valor, como USD, EUR ou JPY.
Duas linhas que contêm 20 podem representar valores diferentes se uma estiver identificada como USD e a outra como EUR.
Código numérico
Um código numérico é um identificador escrito com dígitos cuja finalidade é servir de rótulo, de modo que zeros iniciais e outras características de formatação podem ter significado.
O CEP americano 02108 precisa de armazenamento como texto para manter o zero inicial quando o valor é lido novamente.
Coluna (atributo ou campo)
Uma coluna (atributo ou campo) é uma propriedade nomeada, com tipo definido, compartilhada por todas as linhas.
A coluna city contém um valor de cidade, ou NULL quando permitido, para cada registro de cliente.

D

Dados
Dados são fatos registrados, como nomes, datas ou valores.
Um serviço de entregas registra como dados o peso, o destino e a data de envio de uma encomenda.
Dados estruturados
Dados estruturados compartilham campos definidos e nomeados, mesmo quando alguns valores estão ausentes.
Todas as linhas de pedido têm as mesmas colunas, incluindo uma data de envio que pode ser NULL antes do envio.
Diagrama do esquema
Um diagrama do esquema exibe tabelas existentes, suas colunas e vínculos de chave em caixas e linhas, muitas vezes mostrando quantidades permitidas nos relacionamentos.
Uma linha liga orders.customer_id à chave de cliente, tornando visível a referência de pedidos a clientes.
Diagrama entidade-relacionamento (DER)
Um diagrama entidade-relacionamento representa entidades e relacionamentos do negócio durante o projeto, que podem ser posteriormente transformados em tabelas.
Diagramas no estilo Chen podem desenhar atributos como ovais e relacionamentos como losangos em vez de caixas de tabelas.
Dialeto SQL
Um dialeto SQL é o conjunto de sintaxe, tipos e recursos adicionais da SQL suportados por um produto.
O SQLite usa LIMIT 10 para limitar um resultado, enquanto o SQL Server normalmente usa TOP 10.
Dicionário de dados
Um dicionário de dados documenta significados de colunas, unidades e regras de negócio que os tipos e restrições de uma tabela não expressam por completo.
A documentação explica se um shipped_date NULL significa que o pedido não foi enviado ou que uma data foi perdida.
Domínio
Um domínio é o conjunto de valores permitidos para uma coluna, descrito por seu tipo de dados e quaisquer restrições adicionais.
Um domínio de quantidade pode exigir números inteiros maiores que zero, excluindo quantidades negativas de estoque.

E

Escala
A escala de DECIMAL(p, s) é s, o número de dígitos após a vírgula decimal, que determina sua precisão fracionária.
Uma escala de dois fornece duas casas decimais, como necessário para preços expressos em reais e centavos.
Esquema do banco de dados
Um esquema de banco de dados descreve a estrutura de tabelas, colunas, tipos de dados, chaves e restrições que determinam quais registros são permitidos.
Adicionar uma nova coluna de instruções de entrega altera o esquema, mesmo antes de qualquer instrução ser armazenada.

F

Formato de data ISO
O formato de data ISO escreve uma data do calendário como ano-mês-dia, fornecendo uma representação sem ambiguidade, como 2026-03-02.
Texto de data ISO consistente no SQLite é ordenado conforme o calendário, diferentemente do texto de exibição dos EUA que começa pelo mês.

G

Grau
O grau de uma tabela é seu número de colunas, uma propriedade de sua estrutura.
Adicionar a data de nascimento de um cliente como uma nova coluna aumenta o grau da tabela de clientes.

Í

Índice
Um índice é uma estrutura de busca que ajuda um SGBD a encontrar linhas correspondentes.
Um índice de chave primária ajuda o sistema a localizar um registro de cliente em uma tabela que contém milhões de registros.

I

Identificador gerado
Um identificador gerado é um valor de chave fornecido automaticamente pelo banco de dados, com sintaxe que varia entre produtos de banco de dados.
O INTEGER PRIMARY KEY do SQLite fornece um inteiro quando uma nova linha omite o identificador.
Identificador universalmente único (UUID)
Um UUID é um identificador de 128 bits normalmente escrito com 36 caracteres, que permite geração independente com risco muito baixo de colisão.
Dispositivos separados podem gerar UUIDs antes que seus novos registros sejam combinados em um banco de dados.
Independência de dados
A independência de dados separa a estrutura lógica das tabelas usada pelos aplicativos da organização física dos dados armazenados pelo SGBD.
O SGBD pode reorganizar páginas em disco enquanto os aplicativos continuam fazendo referência às mesmas colunas nomeadas.
Instância do banco de dados
Uma instância de banco de dados, no sentido de esquema em comparação com dados, é a coleção de valores armazenados em um determinado momento.
Adicionar um novo pedido altera a instância atual, mantendo inalterada a definição de sua tabela.
Integridade referencial
A integridade referencial é a regra segundo a qual referências de chave estrangeira impostas e diferentes de NULL correspondem a linhas pai existentes, mantendo os vínculos válidos.
Uma restrição imposta de pedido para cliente rejeita um pedido para o cliente 99 quando esse cliente não existe.
IS NULL
IS NULL é o teste SQL que retorna verdadeiro quando uma entrada está ausente, permitindo encontrar essas linhas sem uma comparação de igualdade.
A condição phone IS NULL identifica clientes cujos telefones não foram registrados.
Item do pedido
Um item do pedido é um registro de um produto dentro de um pedido, que contém informações da combinação, como quantidade e preço unitário cobrado.
Duas canecas em um pedido podem ser representadas por um item com quantidade 2 e o preço registrado por caneca.

J

Junção (join)
Uma junção combina dados relacionados associando valores entre tabelas, automatizando o processo de seguir chaves usado em uma busca manual.
Uma busca de cliente associa orders.customer_id a customers.customer_id para chegar à cidade correta.

L

Linguagem de definição de dados (DDL)
Instruções de DDL criam, alteram ou removem estruturas de banco de dados, como tabelas.
Adicionar uma nova coluna de data de entrega altera a estrutura, então pertence à definição de dados.
Linguagem de manipulação de dados (DML)
Instruções de DML leem ou alteram linhas armazenadas, incluindo inserções, atualizações e exclusões.
Registrar um novo pedido acrescenta dados; isso não cria outra coluna nem altera a estrutura da tabela.
Linha (tupla ou registro)
Uma linha (tupla ou registro) contém as entradas de um elemento para todas as colunas da tabela.
Em uma tabela de clientes, a linha de um cliente chamado Wei Chen contém seu identificador, nome, cidade e as outras propriedades de cliente.
Linha órfã
Uma linha órfã é um registro filho cuja referência diferente de NULL não tem uma linha pai correspondente, deixando seu suposto relacionamento sem correspondência.
Um pedido que faz referência a um cliente excluído seria uma linha órfã se nenhuma restrição imposta o impedisse.
Lógica de três valores
A lógica de três valores combina resultados TRUE, FALSE e UNKNOWN, considerando condições que envolvem valores ausentes no banco de dados.
TRUE OR UNKNOWN é TRUE porque a condição verdadeira já faz com que a condição OR combinada seja satisfeita.

M

Mecanismo de banco de dados embarcado
Um mecanismo de banco de dados embarcado é executado dentro de um aplicativo como uma biblioteca, sem um servidor separado.
Um aplicativo de desktop pode usar SQLite para ler e gravar um arquivo local de banco de dados que contém seus registros.

N

NOT NULL
NOT NULL é uma restrição que exige que uma entrada da coluna esteja presente, rejeitando NULL sem verificar, por si só, se o valor é positivo ou se o texto não está vazio.
Uma data de pedido pode ser obrigatória enquanto a data de envio continua permitindo NULL até que o envio ocorra.
Notação pé de galinha
A notação pé de galinha marca extremidades de relacionamentos com círculos, barras e pés de três pontas para mostrar quantidades mínimas e máximas de linhas vinculadas.
Um círculo e um pé junto a pedidos permitem que um cliente tenha zero ou mais linhas de pedido relacionadas.
NULL
NULL é o marcador de um valor ausente no banco de dados, que pode ser desconhecido, ainda não disponível ou não aplicável àquele registro.
A data de envio de um pedido pode ser NULL porque ele não foi enviado, enquanto sua data de pedido está registrada.

P

Precisão
A precisão de DECIMAL(p, s) é p, o número total de dígitos disponíveis nas partes inteira e fracionária de um valor.
Em DECIMAL(8, 2), oito dígitos no total deixam espaço para seis antes da vírgula e dois depois dela.
Propagação em cascata
Uma propagação em cascata transmite a exclusão de uma linha pai ou a alteração de sua chave às linhas filhas que fazem referência a ela, conforme a ação de chave estrangeira declarada.
Excluir um pedido pode se propagar em cascata para seus itens porque essas linhas filhas pertencem ao pedido.

R

Relacionamento autorreferente
Um relacionamento autorreferente vincula papéis dentro de uma tabela por meio de uma chave estrangeira que faz referência a uma chave nessa mesma tabela.
O manager_id de um funcionário aponta para outra linha de funcionário, com NULL para uma pessoa que não tem gerente.
Relacionamento muitos para muitos
Um relacionamento muitos para muitos permite que linhas de ambos os lados se vinculem a várias linhas do outro lado, sendo representado por uma tabela de combinações.
Um pedido contém vários produtos, e um produto pode aparecer em muitos pedidos diferentes.
Relacionamento opcional
Um relacionamento opcional permite que um vínculo esteja ausente, frequentemente representado por uma chave estrangeira que permite NULL e um mínimo de zero na extremidade da tabela pai.
Um pedido sem cupom pode manter coupon_id como NULL enquanto outros pedidos fazem referência a cupons existentes.
Relacionamento um para muitos
Um relacionamento um para muitos permite que uma linha pai seja vinculada a várias linhas filhas, cada uma contendo uma chave estrangeira para sua linha pai.
A referência ao gerente de um funcionário pode se repetir porque vários funcionários podem compartilhar um gerente.
Relacionamento um para um
Um relacionamento um para um permite no máximo uma linha correspondente de cada lado, geralmente imposto por uma chave estrangeira que também é única.
Um perfil pode usar user_id como chave primária e também como chave estrangeira, impedindo um segundo perfil para um usuário.
Restrição
Uma restrição é uma regra declarada que limita os dados permitidos, como unicidade, valores obrigatórios ou referências válidas entre tabelas.
Uma restrição de quantidade positiva rejeita um item de pedido com zero unidades, embora zero seja um inteiro.
Restrição CHECK
Uma restrição CHECK rejeita uma linha se sua condição for FALSE, mas um resultado UNKNOWN decorrente de NULL não rejeita a linha por si só.
Uma quantidade positiva obrigatória usa NOT NULL junto com CHECK (quantity > 0) para atender às duas regras.

S

Sistema cliente-servidor
Em um sistema cliente-servidor, clientes enviam solicitações a um servidor que gerencia e retorna dados.
Um site e uma ferramenta de relatórios podem se conectar ao mesmo servidor PostgreSQL por uma rede.
Sistema de gerenciamento de banco de dados (SGBD)
Um SGBD é um software que gerencia bancos de dados, impõe regras e controla o acesso.
Quando o PostgreSQL gerencia um banco de dados de loja, o software é distinto dos registros de clientes armazenados nele.
SQL
SQL é a linguagem declarativa padrão para bancos de dados relacionais, com dialetos específicos de cada produto.
Uma ferramenta de relatórios envia uma solicitação SQL ao PostgreSQL para recuperar os registros de clientes necessários.
Superchave
Uma superchave é uma coluna ou conjunto de colunas cujos valores combinados identificam cada linha de forma única, mesmo quando inclui colunas desnecessárias.
Se employee_id é único, combiná-lo com departamento ainda identifica o funcionário, mas acrescenta uma coluna extra.

T

Tabela (relação)
Uma tabela (relação) contém informações sobre um tipo de elemento em colunas nomeadas e linhas individuais.
A tabela de produtos registra cada item que a loja oferece usando colunas como nome e preço.
Tabela associativa (tabela de junção)
Uma tabela associativa registra combinações por meio de chaves estrangeiras para duas tabelas, muitas vezes usando sua combinação como chave primária.
Cada linha de order_items vincula um pedido a um produto e registra a quantidade e o preço unitário cobrado.
Tabelas pai e filha
Uma tabela pai fornece uma chave referenciada; uma tabela filha armazena a chave estrangeira que aponta para essa tabela pai, possivelmente muitas vezes.
Clientes é a tabela pai e pedidos é a tabela filha quando cada pedido armazena o identificador de seu cliente.
Tipo booleano
Um tipo booleano representa informações verdadeiras ou falsas, com NULL disponível para informação ausente, a menos que uma restrição o proíba.
Um indicador in_stock registra se um item está disponível; sua forma exata de armazenamento varia conforme o SGBD.
Tipo de caracteres
Um tipo de caracteres armazena texto, como nomes ou códigos; seu comprimento e comportamento de comparação dependem de sua declaração e do sistema de banco de dados.
Um código de produto como MUG-11-BLU deve ser armazenado como texto porque é um rótulo, não uma quantidade.
Tipo de ponto flutuante
Um tipo de ponto flutuante armazena números binários aproximados, permitindo um amplo intervalo numérico e introduzindo pequenas diferenças de arredondamento decimal.
Uma temperatura medida pode usar um tipo de ponto flutuante quando pequenos erros de representação são aceitáveis.
Tipo decimal exato
Um tipo decimal exato armazena valores de base dez sem aproximação binária em sistemas que oferecem esse suporte, como PostgreSQL.
Um preço no PostgreSQL declarado como DECIMAL(8, 2) armazena valores exatos em reais e centavos dentro de seu intervalo.
Tipo inteiro
Um tipo inteiro armazena números inteiros dentro de um intervalo suportado, sendo adequado para contagens, quantidades e muitos identificadores gerados.
A quantidade de luminárias em um pedido é uma contagem inteira, diferentemente de seu peso medido.
Transação
Uma transação agrupa alterações de modo que todas sejam salvas juntas ou todas sejam desfeitas.
Uma transferência subtrai dinheiro de uma conta e o adiciona a outra dentro da mesma transação.

U

UNKNOWN
UNKNOWN é o terceiro resultado lógico da SQL, produzido quando uma comparação depende de informação ausente e não pode ser determinada como verdadeira ou falsa.
state <> 'TX' é UNKNOWN para um cliente cujo estado é NULL, então WHERE omite essa linha.

V

Valor atômico
Um valor atômico é um valor para a finalidade de uma coluna, em vez de uma lista de valores separados que precisam ser processados independentemente.
Um campo de telefone que contém dois números separados por vírgula contém uma lista onde se espera um valor de telefone.
Valor do item do pedido
O valor do item do pedido é o custo das unidades em um item, calculado a partir de sua quantidade e do preço unitário registrado para aquela venda.
Duas canecas a R$ 12,50 contribuem com R$ 25,00 para o total do pedido antes de os demais itens serem somados.
Valor padrão
Um valor padrão é fornecido quando uma nova linha omite o valor de uma coluna, enquanto outras restrições continuam governando o valor armazenado.
Uma coluna de status com DEFAULT 'pending' registra “pending” quando a nova linha deixa o status não especificado.
Visão (view)
Uma visão é uma consulta salva usada como uma tabela; uma visão comum não tem linhas de resultado armazenadas próprias.
Uma visão de vendas pode apresentar colunas selecionadas de pedidos enquanto os registros subjacentes permanecem em suas tabelas.

Sobre esta aula

Por StudeliRelatar um erro

Crie seus próprios Materiais de Estudo

Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.

Começar