Banco de dados

Os principais SGBDs NoSQL

No artigo anterior, falamos sobre os principais SGBDs relacionais. Neste, abordaremos os principais SGBDs não-relacionais ou, simplesmente, NoSQL.

Antes de prosseguirmos…

Data Base Management System ou Sistema de Gerenciamento de Banco de Dados (SGBD) são um conjunto de softwares utilizados para o gerenciamento de uma base de dados, tendo como principal objetivo gerenciar as bases de dados utilizadas por aplicações clientes e remover esta responsabilidade das mesmas.

São responsáveis por controlar, acessar, organizar e proteger as informações de uma aplicação. Os SGBDs são divididos em dois grupos: Relacionais e não relacionais. Aqui em nosso blog também já possuímos um artigo sobre SQL vs NoSQL.

SGBDS relacionais são banco de dados que modelam os dados no formato de tabelas, que podem se relacionar entre si. Cada tabela pode possuir diversos atributos, com diversos tipos de dados.

Já os SGBDs NoSQL (Not Only SQL) é o termo utilizado para banco de dados não-relacionais de alto desempenho, onde geralmente não é utilizado o SQL como linguagem de consulta. Estes bancos utilizam diversos modelos de dados incluindo documentos, gráficos, chave-valor e colunares. São amplamente reconhecidos pela facilidade em seu desenvolvimento, desempenho escalável, alta disponibilidade e resiliência.

E são justamente sobre os SGBDs não-relacionais que falaremos neste artigo, trazendo alguns deles e suas principais características.

MongoDB

De código aberto, multiplataforma e lançado em 2009, o MongoDB é considerado um “líder” no quesito SGBD NoSQL.

É um banco de dados orientado a documentos, baseado no formato JSON (JavaScript Object Notation) e possui uma curva de aprendizagem baixíssima.

Dentre suas principais características, podemos citar:

  • Totalmente gratuito;
  • Possui uma baixa curva de aprendizagem, como dito acima;
  • Fácil escalabilidade horizontal;
  • Multiplataforma;
  • Suporte para transações ACID multi-documento;
  • Consultas suportam funções JavaScript personalizadas, entre outros.

É um SGBD muito utilizado tanto por pequenas quanto por grandes empresas, como mostra em seu site, como: Facebook, Ebay, Google, Adobe, entre outras.

Para realizar seu download, basta clicar aqui, onde é possível encontrar toda sua documentação e suporte.

Curso de
CONHEÇA O CURSO

Redis

Redis é o banco de dados de valores-chave mais popular do mundo, ou seja, seus dados são armazenados em forma de chave valor, que armazenam objetos indexados por chaves e possibilitam a busca por estes objetos a parte das mesmas.

É escrito utilizando a linguagem de programação C, porém, compatível com várias outras linguagens de programação como: Java, Python, PHP, C++, entre outras. Extremamente rápido, tanto para escrita como para leitura de dados, pois seus dados são armazenados na memória, seus comandos são executados anatomicamente e possui modelo cliente-servidor.

Criado por Salvatore Sanfiippo, foi liberado de forma open-source em 2009 (um acrônimo de REmote DIctionary Server (servidor de dicionário remoto)).

Seu download pode ser feito acessando o seu site onde é possível também acessar toda documentação, comunidade, comandos, suporte, entre outras funções.

De suas principais características, podemos citar:

  • Desempenho muito rápido;
  • Multiplataforma;
  • Estruturas de dados na memória;
  • Versatilidade e facilidade de uso;
  • Replicação e persistência;
  • Compatibilidade com a sua linguagem de desenvolvimento preferencial, entre outros.

Cassandra

Desenvolvido em Java, gratuito e multiplataforma, o Cassandra originalmente foi desenvolvido no Facebook, que em 2008 compartilhou seu código-fonte para a comunidade e, agora, é um projeto de sistema de banco de dados mantido pelos desenvolvedores da fundação Apache e por muitas outras empresas que se tornaram colaboradores (Apache Cassandra).

Dentre suas características, podemos destacar:

  • Altamente escalável;
  • Fornece acesso de baixa latência a clientes;
  • Gratuito;
  • Orientado por colunas (o que torna um banco de dados mais rápido);
  • Possui um modelo distribuído otimizado e descentralizado, entre outros.

No site, é possível realizar seu download, visualizar sua documentação, acompanhar as novidades em seu blog, etc.

Curso de
CONHEÇA O CURSO

Para finalizar

Com o objetivo de gerenciar informações, em especial, recuperar informações diluídas em um grande volume de dados, a escolha de um SGBD é de suma importância dentro de uma organização, onde tarefas podem ser simplificadas e automatizadas, auxiliando assim em soluções impostas no dia a dia de uma empresa.

Desta forma, dentre as diversas são as opções de SGDS presentes no mercado, tanto open source quanto pagas de alto nível, conhecer o negócio e entender qual sua real necessidade é um fator de extrema importância na escolha de um SGBD, visando sempre o futuro de uma organização para que este, atenda tanto às necessidades atuais quanto futuras.

Os principais SGBDs relacionais

Data Base Management System ou Sistema de Gerenciamento de Banco de Dados (SGBD) são um conjunto de software utilizados para o gerenciamento de uma base de dados, tendo como principal objetivo gerenciar as bases de dados utilizadas por aplicações clientes e remover esta responsabilidade das mesmas.

São responsáveis por controlar, acessar, organizar e proteger as informações de uma aplicação.

Os tipos de SGBDs

Existem dois tipos de SDBDs: Os relacionais e os não-relacionais (NoSQL).

  • Relacionais – Os SGBDS relacionais são banco de dados que modelam os dados no formato de tabelas, que podem se relacionar entre si. Cada tabela pode possuir diversos atributos, com diversos tipos de dados.

  • Não-relacionais (NoSQL) – NoSQL (Not Only SQL) é o termo utilizado para banco de dados não relacionais de alto desempenho, onde geralmente não é utilizado o SQL como linguagem de consulta. Estes bancos utilizam diversos modelos de dados incluindo documentos, gráficos, chave-valor e colunares. São amplamente reconhecidos pela facilidade em seu desenvolvimento, desempenho escalável, alta disponibilidade e resiliência.

Aqui em nosso blog já possuímos um artigo sobre SQL vs NoSQL, onde você poderá ver maiores diferenças entre esses tipos de SGBDs.

Os principais SGBDs relacionais do mercado

MySQL

O MySQL é um sistema de gerenciamento de banco de dados que utiliza a linguagem SQL como interface. Lançado sobre a licença GPL, atualmente é mantida pela Oracle Corporation. É multiplataforma, ou seja, possui suporte para diferentes sistemas operacionais (Windows, Linux e Mac).

Curso de
CONHEÇA O CURSO

É, sem dúvidas, o SGBD mais popular do mundo, tendo como clientes grandes empresas como: Google, PayPal, Cisco, Netflix, Uber, GitHub, entre outras.

Tem como principais vantagens:

  • É gratuito;
  • Open source;
  • Como já dissemos acima, é multiplataforma;
  • Possui uma comunidade ativa;
  • Pode ser utilizado em qualquer tipo de aplicação (das mais simples às mais robustas);
  • Facilidade de programação e aprendizado.

Para instalar, basta acessar o site e realizar o download.

Aqui no blog possuímos um artigo bem legal que aborda os primeiros passos com o MySQL que vale a pena conferir.

OracleDB

O mais utilizado em aplicações corporativas, o OracleDB é o SGBD comercializado pela Oracle Corporation, lançado em meados dos anos 70. É multiplataforma e possui licença comercial.

Curso de
CONHEÇA O CURSO

O download pode ser feito acessando o site, onde também encontramos toda sua documentação e suporte.

Como vantagens do Oracle, podemos citar:

  • Padronização e consistência entre as diferentes versões do Oracle SQL;
  • Compartilhamento de recursos;
  • Flexibilidade de gerenciamento e contenção de custos;
  • Estabilidade;
  • Suporte, entre outros.

SQLServer

Desenvolvido pela Microsoft, o Microsoft SQL Server é o Sistema de Gerenciamento de Banco de Dados desenvolvido para os sistemas operacionais Windows e Linux.

Curso de
CONHEÇA O CURSO

Possui licença proprietária e é um SGBD que atende desde as demandas mais simples até as mais complexas. Dentre suas principais vantagens podemos listar:

  • Excelente suporte para recuperação de dados;
  • Inclui softwares de gestão de banco de dados tanto para nível profissional quanto empresarial;
  • Permite a criação de tabelas relacionadas;
  • Gerenciamento de buffers;
  • Permite que vários clientes usem o mesmo banco de dados simultaneamente;
  • Controle de simultaneidade otimista (permite que uma nova versão de uma linha seja criada sempre que a linha é atualizada em vez de sobrescrevê-la).

Em seu site é possível acessar toda sua documentação, comunidade e realizar o download.

MariaBD

Lançado em 2009, o MariaBD é um SGBD multiplataforma sobre a licença GNU GPL (Licença pública geral).

Surgiu tendo como base o MySQL, desenvolvido também pelo seu próprio fundador. Como vantagens, podemos citar:

  • Compatibilidade com o MySQL;
  • Segurança;
  • Velocidade;
  • Menor exigência do hardware;
  • Entrega atualizações de segurança constantemente;
  • É totalmente gratuito;
  • Faz replicação de dados entre servidores;
  • Apresenta menor quantidade de falhas e bugs;
  • Execução paralela de consultas, entre outros.

Seu download e documentação podem ser vistos acessando o seu site.

PostegreSQL

Open source, sob a licença BSD e multiplataforma, o PostegreSQL é um dos SGBDs mais avançados do mercado.

Curso de
CONHEÇA O CURSO

Dentre suas principais vantagens, podemos citar:

  • Altamente escalável;
  • Possui uma comunidade ativa;
  • Suporte a diversas linguagens de programação;
  • Robusto;
  • Flexibilidade ao utilizar stored procedure;
  • Alta performance, entre outros.

O download poderá ser realizado acessando o seu site, onde você também encontrará toda documentação, comunidade, suporte, entre outros.

Afinal, qual SGBD utilizar em meu projeto?

Acima pudemos ver alguns dos SGBDs relacionais e algumas de suas características. Desta forma, seguem algumas dicas que podem te ajudar na hora de escolher qual SGBD utilizar em seu projeto:

  • Analisar as principais características de cada SGBD;
  • Conhecer o seu negócio e saber quais as necessidades que o SGBD deve suprir;
  • Se existem profissionais especialistas em um determinado SGBD que irão trabalhar no projeto;
  • Analisar os custos do projeto, entre outros.

Primeiros passos com MySQL

No artigo anterior vimos os principais comandos SQL (DQL, DDL e DML).

Neste artigo estaremos utilizando os comandos abordados no artigo anterior para criarmos o nosso primeiro banco de dados MySQL utilizando o terminal.

Entenda o que é SQL

SQL ou Structured Query Language (Linguagem de Consulta Estruturada) é uma linguagem padrão de gerenciamento de dados que interage com os principais bancos de dados baseados no modelo relacional. Alguns dos principais sistemas que utilizam SQL são: Oracle, PostgreSQL, Firebird, MySQL, entre outros.

Sendo assim, utilizando a linguagem SQL, os desenvolvedores podem ter uma comunicação com o banco de dados de maneira simples e ágil a partir dos seus comandos.

Curso de
CONHEÇA O CURSO

Agora, você precisa entender o que é o MySQL

MySQL é um sistema de gerenciamento de banco de dados (SGBD) que utiliza a linguagem SQL como interface.

Lançado sobre a licença GPL, possui como desenvolvedor a Oracle Corporation. É multiplataforma, ou seja, possui suporte para diferentes sistemas operacionais (Windows, Linux e Mac).

É, sem dúvidas, o SGBD mais popular do mundo, tendo como clientes grandes empresas como: Google, PayPal, Cisco, NetFlix, Uber, GitHub, entre outras.

Vantagens do MySQL

O MySQL possui diversas vantagens, fazendo com que este seja um dos principais SGBDs do mercado. Dentre estas vantagens, podemos citar:

  • É gratuito;
  • Open source;
  • Como já dissemos acima, é multiplataforma;
  • Possui uma comunidade ativa;
  • Pode ser utilizado em qualquer tipo de aplicação (das mais simples às mais robustas);
  • Facilidade de programação e aprendizado.

Instalando o MySQL

Agora já estamos prontos para iniciarmos o nosso primeiro banco de dados.

O primeiro passo é baixarmos o MySQL em nossa máquina. Para isso, acessamos o site do MySQL e realizaremos o seu download.

Ao acessar o link acima, o site reconhecerá o sistema operacional que você está utilizando, te dando a opção do download para o mesmo. Como estou utilizando o Windows, estarei realizando os passos a partir deste sistema operacional, mas lembramos que os passos são basicamente os mesmos para qualquer SO que você esteja utilizando.

A sua instalação segue o padrão das demais “Next”, se atentando apenas a alguns passos durante a mesma, como: Aceitar os termos de uso, informar o tipo de instalação, método de autenticação, criar sua senha do Root, aplicar as configurações e “Finish”. O banco de dados estará pronto para o uso! 🙂

Após a instalação, vamos começar?

Agora, abriremos seu CLI (Interface de linha de comando).

Logo de início, será necessário digitar a senha root definida no passo anterior (de instalação).

Pronto!

Após inserirmos a senha, nosso CLI estará pronto para utilizarmos os comandos SQL para criarmos o nosso banco de dados.

Desta forma, digitamos o seguinte comando:

CREATE DATABASE nome_do_banco;

Após criar o banco de dados, precisamos informar ao MySQL que este será utilizado. Para isso utilizamos o seguinte comando:

USE nome_do_banco;

Pronto!

Já criamos o nosso banco de dados e agora já estaremos prontos para o utilizarmos na criação da nossa primeira tabela.

Para isso, usaremos o comando abaixo:

CREATE TABLE usuario (id INT, nome VARCHAR (255), PRIMARY KEY(id));

Esta tabela terá dois campos, conforme podemos visualizar acima, que será o ID do usuário e seu nome.

Para que cada registro possua um identificador único no banco de dados, precisamos determinar que o ID da tabela usuário será uma PRIMARY KEY. Desta forma, não haverão usuários cadastrado no banco de dados com o mesmo ID.

Possuímos diversos tipos de dados no SQL, e eles podem ser:

  • Dados Strings: char, varchar, text, entre outros;
  • Dados numéricos: bit, smallint, int, float, entre outros;
  • Dados data: datetime, date, time, year, entre outros.

Neste exemplo utilizamos o INT, onde não é necessário declarar seu tamanho, já que o mesmo possui o tamanho fixo de 4 bytes e o VARCHAR de 255 caracteres.

Depois da criação da tabela, podemos inserir dados. Para isso utilizamos o comando abaixo:

INSERT INTO usuario (id, nome) VALUES (1, ‘Maria’);

Este comando irá inserir o registro com id = 1 e o nome = ‘Maria’. Perceba que dados do tipo VARCHAR, como o nome da tabela usuario, deverá ser inserido com uso de aspas simples.

  • Lembrando que podemos criar quantos usuários quisermos utilizando o comando descrito acima, conforme podemos ver na imagem abaixo:

Após inserirmos os usuários na tabela, utilizamos o comando SELECT para listar os usuários do banco de dados.

Para isso, executamos o seguinte comando:

SELECT * FROM usuario;

O asterisco * representa que serão listados todos os dados pertencentes a esta tabela. Já o FROM será referente ao nome da tabela que os dados serão buscados.

Após utilizarmos o comando SELECT para trazer todos os usuários existentes na tabela, utilizaremos o comando UPDATE para alterarmos, por exemplo, o nome de um dos nossos usuários.

Desta forma, utilizaremos o seguinte comando:

UPDATE usuario SET nome = ‘Maria Silva’ WHERE id =1;

Ou seja, estaremos inserindo o sobrenome Silva ao nome Maria. O comando SET quer dizer justamente isso, “setar” o sobrenome ao usuário de id=1. É necessário inserirmos o “WHERE id=1”, pois haverá alteração somente no usuário de “Maria”.

Após utilizarmos o comando UPDATE acima, usaremos o comando DELETE para deletar um dos usuários da tabela. Desta forma, o comando utilizado será:

DELETE FROM usuario WHERE id =3;

Com isso, estaremos excluindo o usuário de id=3 que corresponde ao usuário de nome “Pedro”.

No comando a seguir, estaremos inserindo uma nova tabela em nosso banco de dados, e dessa vez, o comando responsável por essa alteração será o ALTER TABLE:

ALTER TABLE usuario ADD idade INT AFTER nome;

Ou seja, estaremos alterando a tabela de usuário, adicionando (ADD) o registro “idade” de dado inteiro (INT) após o registro nome.

Conforme podemos observar na imagem abaixo, os dados serão apresentados como NULL (nulo) até inserirmos novos dados a este registro.

Desta forma, podemos utilizar o comando abaixo para inserir as idades correspondentes aos nossos usuários:

UPDATE usuario SET idade = 50 WHERE id = 1;

Um outro comando muito utilizado é o DROP, responsável por remover tabelas do banco de dados ou o próprio banco de dados, como podemos ver abaixo.

Mapeando banco de dados existente com Django

O Django é um ótimo framework para iniciar um projeto completamente do zero, mas nem sempre este é nosso caso. Imagine que uma empresa pretende migrar uma aplicação legada (antiga) com 100 tabelas em seu banco de dados e escolhe o Django como sua nova tecnologia… Como faríamos para mapear todo o banco de dados (tabelas e relações) para nosso projeto? Parece algo cansativo e complicado, certo!? Bom, com o Django, isso pode ser mais fácil do que parece…

Banco de Dados

Para nosso exemplo, iremos utilizar um banco de dados com uma estrutura que armazena a lista de empregados de uma empresa e suas relações. Não vamos nos preocupar com a estrutura do banco de dados em si, o importante aqui é entender que teremos 6 tabelas com os seguintes campos:

Para criar o banco de dados acima em seu MySQL, precisamos baixar toda a sua estrutura no repositório encontrado no seguinte link:

Depois disso, vamos baixar seu código-fonte e salvar no Desktop do nosso computador. Depois de descompactado, utilizamos o terminal para incorporar o banco de dados teste para o MySQL presente em nossa máquina. Para isso, no terminal (ou CMD), utilizamos o seguinte comando:

mysql -u root -p < employees.sql

Lembrando que o “root” é o nome do usuário do banco de dados. Caso o seu seja diferente, informe-o na instrução acima 🙂

Depois disso, o banco employees será criado no MySQL:

Lembrando que o BD que utilizamos já virá populado, contendo mais de 300,000 empregados registrados. Situação parecida ao que descrevemos anteriormente:

Configurando aplicação

Após criar o banco de dados, estamos prontos para mapeá-lo em nosso projeto Django. Para isso, partiremos de uma aplicação “zerada”, apenas com o projeto e uma app criada. Além disso, precisamos instalar, obviamente, o Django e o mysqlclient em nossa virtualenv:


Além disso, precisamos configurar o projeto para se comunicar com o banco de dados que acabamos de importar. Para isso, no arquivo settings.py do nosso projeto, determinamos seus parâmetros de conexão:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'employees',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': '3306'
    }
}

Com isso, temos nossa aplicação criada e se comunicando com o banco de dados \o

Mapeando o banco de dados no Django

Depois de configurar a aplicação, chegou a hora tão esperada: mapear o banco de dados para nosso arquivo models.py 😀

Para isso, é muito simples (e você vai se impressionar com isso). Tudo que temos que fazer é abrir o terminal integrado do PyCharm e digitar o seguinte comando:

python manage.py inspectdb > nome_da_app.models.py

Lembrando que “nome_da_app” deve ser alterada pelo nome da sua app no projeto, hein!? 🙂

Após isso, no arquivo models.py da nossa aplicação, teremos o seguinte resultado:

from django.db import models


class Departments(models.Model):
    dept_no = models.CharField(primary_key=True, max_length=4)
    dept_name = models.CharField(unique=True, max_length=40)

    class Meta:
        managed = False
        db_table = 'departments'


class DeptEmp(models.Model):
    emp_no = models.ForeignKey('Employees', models.DO_NOTHING, db_column='emp_no', primary_key=True)
    dept_no = models.ForeignKey(Departments, models.DO_NOTHING, db_column='dept_no')
    from_date = models.DateField()
    to_date = models.DateField()

    class Meta:
        managed = False
        db_table = 'dept_emp'
        unique_together = (('emp_no', 'dept_no'),)


class DeptManager(models.Model):
    emp_no = models.ForeignKey('Employees', models.DO_NOTHING, db_column='emp_no', primary_key=True)
    dept_no = models.ForeignKey(Departments, models.DO_NOTHING, db_column='dept_no')
    from_date = models.DateField()
    to_date = models.DateField()

    class Meta:
        managed = False
        db_table = 'dept_manager'
        unique_together = (('emp_no', 'dept_no'),)


class Employees(models.Model):
    emp_no = models.IntegerField(primary_key=True)
    birth_date = models.DateField()
    first_name = models.CharField(max_length=14)
    last_name = models.CharField(max_length=16)
    gender = models.CharField(max_length=1)
    hire_date = models.DateField()

    class Meta:
        managed = False
        db_table = 'employees'


class Salaries(models.Model):
    emp_no = models.ForeignKey(Employees, models.DO_NOTHING, db_column='emp_no', primary_key=True)
    salary = models.IntegerField()
    from_date = models.DateField()
    to_date = models.DateField()

    class Meta:
        managed = False
        db_table = 'salaries'
        unique_together = (('emp_no', 'from_date'),)


class Titles(models.Model):
    emp_no = models.ForeignKey(Employees, models.DO_NOTHING, db_column='emp_no', primary_key=True)
    title = models.CharField(max_length=50)
    from_date = models.DateField()
    to_date = models.DateField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'titles'
        unique_together = (('emp_no', 'title', 'from_date'),)

Exatamente a mesma estrutura (com seus atributos e relacionamentos) presentes no banco de dados que incorporamos ao MySQL da nossa máquina. Bem legal, né!?

Imagine ter que mapear todas essas entidades, avaliando seus tipos de dados e relações… Seria um trabalho bem cansativo, concorda? Com o Django, um simples comando consegue resolver este problema 🙂

Agora, já estamos prontos para utilizar todo o poder do ORM do Django para manipular o banco de dados e, consequentemente, criar nossa nova aplicação \o

Relacionamento 1-1, 1-N e N-N com Django

No modelo relacional, existem três tipos de associação entre entidades (tabelas) distintas. Estas relações são utilizadas para mapear como as tabelas interagem entre si e podem ser classificadas de três formas: 1-1 (um para um), 1-N (um para muitos) e N-N (muitos para muitos).

Sendo assim, veremos neste artigo como funciona e como implementar os três tipos de relacionamento no Django.

Curso de
CONHEÇA O CURSO

Relacionamento 1-1

Assim como o próprio nome supõe, o relacionamento 1-1 define que um item de uma entidade só poderá se relacionar com um item de outra entidade. Por exemplo, supondo que temos as entidades Cliente e Endereço que se relacionam de forma 1-1, um cliente só poderá possuir um endereço, que também só pode estar relacionado a um cliente.

Para criar este tipo de relacionamento no Django, no arquivo models.py, precisamos criar um campo que armazene o ID do endereço na entidade cliente do tipo OneToOneField:

class Endereco(models.Model):
        # Definimos seus atributos

class Cliente(models.Model):
        # Definimos seus atributos
      endereco = models.OneToOneField(Endereco, on_delete=models.SET_NULL, null=True)

Desta forma, a classe Cliente irá armazenar o ID do Endereço que cada cliente possuirá. O código completo das classes Endereço e Cliente podem ser vistas abaixo:

class Endereco(models.Model):
    rua = models.CharField(max_length=200, null=False, blank=False)
    numero = models.IntegerField(null=False, blank=False)
    complemento = models.CharField(max_length=200, null=False, blank=False)
    bairro = models.CharField(max_length=50, null=False, blank=False)
    cidade = models.CharField(max_length=100, null=False, blank=False)
    pais = models.CharField(max_length=50, null=False, blank=False)

    def __str__(self):
        return self.rua

class Cliente(models.Model):
    SEXO_CHOICES = (
        ("F", "Feminino"),
        ("M", "Masculino"),
        ("N", "Nenhuma das opções")
    )

    nome = models.CharField(max_length=100, null=False, blank=False)
    data_nascimento = models.DateField(null=False, blank=False)
    email = models.EmailField(null=False, blank=False)
    profissao = models.CharField(max_length=50, null=False, blank=False)
    sexo = models.CharField(max_length=1, choices=SEXO_CHOICES, blank=False, null=False)
    endereco = models.OneToOneField(Endereco, on_delete=models.SET_NULL, null=True)

Após definir as classes acima, precisamos criar a migração para efetivar as alterações no banco de dados e, assim, criar as tabelas no banco de dados. Para isso, utilizamos os comandos abaixo:

python manage.py makemigrations

python manage.py migrate

Isso fará com que as tabelas sejam criadas no banco de dados com a seguinte estrutura:

Relacionamento 1N

O relacionamento 1N determina que um item de uma tabela pode se relacionar com vários itens de uma outra tabela. Continuando o exemplo acima, podemos determinar que um cliente pode realizar diversos pedidos em um restaurante, porém cada pedido só pode possuir um cliente atrelado a ele.

Para criar este relacionamento no Django, utilizamos um campo do tipo ForeignKey, como podemos ver abaixo:

class Pedido(models.Model):
    cliente = models.ForeignKey("Cliente", on_delete=models.CASCADE, related_name='pedidos')

Isso fará com que a tabela Pedidoarmazene o ID do cliente de cada relação. O código completo das classes Pedido e Cliente pode ser visto abaixo:

class Pedido(models.Model):
    STATUS_CHOICES = (
        ("P", "Pedido realizado"),
        ("F", "Fazendo"),
        ("E", "Saiu para entrega"),
    )
    cliente = models.ForeignKey("Cliente", on_delete=models.CASCADE, related_name='pedidos')
    observacoes = models.CharField(max_length=300, null=False, blank=False)
    data_pedido = models.DateTimeField(default=timezone.now)
    valor = models.FloatField(blank=False, null=False)
    status = models.CharField(max_length=1, choices=STATUS_CHOICES, blank=False, null=False)

    def __str__(self):
        return self.cliente.nome

class Cliente(models.Model):
    SEXO_CHOICES = (
        ("F", "Feminino"),
        ("M", "Masculino"),
        ("N", "Nenhuma das opções")
    )

    nome = models.CharField(max_length=100, null=False, blank=False)
    data_nascimento = models.DateField(null=False, blank=False)
    email = models.EmailField(null=False, blank=False)
    profissao = models.CharField(max_length=50, null=False, blank=False)
    sexo = models.CharField(max_length=1, choices=SEXO_CHOICES, blank=False, null=False)
    endereco = models.OneToOneField(Endereco, on_delete=models.SET_NULL, null=True)

Após definir as classes acima, precisamos criar a migração para efetivar as alterações no banco de dados e, assim, criar as tabelas no banco de dados. Para isso, utilizamos os comandos abaixo:

python manage.py makemigrations

python manage.py migrate

Isso fará com que as tabelas sejam criadas no banco de dados com a seguinte estrutura:

Agora, a tabela Pedido armazenará, além de todos os seus atributos, o ID do cliente. Assim, um cliente poderá estar relacionado a vários pedidos, porém um pedido só pode se relacionar com um único cliente.

Curso de
CONHEÇA O CURSO

Relacionamento NN

O relacionamento NN define que um item de uma tabela pode se relacionar com vários itens de uma outra tabela e vice-versa. Por exemplo, podemos determinar que um pedido pode possuir diversos produtos relacionados a ele, assim como um mesmo produto pode estar relacionado a diversos pedidos diferentes.

Para criar este tipo de relacionamento, utilizamos um campo do tipo ManyToManyField, como podemos ver abaixo:

class Produto(models.Model):
    nome = models.CharField(max_length=50, null=False, blank=False)
    descricao = models.CharField(max_length=200, null=False, blank=False)
    valor = models.FloatField(null=False, blank=False)

    def __str__(self):
        return self.nome

class Pedido(models.Model):
    STATUS_CHOICES = (
        ("P", "Pedido realizado"),
        ("F", "Fazendo"),
        ("E", "Saiu para entrega"),
    )
    cliente = models.ForeignKey("Cliente", on_delete=models.CASCADE, related_name='pedidos')
    observacoes = models.CharField(max_length=300, null=False, blank=False)
    data_pedido = models.DateTimeField(default=timezone.now)
    valor = models.FloatField(blank=False, null=False)
    status = models.CharField(max_length=1, choices=STATUS_CHOICES, blank=False, null=False)
    produtos = models.ManyToManyField(Produto)

    def __str__(self):
        return self.cliente.nome

Após definir as classes acima, precisamos criar a migração para efetivar as alterações no banco de dados e, assim, criar as tabelas no banco de dados. Para isso, utilizamos os comandos abaixo:

python manage.py makemigrations

python manage.py migrate

Isso fará com que as tabelas sejam criadas no banco de dados com a seguinte estrutura:

Para este tipo de relacionamento, uma tabela “auxiliar” será criada para armazenar os IDs do pedido e do produto que se relaciona.

A tabela clientes_pedido_produtosirá armazenar o id do pedido e o id do produto que fazem relação. Desta forma, um pedido pode se relacionar com diferentes produtos e um produto pode estar relacionado a diferentes pedidos.

Conclusão

Vimos neste artigo o quão simples é criar os três tipos de relacionamento em bancos de dados relacionais utilizando o ORM do Django. Com isso, agora podemos criar nossas aplicações e estruturar nosso banco de dados da melhor forma possível.

Como se tornar um DBA?

Você da área de TI que se interessa em banco de dados, provavelmente almeja um dia ser um DBA. Com tantos dados que são gerados a cada segundo, a profissão de administrador de banco de dados (DBA) torna-se necessária. Uma vez que ele faz com que os dados sejam armazenados de forma segura, resolve possíveis problemas, enfim, realiza muitas outras funções importantes.

E você, tem interesse na profissão? Será que você tem o perfil de um DBA?

O que é e como se tornar um DBA?

DBA vem de Database Administrator, ou seja, um administrador de banco de dados. Este profissional é responsável por manter o banco de dados seguro, além de gerenciar, monitorar, efetuar backups, aprimorar a performance, dentre outras tarefas.

É uma profissão de alta responsabilidade, pois lida com dados que são importantes para a empresa e deve estar sempre preparado para investigar problemas quando houver e dar suas soluções.

Muitas pessoas não gostam de trabalhar sob pressão, mas essa é uma profissão que exige isso. Se algo acontecer, como por exemplo perda de um dado importante, o DBA deverá recuperá-lo o mais rápido possível e, é claro, sem falhas.

Muitos dos profissionais de DBA vem de graduações como Engenharia da Computação, Sistemas de Informação, Processamento de dados ou até mesmo de cursos específicos de banco de dados. Na imagem abaixo do Guia de Profissões do site de vagas Catho podemos ver alguns desses dados:

Dados sobre a carreira de DBA

Você pode estudar vários bancos de dados e se especializar em um ou outro, afinal, não dá para saber 100% de todas as opções que temos. Por exemplo, se você tem mais afinidade com o SQL Server, pode se especializar nele, mas deve saber pelo menos um pouco de cada um dos outros. Na imagem acima também podemos ver o quanto o inglês é importante, não só na carreira de um DBA mas em toda área de TI.

Mas, não é só de SGBD em sí que um DBA vive, é importantíssimo que esse profissional saiba modelagem de dados, pensar em todo o banco antes mesmo de criá-lo, como o relacionamento entre tabelas por exemplo, pois esse é o primeiro passo para que não venha a ter problemas futuros no banco.

Este é um profissional que deve estudar muito (assim como toda área de TI), para que assim tenha muito conhecimento para resolver os problemas de imediato. Também deve ser uma pessoa organizada e claro, gostar de tecnologia. Deve sempre se atualizar e buscar a evolução do seu trabalho, pois tem uma grande importância para a empresa.

Essa é uma profissão que só tende a crescer, pois cada vez mais as empresas irão precisar aperfeiçoar, otimizar e escalar seus bancos de dados. Sabemos que a perda de dados ou qualquer outro erro no banco, podem trazem graves consequências para a empresa, podendo até mesmo vir a falência.

Aqui no TreinaWeb temos cursos dos principais bancos de dados do mercado.

Curso de
CONHEÇA O CURSO
Curso de
CONHEÇA O CURSO
Curso de
CONHEÇA O CURSO
Curso de
CONHEÇA O CURSO

SQL vs NoSQL, qual usar?

Muito se tem falado da utilização de NoSQL. Existem várias comparações de desempenho realizadas entre ele e o SQL, tendo como a velocidade o fator mais importante na decisão de qual banco utilizar. Há muitas opções de bancos de dados NoSQL com diferentes funcionalidades que podem ser muito úteis. Mas como decidir entre um banco de dados relacional e um não-relacional?

Primeiramente vamos falar um pouco sobre cada tecnologia para que possamos conhecê-las ou relembrá-las.

SQL

SQL é a sigla para “Structured Query Language” que significa, traduzindo para o português, “Linguagem de Consulta Estruturada”. Trata-se de uma linguagem de consulta a banco de dados relacionais. Com o SQL, você pode executar vários comandos para criar, alterar, gerenciar, consultar, dentre outras informações no seu banco de dados. Costumamos dizer que bancos SQL seguem uma modelagem relacional, pois estes se baseiam no fato de que todos seus dados sejam guardados em tabelas.

Curso de
CONHEÇA O CURSO

NoSQL

NoSQL (Not Only SQL) é o termo utilizado para banco de dados não relacionais de alto desempenho, onde geralmente não é utilizado o SQL como linguagem de consulta. O NoSQL foi criado para ter uma performance melhor e uma escalabilidade mais horizontal para suprir necessidades onde os bancos relacionais não são eficazes. No geral, temos 4 tipos de bancos de dados NoSQL:

  • Documento – Os dados são armazenados como documentos. Os documentos podem ser descritos como dados no formato de chave-valor, como por exemplo, o padrão JSON. Um exemplo de banco de dados neste formato é o MongoDB;

  • Colunas – Os dados são armazenados em linhas particulares de tabela no disco, podendo suportar várias linhas e colunas. Também permitem sub-colunas. Um banco de dados dessa família, por exemplo, é o Cassandra;

  • Grafos – Os dados são armazenados na forma de grafos (vértices e arestas). O Neo4j é um banco que utiliza grafos;

  • Chave-valor – Esta família de bancos NoSQL é a que aguenta mais carga de dados, pois o conceito dele é que um determinado valor seja acessado através de uma chave identificadora única. Um exemplo é o banco de dados Riak.

Resumindo: o conceito de modelo relacional (SQL) se baseia no fato de que todos os dados sejam guardados em tabelas. Ao modelo não-relacional (NoSQL) não se aplica o conceito de schema: uma chave de valor é que é utilizada para recuperar valores, conjunto de colunas ou documentos.

Quais são as diferenças?

Uma das diferenças nos bancos de dados NoSQL é que toda a informação é agrupada e guardada no mesmo registro. Já no SQL você precisa ter o relacionamento entre várias tabelas para ter a informação, informação esta disposta no modelo entidade e relacionamento.

O SQL tem certa dificuldade em conciliar a demanda por escalabilidade. Quanto a escalabilidade do NoSQL, deve se levar em consideração a modelagem do sistema. Do que adianta termos um sistema super simples e querermos utilizar o NoSQL apenas pela escalabilidade? Todo o ganho de performance seria perdido quando rodássemos a aplicação.

Um ponto forte do SQL é quanto à consistência das informações. Já o NoSQL garante o último valor atualizado, isso se nenhuma atualização for realizada até o momento da consulta.

Quanto à segurança, ambos estão suscetíveis a ataques.

Concluindo

O NoSQL tem muitas vantagens para ser utilizado. Mas não é por isso que devemos utilizá-lo em todas as situações. Em muitos sistemas, você pode (e até deve) usar o modelo relacional. O NoSQL é mais indicado para aqueles sistemas que tenham necessidades maiores de armazenamento e desempenho.

O NoSQL não veio para substituir o SQL, mas sim para oferecer mais uma alternativa de um banco de dados mais flexível no suporte de dados. Sendo assim, você pode usar ambas as soluções para diferentes casos de uso. Por isso, o mais comum em soluções escalares de sucesso é a utilização de uma arquitetura híbrida, aproveitando o melhor dois dois modelos.

Curso de
CONHEÇA O CURSO

Você conhece o GraphQL e como ele pode te ajudar?

Olá, Web Developers!

Muitos aqui já devem ter ouvido falar desse tal GraphQL há algum tempo, mas sem saber ainda o que ele é e por que deveríamos cogitá-lo na nossa stack de desenvolvimento. Talvez ele seja uma boa pedida para o seu projeto.

Vamos entendê-lo um pouco mais?

Curso de
CONHEÇA O CURSO

Como tudo começou

O GraphQL começou no Facebook. Imagine que para exibir uma lista de posts era necessário o acesso a uma API, e dentro de cada post tinha que vir uma lista dos usuários que curtiram. Dentro de cada objeto de usuário tem que vir o nome, foto do perfil, link para o perfil, se o usuário já é seu amigo, etc.

Pelo menos é isso que nós podemos ver quando acessamos o Facebook pelo navegador. Mas quando estamos no aplicativo mobile, não temos todas essas informações do usuário. O que temos é uma lista de usuários que curtiram e o link para seu perfil.

Poderíamos então evitar que o servidor nos envie dados que não vamos precisar, deixando o nosso app mobile mais rápido e economizando dados (bom para quem está no 3G ou 4G).

Mas, sério, não é legal criar uma nova API apenas para enviar uma estrutura levemente diferente, como “mobile/posts”.

É muito comum também que, em sistemas maiores, os dados fiquem em diferentes bases de dados. Podemos, por exemplo, ter dados relacionais no MySQL, guardar certas informações em forma de documentos no MongoDB e ter pequenos dados para consultas rápidas no Redis.

É aqui que começamos a ver que teremos um bom trabalho: juntar dados de bancos diferentes e enviar uma estrutura diferente para cada tipo de aplicação.

O GraphQL entra em cena

GraphQL

Ao invés de ter que ficar criando uma API para cada estrutura diferente de dados e/ou ficar manualmente fazendo consultas para cada banco e depois juntar os dados, que tal simplesmente dizer a “alguém” o que você precisa?

Para fazermos uma consulta no GraphQL, teríamos algo parecido com isso:

query {
   posts
}

Declaramos uma consulta com query e indicamos que queremos um campo com o nome posts.

Também podemos criar consultas que tenham mais níveis, como:

query {
   posts {
      likes
      comments
      shares
   }
}

É possível, ainda, passar parâmetros, como:

query {
   posts (userId: 157321){
      likes
      comments
      shares
   }
}

Dúvidas comuns

Não gosto de ferramentas do Facebook

O GraphQL é mais uma especificação. Então você pode usar outras ferramentas que fazem o mesmo e que não sejam do Facebook.

Uma ferramenta parecida, que visa resolver o mesmo problema, é o Falcor, desenvolvida pela Netflix.

Se eu for trabalhar com GraphQL, terei que usar React?

Não. O GraphQL pode ser usado com qualquer framework, biblioteca ou linguagem de programação.

A ideia do cliente dizer o que quer não me parece segura…

Fique tranquilo. O GraphQL tem uma coisa chamada resolvers. Com eles você pode cuidar da segurança de seus dados, permitindo ou não que determinado usuário acesse-os.

Ainda acho que não preciso disso. Minha aplicação já está muito boa com as APIs existentes.

Se você acredita que não tem problema e que a sua solução hoje já funciona perfeitamente, ótimo.

A ideia do GraphQL é ajudar a solucionar determinado problema. Se você não tem esse problema em sua aplicação, realmente você não precisa gastar tempo implementando uma ferramenta a mais.

Concluindo

O GraphQL é uma linguagem de consulta que facilita o nosso trabalho na hora de fazer requisições, basta que indiquemos os campos que queremos sem que nos preocupemos de onde os dados estão vindo.

Caso queira fazer alguns testes, acesse o GitHub GraphQL.

Tente executar, por exemplo, a seguinte query:

query {
  repository(owner: "graphql", name: "graphql-js"){
    name
    description
  }
}

O que achou do GraphQL? Já teve algum problema que poderia ter sido resolvido com ele? Acha que precisará dele em um novo projeto? Compartilhe com a gente aí nos comentários!

Curso de
CONHEÇA O CURSO

Entendendo o método merge do JPA

O JPA trouxe muitos benefícios para os desenvolvedores Java, mas existe certa dificuldade em entender alguns detalhes desta especificação.

Para facilitar esta compreensão, vamos aqui analisar um método que gera muita controversa, que é o merge.

Curso de
CONHEÇA O CURSO

Estados de um objeto JPA

Antes de vermos o método merge em detalhes, é importante entendermos os estados das entidades JPA, pois estão diretamente relacionados com a função deste método.

No JPA um objeto pode assumir quatro estados: New, Managed, Removed e Detached. A imagem abaixo ilustra o ciclo de vida de um objeto que passa por esses quatro estados:

Quando um objeto é criado, ele se encontra no estado New. Neste estado, o objeto não tem nenhuma relação com EntityManager ou uma representação
no banco de dados. Qualquer alteração no objeto, neste estado, não é notada pelo JPA.

Quando o objeto é persistido (geralmente em um banco de dados), ele passa para o estado Managed. Neste, qualquer alteração no objeto será sincronizada com o dado persistido. Essa sincronização não é em tempo real. Uma alteração no objeto não irá executar automaticamente um comando SQL, isso só irá acontecer em “flush time”.

O “flush time” ocorre por padrão (de acordo com a implementação do Hibernate, uma vez que a especificação do JPA não define isso) em três momentos:

  • Antes da execução de uma query.
  • Na chamada do método commit() de EntityTransaction.
  • Na chamada do método flush() de EntityManager.

É muito comum o objeto se manter por pouco tempo no estado Managed, pois, geralmente, após persistí-lo, o EntityManager já é fechado e então ele passa para o estado Detached.

O estado Detached significa que o objeto não está vinculado ao EntityManager. Qualquer alteração não irá impactar no dado persistido. Isso só irá ocorrer se o estado voltar a ser Managed.

Por fim, temos o estado Removed. O objeto assume este estado quando um objeto Managed é marcado para a remoção com o método remove.

Funcionamento do merge

Agora que conhecemos os estados de um objeto JPA, é possível afirmar que ele só pode ser alterado, quando este está no estado Managed. Mas como
definir um objeto neste estado? Bom, isso pode ser feito através de dois métodos: persist e merge.

O funcionamento do persist é bem simples: ao ser chamado, o objeto é salvo no banco e o seu estado muda para Managed.

Já o funcionamento do merge irá depender de alguns fatores. O seu comportamento principal é lidar com objetos no estado Detached. Quando um objeto neste estado é passado para o método merge, é retornado um novo objeto no estado Managed.

Se o objeto estiver no estado New, mas tendo os seus dados exatamente iguais aos persistidos na base, o merge retornará um novo objeto no estado Managed. Mas, se o objeto no estado New contiver ao menos um dado diferente dos persistidos, será gerado um novo registro e, um novo objeto no estado Managed será retornado.

Se o objeto contiver outros objetos relacionados (através de uma propriedade de relacionamento) e o JPA não conseguir localizar seus dados no banco, também será gerado um novo registro do objeto e também dos que estiverem relacionados. Além disso, um novo objeto no estado Managed também será retornado.

Se o objeto estiver no estado Removed o método merge irá gerar um erro.

Repare que sempre cito que o merge retorna o objeto no estado Managed. Assim, o uso correto desse método é:

Entidade e = new Entidade();

Entidade e2 = em.merge(e);

e2.setAtributo(novoValor);

Veja que penas o objeto e2 se encontra no estado Managed. Qualquer alteração em e não será sincronizada com o banco. Se o e fosse alterado, como abaixo:

Entidade e = new Entidade();

em.merge(e);

e.setAtributo(novoValor);

Ao executar o “flush”, a alteração não seria refletida no banco de dados.

Caso não tenha certeza se o método merge irá gerar um novo registro ou não, opte pelo uso do find:

Entidade e = em.find(Entidade.class, 1);

Este método sempre irá retornar um objeto no estado Managed (ou null se o registro não for encontrado). Aí não corremos o risco de gerar um novo registro apenas para se obter um objeto neste estado.

Curso de
CONHEÇA O CURSO