Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Módulo V - Capítulo 3 - Estruturando um  banco de dados

03_estruturando_um_banco_de_dados.livemd

Módulo V - Capítulo 3 - Estruturando um  banco de dados

Instalando o PostgreSQL

Todos os exemplos utilizados nesse documento serão executados utilizando o PostgreSQL como banco de dados, portanto caso deseje instalar o mesmo na sua maquina ou utilizar um container com o mesmo siga os guias abaixo:

Via docker-compose

Para instalar o docker e docker-compose siga os guias em:

Caso já tenha instalado o docker e docker-compose crie um arquivo docker-compose.yml e insira o código abaixo:

version: "3"

volumes:
  postgres_volume:
    driver: local

services:
  postgres:
    image: postgres:13-alpine
    ports:
      - 5432:5432
    volumes:
      - postgres_volume:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres

Após isso apenas execute docker-compose up -d para subir o container.

Instalando dependências

Vamos utilizar uma lib chamada postgrex para executar queries e conectar no banco de dados.

Mix.install([{:postgrex, "~> 0.15"}], force: true)

Conectando ao banco de dados

Com a dependência instalada agora precisamos inicializar o processo do postgrex com as configurações necessárias para conectar ao banco de dados.

opts = [
  hostname: "postgres",
  username: "postgres",
  password: "postgres",
  database: "postgres",
  port: 5432
]

{:ok, pid} = Postgrex.start_link(opts)

Criando as tabelas (CREATE TABLE)

Antes de começarmos a criar as tabelas vamos relembrar como ficou nosso modelo de avaliadores e filmes.

entity-relation-model

Podemos começar criando as cada uma das tabelas com seus respectivos parametros.

Para a criação das tabelas utilizaremos os seguintes comandos DDL.

Criando a tabela de filmes

Postgrex.query(
  pid,
  "CREATE TABLE movie (id SERIAL NOT NULL, title varchar NOT NULL, director varchar DEFAULT 'Desconhecido', year integer NOT NULL, CONSTRAINT unique_movie_id UNIQUE (id))",
  []
)

Criando a tabela de avaliadores

Postgrex.query(
  pid,
  "CREATE TABLE reviewer (id SERIAL NOT NULL, name varchar NOT NULL, CONSTRAINT unique_reviewer_id UNIQUE (id))",
  []
)

Criando a tabela de avaliações

Postgrex.query(
  pid,
  "CREATE TABLE rating (movie_id integer, reviewer_id integer, inserted_at date, stars integer, CONSTRAINT unique_review_id UNIQUE (movie_id, reviewer_id))",
  []
)

Alterando as tabelas (ALTER TABLE)

Para criar a relação entre as tabelas de filmes e avaliadores com a tabela de avaliação vamos precisar alterar nossas tabelas e criar uma chave estrangeira.

Podemos também evitar que uma avaliação receba mais de 5 estrelas.

Para isso ainda utilizaremos os seguintes comandos DDL.

Criando relacionamento entre avaliações e filmes

Postgrex.query(
  pid,
  "ALTER TABLE rating ADD FOREIGN KEY (movie_id) REFERENCES movie(id)",
  []
)

Criando relacionamento entre avaliações e avaliadores

Postgrex.query(
  pid,
  "ALTER TABLE rating ADD FOREIGN KEY (reviewer_id) REFERENCES reviewer(id)",
  []
)

Limitando o número de estrelas possíveis

Postgrex.query(
  pid,
  "ALTER TABLE rating ADD CHECK (stars <= 5)",
  []
)

Removendo uma tabela (DROP TABLE)

Para que possamos exemplificar como é possível se apagar uma tabela vamos criar uma tabela que não será utilizada em nosso modelo.

Assim como anteriormente utilizaremos comandos DDL.

Criando uma tabela de séries

Postgrex.query(
  pid,
  "CREATE TABLE series (id SERIAL, name varchar);",
  []
)

Deletando a tabela que acabamos de criar

Postgrex.query(
  pid,
  "DROP TABLE series;",
  []
)