Usando MySQL Workbench - Modo Design Model - 1ª Parte

MySQL Workbench é a ferramenta oficial de interface gráfica do usuário (GUI) da Oracle MySQL e o seu uso é totalmente livre (free). Com ela, pode-se modelar um diagrama relacional (DR), gerar código SQL, manipular dados e fazer consultas em um banco de dados MySQL.

Perceba que o MySQL Workbench é somente uma ferramenta cliente que acessa o banco de dados MySQL, não sendo necessária a sua instalação para que o MySQL funcione.
Além do MySQL Workbench, há outras ferramentas clientes que são livres, tais como:
  • HeidiSQL: https://www.heidisql.com/. Ferramenta gráfica para navegar, editar e alterar dados de uma tabela, views, procedures, functions, e eventos de banco de dados MySQL e MariaDB. Não possui interface de modelagem de diagramas.
  • PHPMyAdmin: https://www.phpmyadmin.net/. Ferramenta web para navegar, editar e alterar dados do banco de dados MySQL e MariaDB. 
  • DBeaver Community Edition: https://dbeaver.jkiss.org/. Ferramenta gráfica para navegar, editar e alterar dados de banco de dados MySQL, MariaDB, PostgreSQL, SQL Server, Oracle, SQLite, entre outros. Permite visualizar as tabelas e seus relacionamentos em um diagrama (não editável).


Neste artigo, será demonstrada a criação de uma entidade (tabela) "Aluno" no modo "Design Model" do MySQL Workbench 6.3 e posterior criação automática do seu código SQL para ser usado no banco de dados MySQL 5.7. Versões anteriores do MySQL Workbench e MySQL podem ter interface e funcionalidades diferentes das deste artigo. Tente utilizar as versões mais recentes.

1) Abra o aplicativo MySQL Workbench. Clique no ícone de "Design Model" no menu lateral.




2) Clique no ícone + para criar um novo diagrama.
 


3) Na aba Physical Schemas, dê dois cliques no database "mydb".

4) Renomeie o database do nome "mydb" para um nome que achar adequado. Neste exemplo, iremos renomeá-lo para o nome "db_faculdade", pois o database será de um sistema de controle de cadastro de alunos de uma faculdade. 

5) Depois de renomear o database, clique no ícone "Add Diagram".

6) Clique no ícone "Place a New Table (Coloque uma nova tabela)", ou pressione a tecla "T".


7) Clique em alguma parte da área do diagrama. Um objeto "Table1" será criado.


8) Dê dois cliques no objeto "Table1" para ser editado. Renomeie-o para o nome "Aluno"  que irá representar um cadastro de alunos.


9) Adicione os seguintes campos (atributos) na tabela "Aluno:

+--------------------+-----------------------+-----+-----+-----+---+-----+-----+-----+---+--------------------+
|Column Name         | Datatype              | PK  |  NN | UQ  | B | UN  | ZF  | AI  | G | Default/Expression |
+--------------------+-----------------------+-----+-----+-----+---+-----+-----+-----+---+--------------------+
| id_aluno           | INT                   |  X  |  X  |     |   |  X  |     |  X  |   |                    |
| nome               | VARCHAR(100)          |     |  X  |     |   |     |     |     |   |                    |
| data_nascimento    | DATE                  |     |  X  |     |   |     |     |     |   |                    |
| cpf                | DECIMAL(11)           |     |  X  |  X  |   |  X  |  X  |     |   |                    |
| rg_numero          | VARCHAR(20)           |     |  X  |     |   |     |     |     |   |                    |
| rg_orgao_expedidor | VARCHAR(10)           |     |  X  |     |   |     |     |     |   |                    |
| rg_uf              | CHAR(2)               |     |  X  |     |   |     |     |     |   |                    |
| endereco           | VARCHAR(100)          |     |  X  |     |   |     |     |     |   |                    |
| complemento        | VARCHAR(50)           |     |     |     |   |     |     |     |   |                    |
| bairro             | VARCHAR(50)           |     |  X  |     |   |     |     |     |   |                    |
| municipio          | VARCHAR(50)           |     |  X  |     |   |     |     |     |   |                    |
| uf                 | CHAR(2)               |     |  X  |     |   |     |     |     |   |                    |
| cep                | DECIMAL(8)            |     |  X  |     |   |     |  X  |     |   |                    |
| data_cadastro      | TIMESTAMP             |     |  X  |     |   |     |     |     |   | now()              |
| data_alteracao     | TIMESTAMP             |     |  X  |     |   |     |     |     |   | now()              |
| status             | ENUM('A','I','D','B') |     |  X  |     |   |     |     |     |   | 'A'                |
+--------------------+-----------------------+-----+-----+-----+---+-----+-----+-----+---+--------------------+




Onde a colunas podem ser
  • Column Name: nome dos atributos (campos) da tabela. 
  • Datatype: tipo de dados que o atributo irá armazenar no banco de dados. Os principais tipos são texto (char, varchar, text), numérico (int ou integer, decimal ou numeric, float, double), data e hora (date, time, datetime, timestamp) e domínio (enum, set). Veremos oportunamente em outro artigo a funcionalidade de cada tipo de dados. O tamanho do atributo (quantidade de caracteres e dígitos) deve ficar entre parênteses.
  • PK (Primary Key): indica quais os atributos fazem parte da chave primária. Lembre-se que uma chave primária pode ter um ou mais atributos obrigatórios (not null) e o conjunto do valores deve ser único. Lembre-se também que há somente uma única chave primária por tabela.
  • NN (Not Null): indica que o preenchimento do atributo é obrigatório. O seu valor não pode sem vazio, ou seja, não é nulo.  
  • UQ (Unique): o atributo que tiver esta opção não pode ter seu valor repetido em outros registros. Exemplo: o valor do campo CPF de uma pessoa não pode ser repetido.  
  • B (Binary): esta opção é usada nos atributos do tipo texto. Indica que o atributo irá armazenar valores binários (áudios, imagens, executáveis) em vez de texto puro (caracteres ISO8859-1 e  UTF-8). 
  • UN (Unsigned Number): esta opção é usada nos atributos do tipo numérico. Indica que o atributo não terá valores negativos (sem sinal). Exemplo: um campo CPF não terá valores negativos.
  • ZF (Zero Fill): esta opção é usada nos campos do tipo numérico. Indica que o atributo será preenchido com zero à esquerda até completar o tamanho desejado. Exemplo: um campo CPF do tipo decimal(11) com o valor "12345" será armazenado como "00000012345". 
  • AI (Auto Increment): indica que o atributo numérico será de auto-incremento, ou seja, o valor do campo será incrementado de um em um para cada registro e seu  valor inicial será 1. No MySQL, só poderá haver um atributo auto-incremento por tabela e deverá fazer parte da chave primária.
  • G (Generated): indica que o atributo é calculado (gerado). Esse atributo é usado somente no banco de dados do tipo NDB Cluster. O padrão do MySQL 5.7 é usar o InnoDB.
  • Default/Expression: é o valor default quando o atributo não é preenchido. Pode ser usado tanto valores literais como texto ('A', 'Fulano de Tal'), numeral ( 1, 1.23, -89), data e hora ('2017-05-05 18:00', '2017-05-10', '17:45'), tanto como funções MySQL (por exemplo, a função now() que retorna a data atual do sistema).
    Para que as funções now() ou current_timestamp() funcionem, o campo deve ser do tipo timestamp.
    Se a opção G (Generated) estiver selecionada, o campo irá receber uma expressão (Expression).
Os atributos são:
  • id_aluno: Este atributo é a chave primária (PK) da tabela aluno. Tente colocar o sinal de underscore (sublinhado) entre as palavras id (abreviatura de identificador) com o nome da tabela para facilitar a leitura. O seu tipo é inteiro (int), não nulo (NN), e auto-incremento (AI). Caso queira, pode colocar a opção sem sinal (unsigned number - UN) para que não possam colocar um valor negativo no campo. Porém, como o campo é auto-incremento começando do valor 1 (default), é bem improvável que tenha um valor negativo. O fato de colocar UN não só impede que tenhamos um valor negativo, mas também "dobra" o valor máximo do numeral. No caso do tipo inteiro (int), ele ocupa em disco 4 bytes (32 bits) e os valores válidos são de -2.147.483.648 a +2.147.483.647. Colocando a opção UN, os valores válidos passarão a ser de 0 a  4.294.967.295. Ou seja, o campo inteiro de auto-incremento passará a ter valor máximo de 4.294.967.295 em vez de 2.147.483.647, e isso ocupando os mesmos 4 bytes de dados.
  • nome: é um campo texto (varchar - character varying) com tamanho máximo de 100 caracteres, obrigatório (não nulo-NN). Como a faculdade/universidade precisa emitir os diplomas com o nome completo dos alunos (sem abreviatura) é necessário colocar um campo com tamanho máximo adequado. Colocar um campo nome com tamanho máximo pequeno, como por exemplo, 30 caracteres, irá gerar abreviaturas e possibilidade de gerar muitos homônimos (pessoas com o mesmo nome). Os campos textos do tipo varchar não ocupam muito espaço em disco. Se a pessoa tiver 40 caracteres latinos (ISO-8859-1) no nome (contando todos as letras, sinais  mais os espaços em branco), o campo ocupará 41 bytes em disco ( 40 bytes do nome + 1 byte de metadados).
  • data_nascimento: é um campo data (date), obrigatório (não nulo-NN). Os campos data em MySQL são no formato universal 'YYYY-MM-DD'. Por exemplo, a data 8 de setembro de 2017 em  MySQL será '2017-09-08'. Não se esqueça que os valores dos campos do tipo data devem estar entre aspas simples ('). 
  • cpf: é um campo numérico (decimal/numeric) com 11 dígitos, obrigatório (não nulo-NN), valor único (UQ) - não pode haver dois alunos com o mesmo CPF, sem sinal (UN) - não existe CPF com valor negativo, e preenchido com zero à esquerda (ZF). O CPF possui 11 dígitos sem contar os sinais de ponto e traço (máscara) que não devem ser armazenados pois ocupam espaço em disco. 
  • rg_numero: é um campo texto (varchar) com tamanho máximo de 20 caracteres e obrigatório (NN). Diferente do campo CPF que só possui dígitos, o RG pode ter algarismos e letras na sua composição (por exemplo: 654356-X, M6534561), por isso, recomenda-se armazená-lo em um campo texto. Infelizmente o banco de dados MySQL não possui funcionalidade de limitar os tipos de caracteres em um campo texto. Lembre-se de nunca acentuar o nome de um campo.
  • rg_orgao_expedidor: é o órgão que expediu o documento do RG. É um campo texto (varchar) com tamanho máximo de 20 caracteres e obrigatório (NN). O principal órgão expedidor de RG é a Secretaria de Segurança Pública  (SSP) de cada Unidade Federativa do Brasil.
  • rg_uf: é a Unidade Federativa (27 estados + Distrito Federal) que o documento do RG pertence.  É um campo texto (char) com tamanho máximo de 2 caracteres e obrigatório (NN). Além do órgão expedidor, é necessário saber qual a Unidade Federativa pertence o documento de RG. Como o número de RG, órgão expedidor e a UF pode-se saber unicamente quem é cidadão do documento de identificação.
  • endereco: é um campo texto (varchar) com tamanho máximo de 100 caracteres e obrigatório (NN). O campo endereço de residência normalmente é composto por tipo de logradouro, nome do logradouro e o número da casa/prédio/construção/lote. Nunca coloque "ce-cedilha" ("ç") e sinais gráficos ("^", "´", "~", "`") no nome de um atributo.
  • complemento: é um campo texto (varchar) com tamanho máximo de 50 caracteres e NÃO é obrigatório (NN). É o complemento do campo endereço, onde se pode colocar o número do apartamento, se a casa fica aos fundos de um lote, perto de uma outra localidade, entre outros dados. 
  • bairro: é  um campo texto (varchar) com tamanho máximo de 50 caracteres, obrigatório (NN). É o bairro, vila ou distrito da residência do aluno.
  • município: é  um campo texto (varchar) com tamanho máximo de 50 caracteres, obrigatório (NN). É o município ao qual pertence a residência do aluno. Nunca nomeie o campo como "cidade", visto que o aluno pode morar em uma localidade rural. No Brasil, o conjunto da área urbana com a área rural chama-se município.
  • uf: é um campo texto (char) com tamanho máximo de 2 caracteres, obrigatório (NN). É a Unidade Federativa a qual pertence o município.
  • cep: é um campo numérico (decimal/numeric) com 8 dígitos, obrigatório (NN), e preenchido com zero à esquerda (ZF).  É o código de endereçamento postal (CEP) de 5 dígitos + 3 dígitos da residência do aluno. 
  • data_cadastro: é um campo data e hora  do tipo timestamp, obrigatório (NN), e se não preenchido no momento da criação do registro, o valor default será a data do sistema retornado pela função now().  É a data que o aluno foi cadastrado no sistema.
    O tipo timestamp é parecido com o tipo datetime que armazena também DATA e HORA, porém, enquanto o datetime consegue armazenar "YYYY-MM-DD HH:MM:SS" (ano-mês-dia hora-minuto-segundo), o timestamp armazena o também o timezone: "YYYY-MM-DD HH:MM:SS TZ" (ano-mês-dia hora-minuto-segundo e timezone). Além disso, o datetime consegue armazenar datas entre '1000-01-01 00:00:00' a '9999-12-31 23:59:59', enquanto timestamp armazena datas entre '1970-01-01 00:00:01' UTC a  '2038-01-19 03:14:07' UTC, ou, no horário oficial de Brasília (sem horário de verão) entre '1969-12-31 21:00:01' BRT to '2038-01-19 00:14:07' BRT.
    A função now() ou current_timestamp() retorna data e hora da máquina do SGBD e funciona somente com campos do tipo timestamp.
  • data_alteracao: é um campo data e hora  do tipo timestamp, obrigatório (NN), e se não preenchido no momento da criação do registro, o valor default será a data do sistema retornado pela função now(). É a data data que o registro foi alterado. O valor desse campo tem que ser alterado manualmente quando o registro tiver algum valor alterado.
    Melhorias! Pode-se criar um gatilho para que quando o usuário alterar o registro atualize a data e hora automaticamente no campo data_alteracao. Para isso, coloque no campo default o seguinte valor "now() on update now() " (sem as aspas).
  • status: é um campo do tipo enum (enumarate) que enumera o seguinte domínio de valores 'A'(ativo), 'I' (inativo), 'D' (desativado), 'B' ('bloqueado'). O usuário somente pode escolher um desses valores, e o MySQL, por padrão, não faz diferenciação de maiúsculo ou minúsculo (case insensitive).
    O status é um atributo do ciclo de vida do aluno junto ao sistema. Depois que o aluno é cadastrado e sua entidade é relacionada com outros elementos do sistema, não é coerente apagá-lo do sistema quando o aluno se forma ou sai da faculdade. A melhor forma é ter um atributo que informe se o aluno está ativo, bloqueado ou desativado.  No exemplo, o aluno está Ativo se está cursando e pagando normalmente a faculdade; o aluno está Desativado se saiu do curso/faculdade ou se formou; Bloqueado se está com pendência com a faculdade; Inativo se o próprio sistema verificou que o aluno não frequenta mais a faculdade ou expirou o tempo de conclusão de curso. Caso queira, o sistema poderia ter as opções "T" de trancado, "P" de pendente, entre outros. 
10)  Depois de criar os atributos, clique na aba Indexes no rodapé do aplicativo.


11) Perceba que há dois índices (indexes) criados: PRIMARY (Chave Primária) contendo o atributo id_aluno e cpf_UNIQUE que é a chave única para o campo CPF (Dois alunos não podem ter o mesmo número de CPF) .
Todas as chaves de um banco de dados (chave primária, chave única, chave estrangeira) irão gerar  um índice para facilitar a localização dos mesmos.
Renomeie a chave única cpf_UNIQUE para UK_ALUNO_CPF. Essa nomenclatura irá facilitar a localização do índice da chave única: UK significa que é uma chave única, ALUNO_CPF significa que o índice pertence à tabela ALUNO  + campo CPF. Isso serve para diferenciar de uma outra chave única que pertença a uma outra tabela mas que tenha o mesmo campo CPF (Exemplo: UK_ALUNO_CPF será diferente de UK_PROFESSOR_CPF).



12) Crie um novo índice do tipo chave única chamado UK_ALUNO_RG que deverá ter os campos rg_numero (1), rg_orgao_expedidor (2) e rg_uf (3).
Perceba que dois ou mais alunos não podem ter o mesmo RG, por isso, estamos criando uma chave única para o RG. Porém, o RG é composto por três valores (atributos) obrigatórios: código ou número do RG, o órgão que expediu o RG e a Unidade Federativa (UF) que pertence o RG. Por isso, a chave única é uma chave composta por três atributos.


13) Feche a tabela aluno e volte para o diagrama.
Na barra Indexes da tabela aluno, clique na seta para direita (►) para que vire seta para baixo (▼). Veja que aparecem os três índices criados: PRIMARY, UK_ALUNO_CPF, UK_ALUNO_RG.



14) Passe o ponteiro do mouse sobre um dos índices para visualizar os campos que compõem os índices.

PRIMARY

UK_ALUNO_CPF

UK_ALUNO_RG

Gerando código SQL a partir do diagrama

15) A partir do Diagrama  do Workbench (Diagrama Relacional - DR) é possível gerar o código SQL para criar as tabelas no banco de dados MySQL. Para isso, clique inicialmente no item de menu "Database".



16) Clique na opção "Forward Engineer" (Engenharia Direta) ou pressione as teclas Ctrl + G.


17) Irá aparecer a janela "Set Parameters for Connecting to a DBMS"
Selecione a opção "Local Instance MySQL57" se for conectar o banco de dados local com o usuário root (administrador do MySQL)


18) Verifique se os campos "Hostname:", "Port:" e "Username:" estão corretos.
No caso da conexão "Local Instance MySQL57", o Hostname deverá ser localhost (computador local), a Port deverá ser 3306, e o Username deverá ser root. Depois, pressione no botão "Next".


19) Na janela "Set Options for Database to be created" ("Configure as opções para o banco de dados a ser criado"), não selecione nenhuma opção e pressione o botão "Next".

20) Será mostrada a tela de diálogo "Please enter password for the followig service:" ("Por favor, entre com a senha para o seguinte serviço:"). Digite a senha do usuário solicitado e pressione o botão "OK".

21) Na tela "Select Objects to Forward Engineer" ("Selecione Objetos para a Engenharia Direta"),  selecione somente a opção "Export MySQL Table Objects" ("Exporte Objetos do tipo Tabela MySQL") e pressione o botão "Next".


22) Na tela "Review the SQL Script to be Executed" ("Revise o script SQL para ser executado"),
veja como ficou o código SQL da tabela modelada. Não se preocupe em entender todo o código SQL, pois haverá outras aulas e artigos explicando cada item. Pressione o botão "Next".


23) Se o script SQL da tela anterior estiver correto, ou seja, a modelagem da tabela foi desenhada corretamente, a tela "Forward Engineering Progress" ("Progresso da Engenharia Direta") deverá mostrar a mensagem "Forward Engineer Finished Successfully" ("Engenharia Direta foi finalizada com sucesso"). Pressione o botão "Close" para concluir.
Se ocorrer algum erro, pressione o botão "Show Logs" ("Mostrar Log") para visualizar a mensagens de erro e corrija a modelagem. Depois de corrigir, refaça os passos desde o item 15.


24) Depois de concluir com sucesso a criação da tabela no banco de dados MySQL, clique na aba "Home" ( ) para voltar à tela de início do MySQL Workbench.



25) Clique na aba lateral com símbolo do MySQL, o golfinho Sakila, para voltar para a tela de boas-vindas do MySQL.



26) Clique na conexão "Local Instance MySQL57" para entrar no modo de edição de código SQL.
Se aparecer a tela de diálogo "Please enter password for the followig service:" ("Por favor, entre com a senha para o seguinte serviço:"). Digite a senha do usuário solicitado e pressione o botão "OK".



27) Após se conectar no servidor MySQL, veja se foi criado o esquema "db_faculdade" no painel esquerdo "Navigator", painel interno "Schemas"


28) Clique no ícone de maximização () para que o painel interno "Schemas" ocupe uma aba própria no painel "Navigator".




29) Após maximizar, clique  na seta para direita (►) do database "db_faculdade" para que vire seta para baixo (▼).

30) Navegue entre as opções e veja se a tabela "aluno" foi criada com sucesso. Veja que há várias informações sobre as colunas e os índices da tabela.

No próximo artigo iremos criar a tabela a partir do script (código) SQL.

Bons estudos!

Comentários

  1. Parabéns, professor. O guia foi ótimo para dar uma revisada e fixação nos ensinamentos. Fui seu aluno no ano passado na USJT da Mooca.

    ResponderExcluir
  2. Parabéns! poucos no Brasil dividem conhecimentos e para os que são novos nas ferramentas as vezes é difícil encontrar uma ajuda. O tutorial está muito bem elaborado.

    ResponderExcluir
  3. Você teria um exemplo usando o atributo BINARY?

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Instalação do MySQL 5.7 para Windows