https://github.com/kadraknb/mysql-one-for-all
Normalizando uma tabela na terceira forma normal e acesse as informações desta tabela através de queries utilizando SQL.
https://github.com/kadraknb/mysql-one-for-all
backend database docker mysql sql
Last synced: 3 months ago
JSON representation
Normalizando uma tabela na terceira forma normal e acesse as informações desta tabela através de queries utilizando SQL.
- Host: GitHub
- URL: https://github.com/kadraknb/mysql-one-for-all
- Owner: kadraknb
- Created: 2022-11-21T03:03:20.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2023-06-01T05:59:40.000Z (about 3 years ago)
- Last Synced: 2025-03-17T18:18:43.509Z (over 1 year ago)
- Topics: backend, database, docker, mysql, sql
- Language: JavaScript
- Homepage:
- Size: 529 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Boas vindas ao repositório do projeto One For All!
## 🛠 Tecnologias
- Docker
- SQL
## 📪 Contato
- Email: [vagner_cardoso_s@outlook.com](vagner_cardoso_s@outlook.com)
- GitHub: [kadraknb](https://github.com/kadraknb)
- LinkedIn: [vagner-cardos-santos](https://www.linkedin.com/in/vagner-cardos-santos/)
# SUMÁRIO
- [Boas vindas ao repositório do projeto One For All!](#boas-vindas-ao-repositório-do-projeto-one-for-all)
- [SUMÁRIO](#sumário)
- [Habilidades](#habilidades)
- [Desenvolvido](#desenvolvido)
- [Problema](#problema)
- [Normalize as tabelas para a 3ª Forma Normal](#normalize-as-tabelas-para-a-3ª-forma-normal)
- [Implementações técnicas](#implementações-técnicas)
- [Requisitos do projeto](#requisitos-do-projeto)
- [Desafio 1](#desafio-1)
- [Desafio 2](#desafio-2)
- [Desafio 3](#desafio-3)
- [Desafio 4](#desafio-4)
- [Desafio 5](#desafio-5)
- [Desafio 6](#desafio-6)
- [Desafio 7](#desafio-7)
- [Desafio 8](#desafio-8)
- [Desafio 9](#desafio-9)
- [Desafio 10](#desafio-10)
- [Desafio 11](#desafio-11)
---
# Habilidades
Neste projeto, verificamos se voce é capaz de:
* Modelar um banco de dados
* Identificar entidades, atributos e relacionamentos
* Aplicar a 1ª, 2ª e 3ª Forma Normal
* Criar tabelas
---
# Desenvolvido
No projeto One For All, eu usarei uma tabela para revisar e consolidar todos os principais conceitos vistos até o momento.
Eu receberei uma tabela não normalizada, a qual deverá ser normalizada e populada, para que eu possa executar queries sobre ela com o intuito de encontrar as informações solicitadas
Eu normalizarei uma tabela na terceira forma normal e acessarei as informações desta tabela através de queries utilizando SQL.
## Problema
Eu receberei uma tabela não normalizada semelhante ao que poderia ser uma versão simplificada do banco de dados do Spotify. O trabalho consistirá de duas partes:
1. Normalizar essa tabela, criar o schema no meu banco de dados local e populá-lo;
2. Realizar os desafios no meu banco normalizado e populado.
**Aviso:** Todos os dados da tabela abaixo são fictícios e foram gerados aleatoriamente através de ferramentas, com o intuito de deixar o projeto mais real para vocês 😉. Quaisquer similaridades com informações reais são meras coincidências.
**Observação:** O banco de dados real do Spotify é muito mais completo e complexo que o mostrado abaixo. No entanto, use APENAS as informações passadas e solicitadas aqui. Não crie dados que não foram solicitados.
## Normalize as tabelas para a 3ª Forma Normal
Abaixo você pode visualizar e baixar uma planilha com as tabelas que deverão ser normalizadas:

[Faça o download dela aqui](./SpotifyClone-Non-NormalizedTable.xlsx)
Antes de tudo, você deverá modelar e normalizar essas tabelas para a 3° Forma Normal. Monte quantas planilhas e tabelas forem necessárias para criar essa versão normalizada, desde que você siga as regras de negócio. Não é necessário criar o código SQL neste momento.
**Embora não seja necessário, é recomendado que você crie suas planilhas na sequência 1ª -> 2ª -> 3ª Forma Normal**.
Caso haja dúvidas, consulte o material já passado até hoje para te auxiliar.
Seu banco de dados deve seguir as regras de negócio e ser capaz de recuperar:
* Informações sobre quais planos estão disponíveis e seus detalhes;
* Cada pessoa usuária pode possuir apenas um plano.
* Informações sobre todas as pessoas artistas;
* Uma pessoa artista pode ter vários álbuns;
* Uma pessoa artista pode ser seguida por várias pessoas usuárias.
* Informações sobre todos os álbuns de cada artista;
* Para fins deste projeto, considere que cada álbum possui apenas uma pessoa artista como principal;
* Cada álbum possui várias canções.
* Informações sobre todas as canções de cada álbum;
* Para fins deste projeto, considere que cada canção está contida em apenas um álbum.
* Informações sobre todas as pessoas usuárias, seus planos, seu histórico de reprodução e pessoas artistas seguidas.
* Uma pessoa usuária pode possuir apenas um plano;
* Cada música do histórico de reprodução pode aparecer uma única vez por pessoa (para simplificar, considere que o objetivo do histórico é saber **quais** canções já foram reproduzidas e **não quantas vezes** foram reproduzidas);
* Uma pessoa usuária pode seguir várias pessoas artistas, mas cada pessoa artista pode ser seguida apenas uma vez por pessoa usuária.
---
## Implementações técnicas
Algumas coisas devem seguir um padrão pré-estabelecido para que os testes de correção funcionem adequadamente:
1. Ao modelar o banco de dados no [desafio 1](#desafio-1):
* Quando for preciso que uma `coluna_a` referencie uma coluna `coluna_b` em outra tabela, é **necessário** que na `coluna_a` haja restrição de foreign key e que `coluna_b` seja uma primary key;
2. **Todos** os desafios que pedirem para criar uma query **devem** possuir no seu arquivo `.sql` correspondente **somente** a query solicitada.
3. Para executar localmente os testes, é preciso escrever o seguinte no seu terminal:
```sh
MYSQL_USER= MYSQL_PASSWORD= HOSTNAME= PORT= npm test
```
* Ou seja, suponha que para poder acessar a base de dados feita neste projeto você tenha `root` como seu nome de pessoa usuária, `password` como senha, `localhost` como host e `1337` como porta. Logo, você executaria:
```sh
MYSQL_USER=root MYSQL_PASSWORD=password HOSTNAME=localhost PORT=1337 npm test
```
* Usando o exemplo anterior de base, suponha que você não tenha setado uma senha para `root` e esteja usando a porta padrão (3306). Neste caso, você executaria:
```sh
MYSQL_USER=root MYSQL_PASSWORD= HOSTNAME=localhost PORT= npm test
```
**Dica**: variáveis de ambiente definidas na mesma linha do comando valem apenas para aquele comando. Se preferir, você pode exportar as variáveis de ambiente para toda a _sessão_ (todos os comandos até você fechar aquele terminal). Por exemplo:
```sh
export MYSQL_USER=root MYSQL_PASSWORD=password HOSTNAME=localhost PORT=1337
```
E depois disso você só precisa rodar `npm test` quando for testar os projetos.
⚠️ **Dica**: O avaliador espera que a versão do MySQL seja a 5.7. Em caso de erro nos testes, verifique se essa é a versão que está sendo usada por você.⚠️
⚠️ **Dica**: Caso queira utilizar _Docker_ para rodar os testes localmente, basta executar o comando: ⚠️
```sh
docker run --name meu-mysql-5_7 -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql:5.7
```
O que está sendo feito
> :point_right: ideia geral:
- Baixa e executa uma imagem _docker_ do MySQL na versão 5.7.
> :point_right: flag --name:
- Define um nome para o nosso _container_: "meu-mysql-5_7".
> :point_right: flag -e:
- Define definimos a nossa variável de ambiente "MYSQL_ROOT_PASSWORD" com o valor "1234".
> :point_right: flag -d:
- Define que o container rode em segundo plano.
> :point_right: flag -p:
- Mapeia uma porta local a uma porta do _container_.
> :point_right: mysql:5.7:
- Define qual versão da imagem mySQL queremos, no caso, a 5.7, que é a esperada pelo avaliador.
Utilizando o comando acima, para executar os testes localmente basta digitar no terminal:
```sh
MYSQL_USER=root MYSQL_PASSWORD=1234 HOSTNAME=localhost npm test
```
---
# Requisitos do projeto
⚠️**AVISO IMPORTANTE:**⚠️ Você deve escrever sua query manualmente, com o gerador automático de queries do Workbench o avaliador não funcionará corretamente!
## Desafio 1
* Crie um banco com o nome de **`SpotifyClone`**.
* Providencie as queries necessárias para criar tabelas normalizadas que atendam aos requisitos descritos na seção anterior;
* Providencie as queries necessárias para popular as tabelas de acordo com os dados listados na seção anterior;
* Crie um arquivo de configurações `desafio1.json`, que mapeará em qual tabela e coluna se encontram as informações necessárias para a avaliação automatizada deste desafio. As configurações devem possuir o seguinte formato:
```json
{
"coluna_usuario": "nome-da-coluna",
"tabela_que_contem_usuario": "nome-da-tabela-que-armazena-a-coluna",
"coluna_plano": "nome-da-coluna",
"tabela_que_contem_plano": "nome-da-tabela-que-armazena-a-coluna",
"coluna_historico_de_reproducoes": "nome-da-coluna",
"tabela_que_contem_historico_de_reproducoes": "nome-da-tabela-que-armazena-a-coluna",
"coluna_seguindo_artistas": "nome-da-coluna",
"tabela_que_contem_seguindo_artistas": "nome-da-tabela-que-armazena-a-coluna",
"coluna_artista": "nome-da-coluna",
"tabela_que_contem_artista": "nome-da-tabela-que-armazena-a-coluna",
"coluna_album": "nome-da-coluna",
"tabela_que_contem_album": "nome-da-tabela-que-armazena-a-coluna",
"coluna_cancoes": "nome-da-coluna",
"tabela_que_contem_cancoes": "nome-da-tabela-que-armazena-a-coluna"
}
```
Essa configuração deve ser feita baseada no seu banco de dados **após a normalização**. Ou seja, se você criou uma tabela chamada `users` que possui a coluna `name`, você substituiria `"coluna_usuario"` e `"tabela_que_contem_usuario"` da seguinte forma:
```json
{
"coluna_usuario": "name",
"tabela_que_contem_usuario": "users",
...
}
```
* Salve as queries criadas no arquivo `desafio1.sql`. Seu código deverá ser similar ao seguinte:
```sql
DROP DATABASE IF EXISTS SpotifyClone;
CREATE DATABASE SpotifyClone;
CREATE TABLE SpotifyClone.tabela1(
coluna1 tipo restricoes,
coluna2 tipo restricoes,
colunaN tipo restricoes,
) engine = InnoDB;
CREATE TABLE SpotifyClone.tabela2(
coluna1 tipo restricoes,
coluna2 tipo restricoes,
colunaN tipo restricoes,
) engine = InnoDB;
INSERT INTO SpotifyClone.tabela1 (coluna1, coluna2)
VALUES
('exemplo de dados 1', 'exemplo de dados A'),
('exemplo de dados 2', 'exemplo de dados B'),
('exemplo de dados 3', 'exemplo de dados C');
INSERT INTO SpotifyClone.tabela2 (coluna1, coluna2)
VALUES
('exemplo de dados 1', 'exemplo de dados X'),
('exemplo de dados 2', 'exemplo de dados Y');
```
O que será verificado:
- Será validado se os planos estão na tabela normalizada.
- Será validado se o histórico de reprodução está na tabela normalizada.
- Será validado se as informações sobre pessoas seguindo artistas estão na tabela normalizada.
- Será validado se os álbuns estão na tabela normalizada.
- Será validado se os canções estão na tabela normalizada.
- Será validado se as informações sobre pessoas usuárias estão na tabela normalizada.
- Será validado se as informações sobre pessoas artistas estão na tabela normalizada.
⚠️ Note que uma vez executado um teste, a sua base de dados `SpotifyClone` **será dropada**. Logo, **se atente** a salvar seu progresso nos arquivos de desafio! ⚠️
---
## Desafio 2
Crie uma `QUERY` que exiba três colunas:
1. A primeira coluna deve exibir a quantidade total de canções. Dê a essa coluna o alias "**cancoes**".
2. A segunda coluna deve exibir a quantidade total de artistas e deverá ter o alias "**artistas**".
3. A terceira coluna deve exibir a quantidade de álbuns e deverá ter o alias "**albuns**".
Sua `QUERY` deve retornar a seguinte informação:

O que será verificado:
- Será validado se existe uma `QUERY` que exibe os dados corretos nas colunas `cancoes`, `artistas` e `albuns`.
---
## Desafio 3
Crie uma `QUERY` que deverá ter apenas três colunas:
1. A primeira coluna deve possuir o alias "**usuario**" e exibir o nome da pessoa usuária.
2. A segunda coluna deve possuir o alias "**qtde_musicas_ouvidas**" e exibir a quantidade de músicas ouvida pela pessoa com base no seu histórico de reprodução.
3. A terceira coluna deve possuir o alias "**total_minutos**" e exibir a soma dos minutos ouvidos pela pessoa usuária com base no seu histórico de reprodução.
Os resultados devem estar agrupados pelo nome da pessoa usuária e ordenados em ordem alfabética.
Sua `QUERY` deve retornar a seguinte informação:

O que será verificado:
- Será validado se existe uma `QUERY` que exibe os dados corretos nas colunas `usuario`, `qtde_musicas_ouvidas` e `total_minutos`.
- Será validado se as colunas estão ordenadas de forma correta.
---
## Desafio 4
Crie uma `QUERY` que deve mostrar as pessoas usuárias que estavam ativas no ano de **2021** se baseando na data mais recente no histórico de reprodução.
1. A primeira coluna deve possuir o alias "**usuario**" e exibir o nome da pessoa usuária.
2. A segunda coluna deve ter o alias "**condicao_usuario**" e exibir se a pessoa usuária está ativa ou inativa.
O resultado deve estar ordenado em ordem alfabética.
Sua `QUERY` deve retornar a seguinte informação:

O que será verificado:
- Será validado se existe uma `QUERY` que exibe os dados corretos nas colunas `usuario` e `condicao_usuario`.
- Será validado se as colunas estão ordenadas de forma correta.
---
## Desafio 5
Estamos fazendo um estudo das músicas mais tocadas e precisamos saber quais são as duas músicas mais tocadas no momento. Crie uma `QUERY` que possua duas colunas:
1. A primeira coluna deve possuir o alias "**cancao**" e exibir o nome da canção.
2. A segunda coluna deve possuir o alias "**reproducoes**" e exibir a quantidade de pessoas que já escutaram a canção em questão.
Seu resultado deve estar ordenado em ordem decrescente, baseando-se no número de reproduções. Em caso de empate, ordene os resultados pelo nome da canção em ordem alfabética. Queremos apenas o top 2 de músicas mais tocadas.
Sua `QUERY` deve retornar a seguinte informação:

O que será verificado:
- Será validado se existe uma `QUERY` que exibe os dados corretos nas colunas `cancao` e `reproducoes`.
- Será validado se as colunas estão ordenadas de forma correta.
---
## Desafio 6
Tendo como base o valor dos planos e o plano que cada pessoa usuária cadastrada possui no banco, queremos algumas informações sobre o faturamento da empresa. Crie uma `QUERY` que deve exibir quatro dados:
1. A primeira coluna deve ter o alias "**faturamento_minimo**" e exibir o menor valor de plano existente para uma pessoa usuária.
2. A segunda coluna deve ter o alias "**faturamento_maximo**" e exibir o maior valor de plano existente para uma pessoa usuária.
3. A terceira coluna deve ter o alias "**faturamento_medio**" e exibir o valor médio dos planos possuídos por pessoas usuárias até o momento.
4. Por fim, a quarta coluna deve ter o alias "**faturamento_total**" e exibir o valor total obtido com os planos possuídos por pessuas usuárias.
Para cada um desses dados, por se tratarem de valores monetários, deve-se arredondar o faturamento usando apenas duas casas decimais.
Sua `QUERY` deve retornar a seguinte informação:

O que será verificado:
- Será validado se existe uma `QUERY` que exibe os dados corretos nas colunas `faturamento_minimo`, `faturamento_maximo`, `faturamento_medio` e `faturamento_total`.
---
## Desafio 7
Mostre uma relação de todos os álbuns produzidos por cada pessoa artista, com a quantidade de seguidores que ela possui, de acordo com os detalhes a seguir. Para tal, crie uma `QUERY` com as seguintes colunas:
1. A primeira coluna deve exibir o nome da pessoa artista, com o alias "**artista**".
2. A segunda coluna deve exibir o nome do álbum, com o alias "**album**".
3. A terceira coluna deve exibir a quantidade de pessoas seguidoras que aquela pessoa artista possui e deve possuir o alias "**seguidores**".
Seus resultados devem estar ordenados de forma decrescente, baseando-se no número de pessoas seguidoras. Em caso de empate no número de pessoas, ordene os resultados pelo nome da pessoa artista em ordem alfabética e caso há artistas com o mesmo nome, ordene os resultados pelo nome do álbum alfabeticamente.
Sua `QUERY` deve retornar a seguinte informação:

O que será verificado:
- Será validado se existe uma `QUERY` que exibe os dados corretos nas colunas `artista`, `album` e `seguidores`.
- Será validado se as colunas estão ordenadas de forma correta.
---
## Desafio 8
Mostre uma relação dos álbuns produzidos por um artista específico, neste caso `"Walter Phoenix"`.
Para isto crie uma `QUERY` que o retorno deve exibir as seguintes colunas:
1. O nome da pessoa artista, com o alias "**artista**".
2. O nome do álbum, com o alias "**album**".
Os resultados devem ser ordenados pelo nome do álbum em ordem alfabética.
Sua `QUERY` deve retornar a seguinte informação:

O que será verificado:
- Será validado se a `QUERY` retorna a coluna `artista` contendo o nome da pessoa artista e a coluna `album` contendo o nome do album.
- Será validado se as colunas estão ordenadas de forma correta.
---
## Desafio 9
Crie uma `QUERY` que exibe a quantidade de músicas que estão presentes atualmente no histórico de reprodução de uma pessoa usuária específica. Para este caso queremos saber quantas músicas estão no histórico do usuário `"Bill"` e a consulta deve retornar a seguinte coluna:
1. O valor da quantidade, com o alias "**quantidade_musicas_no_historico**".
Sua `QUERY` deve retornar a seguinte informação:

O que será verificado:
- Será validado se a `QUERY`, retorna a quantidade correta de canções presentes no histórico de reprodução da pessoa especificada.
---
## Desafio 10
Crie uma `QUERY` que exiba o nome e a quantidade de vezes que cada canção foi tocada por pessoas usuárias do plano gratuito ou pessoal, de acordo com os detalhes a seguir:
* A primeira coluna deve exibir o nome da canção, com o alias "**nome**";
* A segunda coluna deve exibir a quantidade de pessoas que já escutaram aquela canção, com o alias "**reproducoes**";
* Seus resultados devem estar agrupados pelo nome da canção e ordenados em ordem alfabética.
Sua `QUERY` deve retornar a seguinte informação:

O que será verificado:
- Será validado se existe uma `QUERY` que exibe os dados corretos nas colunas `nome` e `reproducoes`.
- Será validado se as colunas estão ordenadas de forma correta.
---
## Desafio 11
Crie uma `QUERY` que altere o nome de algumas músicas e as ordene em ordem alfabética com as colunas abaixo se baseando nos seguintes critérios:
1. O nome da música em seu estado normal com o alias **nome_musica**
2. O nome da música atualizado com o alias **novo_nome**
**Critérios**
- Trocar a palavra **"Streets"** no final do nome de uma música por **"Code Review"**
- Trocar a palavra **"Her Own"** no final do nome de uma música por **"Trybe"**
- Trocar a palavra **"Inner Fire"** no final do nome de uma música por **"Project"**
- Trocar a palavra **"Silly"** no final do nome de uma música por **"Nice"**
- Trocar a palavra **"Circus"** no final do nome de uma música por **"Pull Request"**
Sua `QUERY` retornar a seguinte informação:

O que será verificado:
- Será validado se existe uma `QUERY` que exibe os dados corretos nas colunas `nome_musica` e `novo_nome`.
- Será validado se as colunas estão ordenadas de forma correta.
---