You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
11 KiB
190 lines
11 KiB
# Trabalhar com Dados: Bases de Dados Relacionais
|
|
|
|
| ](../../sketchnotes/05-RelationalData.png)|
|
|
|:---:|
|
|
| Trabalhar com Dados: Bases de Dados Relacionais - _Sketchnote por [@nitya](https://twitter.com/nitya)_ |
|
|
|
|
É provável que já tenha usado uma folha de cálculo no passado para armazenar informação. Tinha um conjunto de linhas e colunas, onde as linhas continham a informação (ou dados), e as colunas descreviam a informação (por vezes chamadas metadados). Uma base de dados relacional é construída sobre este princípio fundamental de colunas e linhas em tabelas, permitindo que tenha informação distribuída por várias tabelas. Isto permite trabalhar com dados mais complexos, evitar duplicação e ter flexibilidade na forma como explora os dados. Vamos explorar os conceitos de uma base de dados relacional.
|
|
|
|
## [Questionário pré-aula](https://ff-quizzes.netlify.app/en/ds/quiz/8)
|
|
|
|
## Tudo começa com tabelas
|
|
|
|
Uma base de dados relacional tem no seu núcleo tabelas. Tal como numa folha de cálculo, uma tabela é uma coleção de colunas e linhas. A linha contém os dados ou informação com que queremos trabalhar, como o nome de uma cidade ou a quantidade de precipitação. As colunas descrevem os dados que armazenam.
|
|
|
|
Vamos começar a nossa exploração criando uma tabela para armazenar informação sobre cidades. Podemos começar com o seu nome e país. Poderia armazenar isto numa tabela da seguinte forma:
|
|
|
|
| Cidade | País |
|
|
| -------- | ------------- |
|
|
| Tóquio | Japão |
|
|
| Atlanta | Estados Unidos|
|
|
| Auckland | Nova Zelândia |
|
|
|
|
Repare que os nomes das colunas **cidade**, **país** e **população** descrevem os dados armazenados, e cada linha tem informação sobre uma cidade.
|
|
|
|
## As limitações de uma abordagem com uma única tabela
|
|
|
|
É provável que a tabela acima lhe pareça relativamente familiar. Vamos começar a adicionar alguns dados adicionais à nossa base de dados em crescimento - precipitação anual (em milímetros). Vamos focar-nos nos anos 2018, 2019 e 2020. Se adicionássemos para Tóquio, poderia ficar algo assim:
|
|
|
|
| Cidade | País | Ano | Quantidade |
|
|
| ------ | ----- | ---- | ---------- |
|
|
| Tóquio | Japão | 2020 | 1690 |
|
|
| Tóquio | Japão | 2019 | 1874 |
|
|
| Tóquio | Japão | 2018 | 1445 |
|
|
|
|
O que nota sobre a nossa tabela? Pode notar que estamos a duplicar o nome e o país da cidade repetidamente. Isso pode ocupar bastante espaço de armazenamento, e é largamente desnecessário ter múltiplas cópias. Afinal, Tóquio tem apenas um nome que nos interessa.
|
|
|
|
OK, vamos tentar outra coisa. Vamos adicionar novas colunas para cada ano:
|
|
|
|
| Cidade | País | 2018 | 2019 | 2020 |
|
|
| -------- | ------------- | ---- | ---- | ---- |
|
|
| Tóquio | Japão | 1445 | 1874 | 1690 |
|
|
| Atlanta | Estados Unidos| 1779 | 1111 | 1683 |
|
|
| Auckland | Nova Zelândia | 1386 | 942 | 1176 |
|
|
|
|
Embora isto evite a duplicação das linhas, adiciona alguns outros desafios. Teríamos de modificar a estrutura da nossa tabela cada vez que há um novo ano. Além disso, à medida que os nossos dados crescem, ter os anos como colunas torna mais difícil recuperar e calcular valores.
|
|
|
|
É por isso que precisamos de múltiplas tabelas e relações. Ao dividir os nossos dados podemos evitar duplicação e ter mais flexibilidade na forma como trabalhamos com os dados.
|
|
|
|
## Os conceitos de relações
|
|
|
|
Vamos voltar aos nossos dados e determinar como queremos dividir as coisas. Sabemos que queremos armazenar o nome e país das nossas cidades, por isso isto provavelmente funcionará melhor numa tabela.
|
|
|
|
| Cidade | País |
|
|
| -------- | ------------- |
|
|
| Tóquio | Japão |
|
|
| Atlanta | Estados Unidos|
|
|
| Auckland | Nova Zelândia |
|
|
|
|
Mas antes de criarmos a próxima tabela, precisamos de descobrir como referenciar cada cidade. Precisamos de alguma forma de identificador, ID ou (em termos técnicos de base de dados) uma chave primária. Uma chave primária é um valor usado para identificar uma linha específica numa tabela. Embora isto possa basear-se num valor em si (poderíamos usar o nome da cidade, por exemplo), deve quase sempre ser um número ou outro identificador. Não queremos que o id mude alguma vez pois isso quebraria a relação. Na maioria dos casos, a chave primária ou id será um número auto-gerado.
|
|
|
|
> ✅ Chave primária é frequentemente abreviada como PK
|
|
|
|
### cidades
|
|
|
|
| city_id | Cidade | País |
|
|
| ------- | -------- | ------------- |
|
|
| 1 | Tóquio | Japão |
|
|
| 2 | Atlanta | Estados Unidos|
|
|
| 3 | Auckland | Nova Zelândia |
|
|
|
|
> ✅ Vai notar que usamos os termos "id" e "chave primária" de forma intercambiável durante esta lição. Os conceitos aqui aplicam-se a DataFrames, que irá explorar mais tarde. DataFrames não usam a terminologia de "chave primária", no entanto vai notar que se comportam de forma muito semelhante.
|
|
|
|
Com a nossa tabela de cidades criada, vamos armazenar a precipitação. Em vez de duplicar a informação completa sobre a cidade, podemos usar o id. Também devemos garantir que a tabela recém-criada tem uma coluna *id*, pois todas as tabelas devem ter um id ou chave primária.
|
|
|
|
### precipitação
|
|
|
|
| rainfall_id | city_id | Ano | Quantidade |
|
|
| ----------- | ------- | ---- | ---------- |
|
|
| 1 | 1 | 2018 | 1445 |
|
|
| 2 | 1 | 2019 | 1874 |
|
|
| 3 | 1 | 2020 | 1690 |
|
|
| 4 | 2 | 2018 | 1779 |
|
|
| 5 | 2 | 2019 | 1111 |
|
|
| 6 | 2 | 2020 | 1683 |
|
|
| 7 | 3 | 2018 | 1386 |
|
|
| 8 | 3 | 2019 | 942 |
|
|
| 9 | 3 | 2020 | 1176 |
|
|
|
|
Repare na coluna **city_id** dentro da tabela recém-criada **precipitação**. Esta coluna contém valores que referenciam os IDs na tabela **cidades**. Em termos técnicos de dados relacionais, isto chama-se uma **chave estrangeira**; é uma chave primária de outra tabela. Pode simplesmente pensar nela como uma referência ou um apontador. **city_id** 1 referencia Tóquio.
|
|
|
|
> [!NOTE]
|
|
> Chave estrangeira é frequentemente abreviada como FK
|
|
|
|
## Recuperar os dados
|
|
|
|
Com os nossos dados separados em duas tabelas, pode estar a perguntar-se como os recuperamos. Se estivermos a usar uma base de dados relacional como MySQL, SQL Server ou Oracle, podemos usar uma linguagem chamada Structured Query Language ou SQL. SQL (por vezes pronunciado sequel) é uma linguagem padrão usada para recuperar e modificar dados numa base de dados relacional.
|
|
|
|
Para recuperar dados usa o comando `SELECT`. Na sua essência, você **seleciona** as colunas que quer ver **da** tabela onde estão contidas. Se quisesse mostrar apenas os nomes das cidades, poderia usar o seguinte:
|
|
|
|
```sql
|
|
SELECT city
|
|
FROM cities;
|
|
|
|
-- Output:
|
|
-- Tokyo
|
|
-- Atlanta
|
|
-- Auckland
|
|
```
|
|
|
|
`SELECT` é onde lista as colunas, e `FROM` é onde lista as tabelas.
|
|
|
|
> [!NOTE]
|
|
> A sintaxe SQL não diferencia maiúsculas de minúsculas, o que significa que `select` e `SELECT` significam o mesmo. No entanto, dependendo do tipo de base de dados que está a usar, as colunas e tabelas podem ser sensíveis a maiúsculas e minúsculas. Como resultado, é uma boa prática tratar tudo em programação como se fosse sensível a maiúsculas e minúsculas. Ao escrever consultas SQL, a convenção comum é colocar as palavras-chave em letras maiúsculas.
|
|
|
|
A consulta acima vai mostrar todas as cidades. Imagine que só queremos mostrar cidades na Nova Zelândia. Precisamos de algum tipo de filtro. A palavra-chave SQL para isto é `WHERE`, ou "onde algo é verdadeiro".
|
|
|
|
```sql
|
|
SELECT city
|
|
FROM cities
|
|
WHERE country = 'New Zealand';
|
|
|
|
-- Output:
|
|
-- Auckland
|
|
```
|
|
|
|
## Juntar dados
|
|
|
|
Até agora recuperámos dados de uma única tabela. Agora queremos juntar os dados das tabelas **cidades** e **precipitação**. Isto é feito *juntando* as tabelas. Vai efetivamente criar uma ligação entre as duas tabelas, e associar os valores de uma coluna de cada tabela.
|
|
|
|
No nosso exemplo, vamos associar a coluna **city_id** em **precipitação** com a coluna **city_id** em **cidades**. Isto vai associar o valor da precipitação com a sua respetiva cidade. O tipo de junção que vamos fazer chama-se *inner* join, o que significa que se alguma linha não corresponder a nada da outra tabela, não será mostrada. No nosso caso, todas as cidades têm precipitação, por isso tudo será mostrado.
|
|
|
|
Vamos recuperar a precipitação de 2019 para todas as nossas cidades.
|
|
|
|
Vamos fazer isto em passos. O primeiro passo é juntar os dados indicando as colunas para a ligação - **city_id** como destacado antes.
|
|
|
|
```sql
|
|
SELECT cities.city
|
|
rainfall.amount
|
|
FROM cities
|
|
INNER JOIN rainfall ON cities.city_id = rainfall.city_id
|
|
```
|
|
|
|
Destacámos as duas colunas que queremos, e o facto de querermos juntar as tabelas pela **city_id**. Agora podemos adicionar a instrução `WHERE` para filtrar apenas o ano de 2019.
|
|
|
|
```sql
|
|
SELECT cities.city
|
|
rainfall.amount
|
|
FROM cities
|
|
INNER JOIN rainfall ON cities.city_id = rainfall.city_id
|
|
WHERE rainfall.year = 2019
|
|
|
|
-- Output
|
|
|
|
-- city | amount
|
|
-- -------- | ------
|
|
-- Tokyo | 1874
|
|
-- Atlanta | 1111
|
|
-- Auckland | 942
|
|
```
|
|
|
|
## Resumo
|
|
|
|
Bases de dados relacionais centram-se em dividir a informação entre múltiplas tabelas que depois são reunidas para exibição e análise. Isto proporciona um elevado grau de flexibilidade para realizar cálculos e manipular dados de outras formas. Viu os conceitos fundamentais de uma base de dados relacional, e como realizar uma junção entre duas tabelas.
|
|
|
|
## 🚀 Desafio
|
|
|
|
Existem inúmeras bases de dados relacionais disponíveis na internet. Pode explorar os dados usando as competências que aprendeu acima.
|
|
|
|
## Questionário pós-aula
|
|
|
|
## [Questionário pós-aula](https://ff-quizzes.netlify.app/en/ds/quiz/9)
|
|
|
|
## Revisão & Autoestudo
|
|
|
|
Existem vários recursos disponíveis em [Microsoft Learn](https://docs.microsoft.com/learn?WT.mc_id=academic-77958-bethanycheum) para continuar a sua exploração de SQL e conceitos de bases de dados relacionais
|
|
|
|
- [Descrever conceitos de dados relacionais](https://docs.microsoft.com//learn/modules/describe-concepts-of-relational-data?WT.mc_id=academic-77958-bethanycheum)
|
|
- [Começar a consultar com Transact-SQL](https://docs.microsoft.com//learn/paths/get-started-querying-with-transact-sql?WT.mc_id=academic-77958-bethanycheum) (Transact-SQL é uma versão de SQL)
|
|
- [Conteúdo SQL no Microsoft Learn](https://docs.microsoft.com/learn/browse/?products=azure-sql-database%2Csql-server&expanded=azure&WT.mc_id=academic-77958-bethanycheum)
|
|
|
|
## Tarefa
|
|
|
|
[Exibir dados de aeroportos](assignment.md)
|
|
|
|
---
|
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
|
**Aviso Legal**:
|
|
Este documento foi traduzido utilizando o serviço de tradução automática [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, por favor tenha em conta que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se a tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações erradas decorrentes do uso desta tradução.
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER END --> |