Baixe o app para aproveitar ainda mais
Prévia do material em texto
CODIFICAÇÃO DO PROJETO: PADRÕES DE PROGRAMAÇÃO E PROJETO DO BANCO DE DADOS W B A 04 49 _v 1. 0 2 Thiago Salhab Alves Londrina Editora e Distribuidora Educacional S.A. 2020 CODIFICAÇÃO DO PROJETO: PADRÕES DE PROGRAMAÇÃO E PROJETO DO BANCO DE DADOS 1ª edição 3 2020 Editora e Distribuidora Educacional S.A. Avenida Paris, 675 – Parque Residencial João Piza CEP: 86041-100 — Londrina — PR e-mail: editora.educacional@kroton.com.br Homepage: http://www.kroton.com.br/ Presidente Rodrigo Galindo Vice-Presidente de Pós-Graduação e Educação Continuada Paulo de Tarso Pires de Moraes Conselho Acadêmico Carlos Roberto Pagani Junior Camila Braga de Oliveira Higa Carolina Yaly Giani Vendramel de Oliveira Henrique Salustiano Silva Juliana Caramigo Gennarini Mariana Gerardi Mello Nirse Ruscheinsky Breternitz Priscila Pereira Silva Tayra Carolina Nascimento Aleixo Coordenador Henrique Salustiano Silva Revisor Anderson Paulo Avila Santos Editorial Alessandra Cristina Fahl Beatriz Meloni Montefusco Gilvânia Honório dos Santos Mariana de Campos Barroso Paola Andressa Machado Leal Dados Internacionais de Catalogação na Publicação (CIP)_______________________________________________________________________________________ Alves, Thiago Salhab A474a Codificação do projeto: padrões de programação e projeto do banco de dados/ Thiago Salhab Alves, – Londrina: Editora e Distribuidora Educacional S.A. 2020. 44 p. ISBN 978-65-87806-76-1 1. Codificação 2. Projetos 3. Padrões I. Título. CDD 003 ____________________________________________________________________________________________ Raquel Torres – CRB 6/278 © 2020 por Editora e Distribuidora Educacional S.A. Todos os direitos reservados. Nenhuma parte desta publicação poderá ser reproduzida ou transmitida de qualquer modo ou por qualquer outro meio, eletrônico ou mecânico, incluindo fotocópia, gravação ou qualquer outro tipo de sistema de armazenamento e transmissão de informação, sem prévia autorização, por escrito, da Editora e Distribuidora Educacional S.A. 4 SUMÁRIO Procedimento de programação orientada a objeto: Java e C# _______ 05 Procedimento de programação orientada a objeto: Python e Ruby _ 20 Modelagem de banco de dados e o projeto do fluxo de dados _____ 35 Procedimentos de programação em banco de dados utilizando a linguagem SQL _____________________________________________________ 50 CODIFICAÇÃO DO PROJETO: PADRÕES DE PROGRAMAÇÃO E PROJETO DO BANCO DE DADOS 5 Procedimento de programação orientada a objeto: Java e C# Autoria: Thiago Salhab Alves Leitura crítica: Anderson Paulo Avila Santos Objetivos • Aprender sobre paradigma de programação Orientada a Objetos. • Aprender a utilizar a linguagem de programação orientada a objetos Java. • Aprender a utilizar a linguagem de programação orientada a objetos C#. 6 1. Programação Orientada a Objetos É interessante parar para pensar na possibilidade de aproximar a programação de computadores dos aspectos presentes no mundo real. A programação de computadores permite a criação de algoritmos, que são sequências de código, para a resolução de determinados problemas. O paradigma de programação orientado a objetos proporcionou diminuir o gap semântico, que é a distância que existe entre o problema do mundo real e o modelo abstrato construído. Neste tema, veremos o paradigma de programação orientado a objetos por meio dos conceitos de Classes e Objetos. Além disso, aprenderemos a programar sob o conceito de orientação a objetos, utilizando a linguagem Java e C#. No início dos anos 1950, já apareciam trabalhos utilizando o termo “objeto” e “atributos de objetos”. Em 1966, Kristen Nygaard e Ole-Johan Dahl lançaram uma linguagem de programação chamada Simula, sendo, para muitos, considerada como a primeira linguagem Orientada a Objetos. Ainda nos aos 1960, Alan Kay, inspirado pelas ideias embutidas na Simula, desenvolveu o projeto Flex (DEITEL; DEITEL, 2017). No início dos anos 1970, a Xerox Palo alto Research Center desenvolveu um sistema de computador denominado Dynabook, cujo software recebeu o nome de Smalltalk, a linguagem de programação que ajudou a difundir o termo “orientação a objetos”. Sua primeira versão foi lançada em 1972, e já nos anos 1980 proliferaram várias linguagens de programação Orientada a Objetos (OO). Entre elas podemos citar (DEITEL; DEITEL, 2017): • Objective-C (Cox, 1986). • C++ (Stroustrup, 1986). 7 • Flavors (Moon, 1986). • Eiffel (Meyer, 1987). No início dos anos 1990, começaram a ser difundidas as metodologias de desenvolvimento de sistemas orientadas a objetos, como Object- Oriented Analysis and Design (OOAD), Object Modeling Technique (OMT), Objectory etc. Em meados da mesma década, surgiu a linguagem de programação Java. O projeto originário da linguagem foi desenvolvido na SUN Microsystem, empresa fabricante de computadores e semicondutores localizada no Vale do Silício, Califórnia, adquirida em 2009 pela Oracle Corporation. Dentro dos conceitos da programação Orientada a Objetos, dois conceitos se destacam: Objetos e Classes. 1. Objeto: qualquer “coisa” do mundo real. Uma entidade física ou abstrata que faça sentido em um contexto analisado, sendo uma instância de uma classe e se caracterizando pelos atributos que possui e pelas operações que pode realizar. Exemplos: • Um aluno (“João da Silva”). • Um automóvel (“Civic EXL 2020”). • Um cliente (“Thiago Salhab Alves”). • Um fornecedor (“Honda”). 2. Classe: denominação para um conjunto de objetos, sendo onde os objetos se “enquadram”. Uma unidade de organização para sistemas de software abrange atributos e operações. Programas orientados a objetos são organizados por meio de classes (de objetos). Exemplos: 8 • Aluno. • Automóvel. • Cliente. • Fornecedor. 1.1 Java A história do Java começa em 1991, com James Gosling, Patrick Naughton e Mike Sheridan e dois fundadores da Sun, Andy Bechtolsheim e Bill Joy, pensando na nova onda do mundo digital. Eles viram a possibilidade de aplicar a tecnologia a dispositivos e eletrodomésticos usados na vida diária, conectados e controlados remotamente. Por isso, eles lançaram um projeto chamado “Green”, cujo objetivo é desenvolver um sistema que lhes permita estabelecer uma rede distribuída de dispositivos eletrônicos heterogêneos para o consumidor final e se comunicar entre si (DEITEL; DEITEL, 2017). Para usá-lo em um sistema embarcado de recursos limitados, Gosling iniciou mudanças na linguagem C/C++, mas optou por criar linguagem nova com algumas características (DEITEL; DEITEL, 2017): • Sintaxe similar C/C++: o Java é similar às linguagens C e C++, facilitando seu aprendizado. • Segura: o Java não usa ponteiros e apresenta proteção contra programas mal-intencionados que necessitam acessar endereços de memória. • Multiplataforma: o Java pode ser utilizado em vários dispositivos, independente da Unidade Central de Processamento. 9 • Interpretada: o Java é interpretado e convertido para um formato intermediário (os bytecodes), que seria enviado pela rede para ser executado dinamicamente no dispositivo real. A nova linguagem foi chamada inicialmente de Greentalk (as extensões dos arquivos fonte eram .gt), mas depois recebeu o nome Oak, inspirado por um carvalho que existia na frente do escritório de quem a criou. No entanto, próximo do lançamento, por conta de uma outra linguagem homônima, o time teve que escolher outro nome, e o nome escolhido foi Java (apelido para café) (DEITEL; DEITEL, 2017). A Máquina Virtual Java (do inglês Java Virtual Machine – JVM) é um programa que carrega e executa os aplicativos Java, convertendo os bytecodes em código executável de máquina. O que é implementado em Java gera os bytecodes, que são interpretados pela JVM. Dessa forma, qualquer sistema operacional que possua a JVM do Java pode executar seu código. A JVM é responsável pelogerenciamento dos aplicativos à medida que são executados. Já o Java Development Kit Software (JDK), Desenvolvido pela Sun Microsystens, implementa o conjunto básico de ferramentas necessárias para escrever, testar e depurar aplicações Java e Applets (pequena aplicação executada em uma janela de uma aplicação (navegador). Diferenças das Versões: • Java SE: o Java Standard Edition é utilizado em desktops e servidores para executar aplicações Java ou desenvolver essas aplicações. • Java EE: o Java Enterprise Edition é voltado a ambientes corporativos de rede, como servidores web e clusters. • Java ME: o Java Micro Edition é voltado para dispositivos com pouca memória e poder de processamento reduzido (Personal Digital Assistant – PDAs , celulares, hardwares embarcados etc.). 10 Uma classe basicamente possui dois grupos de elementos: a declaração de seus atributos e a implementação de seus métodos. Um atributo (atribute) de uma classe é uma variável pertencente a essa classe, que é destinada a armazenar alguma informação que está intrinsecamente associada à classe. Vamos considerar a classe cliente: o cliente possui como atributos nome e idade, sendo nome do tipo texto (String) e idade do tipo número (int). (DEITEL; DEITEL, 2017). Enquanto os atributos permitem armazenar dados associados aos objetos, ou seja, valores que descrevem a aparência ou o estado de um certo objeto, os métodos (methods) são capazes de realizar operações sobre os atributos de uma classe ou de especificar ações ou transformações possíveis para um objeto. Isso significa que os métodos conferem um caráter dinâmico aos objetos, pois permitem que exibam um comportamento que, em muitos casos, pode mimetizar (imitar) o comportamento de um objeto real. A acessibilidade de uma classe, método ou atributo é a forma com que tal elemento pode ser visto e utilizado por outras classes. Esse conceito é também conhecido como data biding (ocultamento de dados), sendo muito importante dentro da orientação a objetos. A determinação da acessibilidade de uma classe ou membro de classe é feita pelos qualificadores de acesso (access qualifiers), ou seja, por palavras reservadas da linguagem que definem o grau de encapsulamento exigido por uma classe ou seus elementos, isto é, são especificações para restringir o acesso às declarações pertencentes a uma classe ou à própria classe como um todo. O encapsulamento oculta a visibilidade de métodos e atributos de objetos externos. (DEITEL; DEITEL, 2017). Sobre Modificadores de Acesso, podemos citar: • Public: a palavra reservada public torna o método ou a propriedade disponível para qualquer classe no sistema. 11 • Private: a palavra reservada private é o contrário do modificador public, e, se um método ou variável for private, só poderá ser acessado pela classe que o contém, nenhuma classe externa pode acessá-lo. Os métodos privados implementam um conceito importantíssimo no Java, chamado encapsulamento. • Protected: a palavra reservada protected permite menos acesso do que o público, mas é mais acessível do que o private. Quando um método ou variável é protected, o acesso é permitido pelas classes do mesmo package (pacote). • Abstract: é um método cuja implementação está definida em subclasses. A Figura 1 ilustra a codificação Java, criando uma classe pessoa com os atributos privados nome e idade. A classe possui métodos construtores (public Pessoa() e public Pessoa(String vNome, int vIdade)), que são aqueles que levam o mesmo nome da classe e são executados quando um objeto é instanciado. Um construtor é um método que possui o mesmo nome da classe e é chamado quando se cria um objeto da classe. A classe Pessoa possui também os métodos getNome() e getIdade(), que retornam o nome e a idade cadastrados, e os métodos void setNome(String value) e setIdade(int value), que atribuem valores às variáveis nome e idade, respectivamente. A função principal main() é a responsável por declarar e instanciar (alocar memória) para dois objetos, que são Pessoa p1 e p2. O programa inicia pela função main(), que é a função principal. Após a instanciação, cada objeto chama os métodos setters e getters para a atribuição e a obtenção dos dados cadastrados. 12 Figura 1 – Exemplo de Codificação Java Fonte: elaborada pelo autor. 13 No mundo da Programação Orientada a Objetos, o termo herança é associado a uma das formas de reutilização de software. Por meio dela, novas classes podem ser derivadas das classes existentes. A nova classe herda propriedades e métodos da classe base, além de poder adicionar suas próprias propriedades e métodos. A herança é o compartilhamento de atributos e operações entre classes baseado em um relacionamento hierárquico do tipo pai e filho, ou seja, a classe pai contém definições que podem ser utilizadas nas classes definidas como filho. A linguagem Java não possibilita a herança múltipla, isto é, uma classe herdar o comportamento de mais de uma classe (DEITEL; DEITEL, 2017). Figura 2 – Implementação de Herança em Java Fonte: elaborada pelo autor. A Figura 2 ilustra o exemplo de codificação da herança entre classes. A classe Pessoa (classe pai) possui o atributo privado nome, o método construtor Pessoa(), os métodos setNome(), getNome() e mostra(). A 14 classe Estudante é filha de Pessoa por meio de extends. Dessa forma, todos os métodos públicos de Pessoa são herdados por Estudante, que possui o método construtor Estudante(), os métodos setCurso() e mostra(). A classe PessoaApp possui a função principal, main(), que instancia o objeto e1 da classe Estudante. Esse objeto, chama método setNome() da classe Pessoa e setCurso() de Estudante, demostrando o uso da herança. 1.2 C# A linguagem de programação C# foi criada pela Microsoft com influência das linguagens C++, Pascal e Java, no final de 1999. Os desenvolvedores responsáveis foram Anders Hejlsberg, que foi funcionário da empresa Borland, no desenvolvimento do Turbo Pascal e Delphi, e o engenheiro Scott Wiltamuth (MANZANO, 2014). Uma classe é um tipo de dado que se relaciona com a memória por referência. Quando um objeto é criado a partir de uma class, a variável ao objeto associado possui apenas uma referência aos atributos da class. Quando a class é atribuída a uma nova variável, o conteúdo da estrutura usado pela nova variável é o mesmo referenciado para a variável anterior. Assim, se definirmos dez variáveis com base na mesma class, teremos dez variáveis referenciadas a partir do mesmo local de memória. As alterações feitas nos dados de uma das variáveis refletirão automaticamente nas demais variáveis, porque todas as variáveis usam uma área comum de memória estabelecida pela class (DEITEL; DEITEL, 2003). Dentro da unidade lógica class, são definidos os atributos que serão manipulados no programa, os quais são representados basicamente por campos (posições que representam o conteúdo a ser armazenado na unidade lógica, ou seja, as características definidas na classe ou estrutura) e métodos (as sub-rotinas de procedimentos ou funções 15 usadas para validar e operacionalizar o conteúdo da unidade lógica, ou seja, as operações associadas à classe ou à estrutura). A Figura 3 ilustra a construção de uma classe chamada Aluno, contendo os campos nome, nota e média. No início do código, são utilizadas as diretivas using, que servem para listar os namespaces que o aplicativo usará com frequência e evitar que o programador tenha que especificar um nome totalmente qualificado sempre que um método contido é usado. Um namespace serve para organizar um conjunto de classes, controlando a visibilidade de nomes dentro de um programa e agrupando classes e tipos. Assim como no Java, são utilizados os mesmos modificadores de acesso (public, private e protected), e os campos, nesse exemplo, são public (público). O método CalcMedia foi definido contendo as variáveis locais Soma e Média, do tipo float. Figura 3 – Implementaçãode classe em C# Fonte: adaptada de Manzano (2014, p. 125). 16 Para utilizar os atributos e os métodos de uma classe, conforme a Figura 4, é necessário que se instancie um objeto da classe, especificando os acessos às suas propriedades. Isso é realizado pela classe Program, na função principal main(), na linha Aluno a = new Aluno(). Uma vez que o objeto a é instanciado, é possível o acesso aos atributos da classe Aluno por meio do uso do ponto (.), como a.nome, para acessar o nome, e a.nota, para acessar a nota. Console.Write() é uma função de saída utilizada para solicitar e exibir dados ao usuário do sistema. Figura 4 – Instanciação de objetos em C# Fonte: adaptada de Manzano (2014, p. 125). 17 O conceito de herança está relacionado ao fato de uma classe herdar de outra classe suas características. Assim, uma classe-filho (subclasse) herda da classe-pai (superclasse) todos os campos e métodos que sejam públicos a ele. Se os componentes de uma classe-pai forem privados, não ocorrerá a definição de herança, mas, se os componentes forem protegidos, estes serão herdados, mas necessitarão de métodos específicos para fazer o acesso de escrita e leitura nos campos associados. Esse modo de visibilidade pública, privada ou protegida é chamado de encapsulamento (MANZANO, 2014). A Figura 5 ilustra a criação de duas classes em C#: a classe SalaAula (pai) e a classe Aluno (filha). Para que se determine que uma classe é filha e, consequentemente, herde seus comportamentos, são utilizados os dois- pontos (:). Assim, ao escrever Aluno : SalaAula, especifica-se que Aluno é filho de SalaAula. Dessa forma, os atributos e os métodos públicos são herdados e podem ser instanciados. 18 Figura 5 – Herança em C# Fonte: adaptada de Manzano (2014, p. 127). Neste tema, aprendemos sobre o paradigma de programação orientado a objetos e como utilizar as linguagens de programação orientada a objetos Java e C#. Referências Bibliográficas DEITEL, P.; DEITEL, H. Java Como Programar. 10. ed. São Paulo: Pearson Education do Brasil, 2017. 19 DEITEL, P.; DEITEL, H. C# Como Programar. São Paulo: Pearson Universidades, 2003. MANZANO, J. A. N. G. Programação de Computadores com C#. São Paulo: Érica, 2014. 20 Procedimento de programação orientada a objeto: Python e Ruby Autoria: Thiago Salhab Alves Leitura crítica: Anderson Paulo Avila Santos Objetivos • Aprender sobre o histórico de Python e Ruby. • Aprender a utilizar a linguagem de programação orientada a objetos Python. • Aprender a utilizar a linguagem de programação orientada a objetos Ruby. 21 1. Programação Orientada a Objetos com Python e Ruby É interessante pensar na possibilidade de aproximar a programação de computadores dos aspectos presentes no mundo real. O paradigma de programação orientado a objetos proporcionou diminuir o gap semântico, que é a distância que existe entre o problema do mundo real e o modelo abstrato construído. Neste tema, veremos a linguagem Python e Ruby, aprendendo os conceitos de programação orientada a objetos nas respectivas linguagens. A linguagem Python foi criada no final de 1989, por Guido van Rossum, com a colaboração de muitos desenvolvedores ao redor do mundo (BANIN, 2018). Python é uma linguagem de uso geral, projetada especificamente para tornar os programas legíveis, possuindo uma rica biblioteca e permitindo a criação de aplicações sofisticadas usando código simples (PERKOVIC, 2016). A Python apresenta as seguintes características (BANIN, 2018): • Portabilidade: o código-fonte da linguagem foi escrito em linguagem ANSI C, e o interpretador Python, assim como as bibliotecas-padrão, está disponível para uma grande quantidade de plataformas, tais como Linux, Windows, MacOS, BeOS, entre outras, podendo ser executado em qualquer uma dessas plataformas. • Código livre (opensource): a Python pode ser utilizada e distribuída livremente, e o código-fonte pode ser alterado sem restrições. • Simplicidade com robustez: a Python é uma linguagem simples, mas possui recursos para desenvolver projetos sofisticados, tais como as linguagens, como C, C++ e Java, podendo acessar bancos 22 de dados, usar redes, trabalhar com recursos multimídia, entre outros. • Fácil de aprender: a Python é fácil de aprender, pois apresenta uma sintaxe clara e direta e que não depende do entendimento de outras linguagens, sendo indicada para iniciar estudos em programação. • Grande aplicabilidade: a Python pode ser utilizada para o desenvolvimento de ferramentas para a administração e a interface com sistemas operacionais; aplicações que trabalhem com grandes volumes de dados armazenados em sistemas gerenciadores de bancos de dados, como Oracle, SQL Server, MySQL e outros; aplicações gráficas e multimídia; desenvolvimento de jogos digitais; programação para internet; desenvolvimento de software para engenharia; e aplicações científicas. Assim como a linguagem Python, outra linguagem que se destaca é a linguagem Ruby, que foi criada por Yukihiro Matsumoto, em 1995, no Japão, e apresenta as seguintes características (MCGAVREN, 2015): • Fácil de aprender e usar. • Flexível o bastante para qualquer tarefa de programação. • Mantem o programador concentrado no problema que está tentando resolver. • É orientada a objetos. Desde que a linguagem Ruby foi lançada, a comunidade Ruby desenvolveu coisas surpreendentes (MCGAVREN, 2015): • Construiu uma vasta coleção de bibliotecas Ruby que podem ajudar a fazer qualquer coisa, desde ler arquivos Comma Separed Values (CSV) até controlar objetos na rede. 23 • Escreveu interpretadores alternativos que podem rodar o código Ruby mais rápido ou integrá-los com outras linguagens; • Criou o Ruby on Rails, um framework muito popular para aplicações web. 1.1 Python A instalação da Python, segundo Banin (2018), é um procedimento rápido, simples e seguro. A comunidade Python é muito dinâmica e engajada e, com isso, há muito material de apoio sendo produzido. A documentação básica é o Python Docs, sendo a fonte de referência primária para os programadores que trabalham ou querem aprender a usar a linguagem. A linguagem Python permite que os desenvolvedores definam classes, as quais são projetadas para uma determinada tarefa, tornando o programa de aplicação mais intuitivo e com maior facilidade para ler e manter. Uma classe oferece métodos que podem ser aplicados aos objetos da classe e encapsula como os dados contidos nos objetos são armazenados e como os métodos das classes são implementados (PERKOVIC, 2016). A Python é uma linguagem interpretada, e, diferentemente das linguagens C e Java, que usam chaves para a marcação de blocos de código, nela a indentação é utilizada para determinar os blocos. A Python também possui tipagem dinâmica e fortemente tipada dos dados. Uma variável em Python não pode ser utilizada sem ter sido inicializada, pois não existe criação automática de variáveis. As variáveis podem ser iniciadas da seguinte forma: 24 • a, b = 10, 20 – A variável a recebe o valor 10 e a variável b recebe o valor 20. • O valor nulo (null) em Python pode ser usado como None, que é equivalente ao null. Pode-se utilizar da seguinte forma: valor = None. A variável valor é iniciada com valor nulo (None). As saídas na linguagem Python são realizadas por meio do comando print e a entrada por meio do comando input, conforme o exemplo a seguir: nome = input(“Qual o seu nome?”) pergunta = input(“Qual a sua pergunta?”) print(“Seu nome é %s e sua pergunta é %s.” %(nome, pergunta)) As variáveis nome e pergunta recebem as entradas por meio da função input(), sendo o nome e a pergunta, respectivamente. A função print() imprime o conteúdo das variáveis nome e pergunta. A linguagem Python também utiliza endentação como delimitação de bloco; portanto, o código deve estar endentado corretamente. A seguir temos um código endentado de forma incorreta: def mensagem(): valor = 10 return valor print(mensagem())O código endentado correto deve ser feito da seguinte forma: def mensagem(): valor = 10 return valor 25 print(mensagem()) Com a endentação correta, o código está delimitado corretamente e é utilizado para a delimitação de bloco. Os tipos básicos de Python são: • Números: int, ling, float. • Strings: str e unicode. • Listas e tuplas: list, tuple. • Arquivos: file. • Booleanos: bool (True, False). • Conjuntos: set. A Python utiliza o controle de fluxo (condicionais) da seguinte forma: if expressão == True: print(“true) else: print(“false) Se a expressão apresenta um resultado verdadeiro, o bloco verdadeiro é ativo, imprimindo o valor true; se apresenta um falso, imprime o valor falso. O if pode apresentar mais opções condicionais, sendo utilizado o comando if elif da seguinte forma: if resposta < 5: return 1 26 elif resposta < 5: return -1 else: return 0 No código anterior, se a resposta for maior que 5, então o retorno é 1; se (elif) a resposta for menor que 5, então o retorno é -1. No último caso, se a resposta não for maior que 5 nem menor que 5, o retorno é 0. A programação Orientada a Objetos é um paradigma que permite a portabilidade e modularidade do código, realizando a organização dos programas de aplicação em componentes conhecidos por classes e objetos. Um namespace é associado a cada classe Python e seu nome é o nome da classe. Além disso, ele armazena os nomes dos atributos de classe. Consideremos como exemplo a definição de uma classe Pessoa conforme a Figura 1. Para que se defina uma classe, utiliza-se a palavra reservada class seguida do nome da classe e de dois-pontos. Para criar um método, é utilizada a palavra reservada def e entre parênteses estão os parâmetros, incluindo o parâmetro obrigatório self, que deve estar presente em todos os métodos. O construtor é um método reservado chamado _init, e o parâmetro self é obrigatório. A palavra reservada self serve para referenciar o próprio objeto(instância) tanto ao se fazer uso de métodos quanto ao utilizar atributos pertencentes a esse objeto. O corpo do método deve sempre estar indentado, como é determinado pela sintaxe da linguagem. Foram criados os métodos e o get de todos os atributos da classe Pessoa, que são responsáveis por modificar ou retornar os atributos dessa classe. 27 Figura 1 – Definição e uso de Classe em Python Fonte: elaborada pelo autor. Em Python, também pode ser implementado o conceito de Herança, que ocorre quando uma classe filha herda características e métodos de uma classe pai sem impedir que a classe filha possua seus próprios métodos e atributos. Consideremos como exemplo a herança entre as classes PessoaFisica e PessoaJuridica que herdam Pessoa. A Figura 2 ilustra o exemplo de herança em Python entre a classe Pessoa (pai) e PessoaFisica (filha). Primeiro é necessário importar a classe pai (from pessoa import Pessoa), em que Pessoa é o nome do arquivo em que a classe pai (Pessoa) foi criada. Em seguida, define-se a classe filha herdando a classe pai (class PessoaFisica(Pessoa)), em que PessoaFisica é o nome da classe filha e Pessoa é a classe pai. Um novo construtor é 28 criado (def __init__(self, cpf, nome, rg,idade) e invoca-se o construtor da classe pai em super().__init__(nome, rg, idade). A classe filha possui seus próprios atributos self.cpf = cpf e seus próprios métodos setters e getters em def setCpf(self, cpf): self.cpf = cpf e def getCpf(self): return self.cpf. Figura 2 – Herança em Python por meio da classe PessoaFisica Fonte: elaborada pelo autor. A Figura 3 ilustra o exemplo de herança em Python entre a classe Pessoa (pai) e PessoaJuridica (filha). Primeiro é necessário importar a classe pai (from pessoa import Pessoa), em que Pessoa é o nome do arquivo em que a classe pai (Pessoa) foi criada. Em seguida, define-se a classe filha herdando a classe pai (class PessoaJuridica(Pessoa)), em que PessoaJuridica é o nome da classe filha e Pessoa é a classe pai. Um novo construtor é criado (def __init__(self, cnpj, nome, rg,idade) e invoca- se o construtor da classe pai em super().__init__(nome, rg, idade). A classe filha possui seus próprios atributos self.cnpj = cnpj e os próprios métodos setters e getters em def setCnpj(self, cnpj): self.cnpj = cnpj e def getCnpj(self): return self.cnpj. 29 Figura 3 – Herança em Python por meio da classe PessoaJuridica Fonte: elaborada pelo autor. 1.2 Ruby A linguagem Ruby foi inspirada em outras linguagens, como Perl, Smalltalk e List. Ela foi criada por Yukihiro Matsumoto, em 1995, no Japão, tendo sua disseminação por meio do principal framework MVC, o Ruby on Rails (SOUZA, 2014). Sobre a instalação da Ruby, se o sistema operacional for Windows, a forma mais simples de instalar é utilizando uma versão RubyInstaller. Os usuários de Linux podem fazer a instalação utilizando o apt-get install, abrindo um terminal e digitando: sudo apt-get install ruby2.7.1. No Mac OS, a Ruby já vem instalada, sendo necessário só abrir o terminal e executar ruby-v. A Ruby é uma linguagem totalmente orientada a objetos, em que tudo é considerado um objeto, até mesmo os tipos básicos da linguagem, obtendo grandes benefícios ao manter o conjunto de informações e os métodos que operam sobre essas informações em um mesmo lugar. Para isso, é necessário utilizar as classes, por meio de atributos (características) e métodos (funcionalidades). A linguagem Ruby é dinamicamente, implicitamente e fortemente tipada, isto é, a cada 30 interação o tipo é verificado, a Ruby detecta o tipo automaticamente e todas as variáveis possuem um tipo. A Figura 4 ilustra a criação de uma classe Usuário na linguagem Ruby. Dois atributos nome e senha são definidos, como attr_reader, permitindo a leitura direta de seus valores. A criação de um método é realizada por meio do comando def. São criados dois métodos para atribuir valores às variáveis, recebendo os dados por parâmetro (nome e senha). Se o parâmetro estiver vazio, a função de validação de dados apresentará a mensagem que os dados não podem ficar em branco. Os métodos visualiza_nome e visualiza_senha apresentam, respectivamente, os nomes e as senhas cadastrados. Para criar uma instância da classe Usuario, é necessário utilizar o operador new, como em usuario = new Usuario. Uma vez instanciado o objeto, é possível acessar os métodos, atribuindo o nome (Thiago) e a senha (123456), e visualizá-los, chamando o método visualiza_nome e visualiza_senha. 31 Figura 4 – Orientação a Objetos em Ruby Fonte: elaborada pelo autor. Alguns pontos importantes sobre a linguagem de programação Ruby (MCGAVREN, 2015): 32 • Um corpo de método consiste em uma ou mais instruções Ruby que serão executadas quando o método for chamado. • Parênteses devem ser deixados de fora de uma definição de método se (e somente se) não estiver sendo definido nenhum parâmetro. • Se não for especificado um valor de retorno, os métodos retornarão o valor da última expressão avaliada. • Definições de método que aparecem em uma definição de classe são tratadas como métodos de instância para essa classe. • Fora de uma definição de classe, as variáveis de instância podem ser acessadas apenas por métodos acessadores. • É possível chamar os métodos attr_writer, attr_reader e attr_accessor dentro de sua definição de classe como um atalho para definir métodos de acessador. • Os métodos do acessador podem ser usados para garantir que os dados sejam válidos antes de serem armazenados nas variáveis de instância. • O método raise pode ser chamado para relatar um erro no programa. A linguagem Ruby possibilita o uso de herança entre classes, permitindo que o programador crie uma classe filha, que é uma especialização da classe pai. A Figura 5 ilustra a herança em Ruby. A classe Pessoa (pai) possui os atributos nome, sobrenome e CPF com o método construtor (def initialize), recebendo por parâmetro os dados e realizando a atribuição às respectivasvariáveis. O método nome_completo exibe o nome e o sobrenome. A classe Empregado é filha da classe Pessoa. A herança é definida utilizando o sinal de menor (class Empregado < Pessoa). A classe Empregado possui seus atributos cargo e salário. Ao 33 instanciar um empregado (empregado = Empregado.new), o construtor do pai (Pessoa) é chamado, enviando nome, sobrenome e CPF. Figura 5 – Herança em Ruby Fonte: elaborada pelo autor. 34 Neste Tema, vimos as linguagens Python e Ruby e aprendemos sobre os conceitos de programação orientada a objetos nas respectivas linguagens. Referências Bibliográficas BANIN, S. L. Python 3: conceitos e aplicações – uma abordagem didática. São Paulo: Érica, 2018. MCGAVREN, J. Head First Ruby: A Brain Friendly Guide. Sebastopol: O’Reilly, 2015. PERKOVIC, L. Introdução à computação usando Python: um foco no desenvolvimento de aplicações. Rio de Janeiro: LTC, 2016. SOUZA, L. Ruby: Aprenda a programar na linguagem mais divertida. São Paulo: Casa do Código, 2014. 35 Modelagem de banco de dados e o projeto do fluxo de dados Autoria: Thiago Salhab Alves Leitura crítica: Anderson Paulo Ávila Santos Objetivos • Aprender sobre o projeto de banco de dados. • Aprender sobre o modelo conceitual do banco de dados. • Aprender sobre o projeto lógico do banco de dados. 36 1. Modelagem de banco de dados e o projeto do fluxo de dados É interessante parar para pensar na possibilidade de vivermos hoje sem o uso de sistemas e o armazenamento de dados para posterior consulta e utilização. Como seria o trabalho dos grandes hipermercados, por exemplo, tendo que controlar todo o estoque de produtos manualmente? Graças ao uso de banco de dados e sistemas gerenciadores de dados, vinculados a modernos sistemas de informação, o trabalho e o controle dos dados se tornaram muito mais eficientes. Neste tema, estudaremos sobre o projeto de banco de dados e os modelos utilizados, sendo os modelos conceituais e lógico do banco de dados. Um Banco de Dados ou uma Base de Dados é uma coleção de dados logicamente relacionados que embute um determinado significado, não podendo associações aleatórias de dados serem chamadas de base de dados. Em outras palavras, é uma coleção de dados relacionados organizada de maneira a possibilitar a fácil manipulação de dados. Uma base de dados representa um aspecto do mundo real chamado de “minimundo”. Mudanças no minimundo provocam mudanças na base de dados (ELMASRI; NAVATHE, 2019). Há também os Banco de Dados não relacionais, que apresentam como diferencial a oferta de melhor performance e alta escalabilidade, garantindo um gerenciamento mais eficiente, com linguagem NoSQL. Todas as informações no banco de dados não relacional ficam agrupadas em um único registro. Sendo assim, podemos partir dos seguintes conceitos: 1. Dado (representação da informação): fato do mundo real que está registrado e possui um significado implícito no contexto 37 de um domínio de aplicação. Exemplos: endereço, data de nascimento, filhos. 2. Informação (significado do dado): fato útil que pode ser extraído direta ou indiretamente a partir dos dados. Exemplos: endereço e idade da pessoa; ela tem filhos? Os Bancos de Dados fazem parte do nosso cotidiano, como em: • Operações Bancárias. • Matrícula na Universidade. • Reserva de Hotel. • Controle de Estoque de uma Empresa. • Comércio Eletrônico. Um Sistema Gerenciador de Banco de Dados (SGBD) é uma coleção de programas que permite aos usuários criarem, manipularem e gerenciar uma base de dados. A base de dados e o SGBD juntos compõem o chamado Sistema de Base de Dados. Exemplos: Oracle, DB2, Paradox, Postgres, MySQL, SQL Server, MongoDB etc. (SILBERCHATZ; KORTH; SUDARSHAN, 2012). O SGBD é um software que controla os acessos ao banco de dados e possibilita uma interface de usuário para usar o sistema de banco de dados. Ele isola dos usuários os detalhes do banco de dados (abstração de dados) e possibilita independência de dados às aplicações (estrutura física de armazenamento) e à estratégia de acesso. O SGBD apresenta as seguintes vantagens (ELMASRI; NAVATHE, 2019): • Rapidez na manipulação e no acesso à informação. • Redução do esforço humano (desenvolvimento e utilização). 38 • Redução da redundância e inconsistência de informações. • Compartilhamento de dados. • Aplicação automática de restrições de segurança. Um Modelo de Dados é usado para descrever a estrutura de um banco de dados, as operações para manipular essas estruturas e certas restrições que o banco de dados deve obedecer (ELMASRI; NAVATHE, 2019). Ele oferece uma maneira de descrever o projeto de um banco de dados no nível físico, lógico e de visão. Sendo assim, um projeto de banco de dados é a atividade de modelagem de dados em diversos níveis de abstrações, compreendendo desde a identificação dos dados a serem armazenados até a escolha de estruturas de dados adequadas. 1.1 Projeto Conceitual No projeto conceitual, descreve-se o conteúdo da informação sem se preocupar com detalhes de armazenamento. O esquema conceitual apresenta a descrição de alto nível da estrutura do banco de dados, utilizando um modelo conceitual e representando a relação entre os dados. O modelo conceitual é a linguagem usada para descrever esquemas conceituais. Exemplo: Modelo Entidade-Relacionamento (ELMASRI; NAVATHE, 2019). O Modelo Entidade-Relacionamento (MER) é um modelo semântico, proposto em 1976 por Peter Chen, que apresenta uma simbologia muito simples que pode ser utilizada para a validação com o cliente. A Figura 1 ilustra os elementos visuais que são utilizados no MER. 39 Figura 1 – Elementos visuais do MER Fonte: elaborada pelo autor. No MER alguns elementos são representados (ELMASRI; NAVATHE, 2019): • Entidade: representa um conjunto de objetos semelhantes no mundo real. Exemplo: Professores, Carros, Livros. No MER, uma entidade é representada por um retângulo. • Atributos: representam propriedades de uma entidade ou de um relacionamento. Exemplo: Nome, CPF, Autor, Título. No MER, os atributos são representados por elipses. • Relacionamento: representa uma associação entre entidades. Exemplo: Compra – Um cliente compra vários Livros, mas um livro é comprado por, no máximo, um cliente. No MER, os relacionamentos são representados por losangos ligando duas entidades. 40 • Cardinalidade: corresponde aos relacionamentos que existem entre as entidades. Eles podem ser de um para um (1 – 1), em que uma entidade se relaciona exatamente com uma outra entidade; de um para muitos (1 – N), em que uma entidade se relacionamento com muitas outras entidades; e de muitos para muitos (N – N), em que muitas entidades se relacionam com muitas outras entidades. Um atributo chave (chave primária) é um atributo que identifica unicamente uma entidade sendo seu identificador. Exemplo: CPF para pessoas, RA para alunos, CRM para médicos etc. Um atributo chave estrangeira é um atributo chave primária em uma entidade e, por conta do relacionamento, aparece em outra entidade. A Figura 2 ilustra o exemplo da entidade Médico, que possui os atributos Nro (chave primária da tabela e sublinhado), nome, idade, sexo, endereço e salário se relacionando com a entidade Exames. O relacionamento é de um para muitos (1 – N), isto é, um médico realiza muitos exames, mas um exame é realizado por um médico. Figura 2 – Exemplo de MER com seus elementos Fonte: elaborada pelo autor. A Figura 3 ilustra a representação dos tipos de atributos, os quais podem ser representados da seguinte forma: 41 • Simples e monovalorados: são atributos indivisíveis, que assumem um único valor para cada elemento. Exemplo: nome, sexo etc. • Simples e multivalorados: uma única entidade tem diversos valores para esse atributo. Exemplo: telefone, motorista etc. • Compostos e monovalorados: formados por um ou mais subatributos. Exemplo: endereço (rua, número, bairro e CEP). • Compostos e multivalorados:uma entidade tem diversos valores formados por um ou mais subatributos. Exemplo: autor com prenome e sobrenome. Figura 3 – Representação dos tipos de atributos Monovalorado Multivalorado Simples Composto Fonte: elaborada pelo autor. A Figura 4 ilustra a representação de uma entidade Pessoa, que possui a chave primária CPF; os atributos simples e monovalorados (nome, nro e data_nascimento); o atributo composto endereço (composto de estado, cidade, rua, nro e bairro); atributo multivalorado (telefone); e atributo derivado (idade), que é derivado de data_nascimento. 42 Figura 4 – Representação de entidade com todos os tipos de atributo Fonte: elaborada pelo autor. O MER permite representar a participação das entidades no relacionamento, o que é conhecido por restrição de participação, que pode ser parcial (uma única linha), em que parte das instâncias da entidade pertencem ao relacionamento, e total (linha dupla), quando toda a instância da entidade pertence ao relacionamento. A Figura 5 ilustra o relacionamento da entidade cliente com serviço. Do lado do cliente, a participação é total, indicando que ele comprou ao menos um serviço; e, do lado de serviço, a participação é parcial, indicando que nem todos os serviços são comprados por clientes. Figura 5 – Representação de participação parcial e total das entidades Fonte: elaborada pelo autor. 43 O MER pode representar entidades fracas, que são aquelas que dependem da existência de outras entidades para existir, não possuindo chave primária, e sim um atributo identificador parcial. A Figura 6 ilustra a entidade fraca dependente, simbolicamente representada por um retângulo duplo. Essa entidade não possui chave primária, e sim um atributo identificador parcial (nome). O losango que representa o relacionamento também é duplo. Ela é dependente, ou seja, necessita de responsável para poder existir (SILBERCHATZ; KORTH; SUDARSHAN, 2012). Figura 6 – Representação de entidade franca no MER Fonte: elaborada pelo autor. Já a Figura 7 ilustra um exemplo completo de MER. A entidade Empregado possui os atributos Nss (chave primária), atributo composto nome (composto por Pnome, Mnome e Snome), endereço, salário e datanasc. Essa entidade se autorrelaciona com Empregado, em que um empregado supervisiona muitos empregados. A entidade Departamento possui os atributos Número (chave primária) e Nome e o atributo multivalorado Localização. As entidades Empregado e Departamento se relacionam no papel de trabalha-para, em que o empregado trabalha em um departamento, enquanto o departamento tem trabalhando muitos empregados. No papel de gerência, o empregado gerencia um departamento e o departamento é gerenciado por um empregado. A 44 entidade Projeto possui as entidades Número (chave primária), Nome e Localização. A entidade Projeto se relaciona com Empregado, em que um empregado Trabalha em muitos projetos, enquanto um projeto tem trabalhando muitos empregados. A entidade fraca Dependente depende da existência da entidade Empregado, possuindo como chave identificadora parcial o Nome e os atributos Sexo, DataNasc e TipoRelação. O dependente depende de um empregado e o empregado pode ter muitos dependentes. Figura 7 – MER Fonte: elaborada pelo autor. 1.2 Projeto Lógico No projeto lógico, avalia-se o esquema conceitual diante das necessidades do uso de banco de dados, realizando refinamentos para aumentar o desempenho das operações sobre o banco de dados. O 45 esquema lógico é a descrição de uma estrutura de um banco de dados (usando um modelo lógico), que pode ser processada por SGBD. O Modelo Lógico é um diagrama visual que ilustra como o programa funcionará para atender às necessidades identificadas de um cliente. Exemplo: Modelo Lógico Relacional (ELMASRI; NAVATHE, 2019). O Projeto Lógico do Banco de Dados consiste em mapear as entidades e os relacionamentos para o esquema relacional, sendo apresentado em cinco passos (ELMASRI; NAVATHE, 2019): • Passo 1: para cada entidade regular E no MER, criar uma relação contendo todos os atributos simples de E; para os atributos compostos, incluir apenas os atributos simples que compõem o atributo composto. Para os atributos multivalorados m, criar uma relação contendo esse atributo m e a chave primária ch da relação original. A Figura 8 ilustra o mapeamento para o esquema relacional das entidades e dos atributos. Figura 8 – Mapeamento de Atributos para o Esquema Relacional Fonte: elaborada pelo autor. Carro (placa, cor, ano, modelo, potência) CarroRevisao (placa, km, oficina) CarroMotorista (placa, motorista) 46 Audiodescrição: a imagem mostra o mapeamento para o esquema relacional das entidades e dos atributos. • Passo 2: para cada entidade fraca W no Modelo Entidade Relacionamento com identificação da entidade E, criar uma relação R que inclua todos os atributos simples de W como atributos de R. Incluir como chave estrangeira de R a chave primária da relação que corresponde ao tipo de entidade de identificação. A chave primária de R é a combinação da chave primária da entidade de identificação e a chave principal da entidade fraca W. A Figura 9 ilustra o mapeamento para o esquema relacional da entidade fraca Dependente. Figura 9 – Mapeamento de Entidade Fraca para o Esquema Relacional Fonte: elaborada pelo autor. Passo 3: em relacionamentos de um para um (1:1), criar as relações S e T, que correspondem às entidades participantes do relacionamento R. Escolher uma das relações, por exemplo S, e incluir como chave estrangeira de S a chave primária de T. Escolher o tipo de entidade com participação total em R, como a relação S. Incluir todos os atributos simples do relacionamento como atributos de S. A Figura 10 ilustra o mapeamento para o esquema relacional do relacionamento de um 47 para um, com a propagação da chave estrangeira (nroEmp) da entidade Empregado para Departamento. Figura 10 – Mapeamento de Relacionamento um para um (1:1) para o Esquema Relacional Fonte: elaborada pelo autor. Passo 4: em relacionamento de um para muitos (1:n), identificar a relação S que representa a entidade que participa do lado N do relacionamento. Incluir como chave estrangeira de S a chave primária da relação T, que representa a outra entidade que participa do relacionamento. A Figura 11 ilustra o mapeamento para o esquema relacional do relacionamento de um para muitos, com a propagação da chave estrangeira (nrodept) da entidade Departamento para Empregado. 48 Figura 11 – Mapeamento de Relacionamento um para muitos (1:N) para o Esquema Relacional Fonte: elaborada pelo autor. Passo 5: em relacionamento de muitos para muitos (n:n), criar uma nova relação S para representar o relacionamento. Incluir como chave primária de S as chaves primárias das relações participantes. Incluir qualquer atributo simples do relacionamento como atributos de S. A Figura 12 ilustra o mapeamento para o esquema relacional do relacionamento de muitos para muitos, criando uma nova relação (TrabalhaEm) que contém a chave estrangeira das duas entidades. 49 Figura 12 – Mapeamento de Relacionamento muitos para muitos (N:N) para o Esquema Relacional Fonte: elaborada pelo autor. Neste Tema, aprendemos sobre o projeto de Banco de Dados e os modelos conceituais e lógicos de banco de dados. Referências Bibliográficas ELMASRI, R.; NAVATHE, S. B. Sistemas de Banco de Dados. 7. ed. São Paulo: Pearson Education, 2019. SILBERCHATZ, A.; KORTH, H. F.; SUDARSHAN, S. Sistema de Banco de Dados. 6. ed. São Paulo: Campus, 2012. 50 Procedimentos de programação em banco de dados utilizando a linguagem SQL Autoria: Thiago Salhab Alves Leitura crítica: Anderson Paulo Avila Santos Objetivos • Aprender sobre os procedimentos de programação em banco de dados. • Aprender sobre a linguagem SQL. • Aprender a programar utilizando a linguagem SQL. 51 1. Programação em Banco de Dados utilizando SQL É interessante parar para pensarcomo são criados os bancos de dados que armazenam os dados dos sistemas utilizados nas Universidades com os dados de alunos; no comércio eletrônico, com dados de produtos; entre outros sistemas. Graças à linguagem de programação SQL e a seus principais comandos para definição e manipulação de dados, o trabalho de criação e manipulação de banco de dados se tornou mais eficiente e seguro. Neste tema, serão apresentados os procedimentos de programação em banco de dados. Aprenderemos sobre a linguagem SQL e a programação, utilizando os principais comandos SQL. A linguagem Structured Query Language (SQL), em português Linguagem de Consulta Estruturada, é considerada como um dos principais motivos para o sucesso de bancos de dados relacionais comerciais. Inicialmente chamada de Structured English QUEry Language (SEQUEL), foi criada e implementada na IBM Research como a interface para um sistema de banco de dados relacional experimental, chamado de SYSTEM R (ELMASRI; NAVATHE, 2019). A SQL é a linguagem padrão para SGBDs (Sistemas Gerenciadores de Banco de Dados) relacionais comerciais. O esforço conjunto entre o American National Standards Institute (ANSI) e a International Standars Organization (ISO) levou a uma versão padrão da SQL (ANSI), de 1986, chamada de SQL-86 ou SQL1. Já um padrão revisado e expandido levou à SQL-92, também conhecida por SQL2. O próximo padrão foi o SQL:1999, ou SQL3. Duas atualizações posteriores ao padrão são a SQL: 2003 e SQL: 2006, que acrescentou recursos de XML, e atualizações em 2008 e 2016 (SILBERCHATZ; KORTH; SUDARSHAN, 2012). 52 A SQL é uma linguagem para banco de dados com instruções para definição de dados, consultas e atualizações. Assim, possui um conjunto de comandos para a definição de dados DDL (Data Definition Language), contendo os comandos CREATE, ALTER e DROP, e para a manipulação de dados DML (Data Manipulation Language), contendo os comandos INSERT, UPDATE, DELETE E SELECT. A SQL também apresenta comandos para o controle de dados DCL (Data Control Language), que são utilizados para controlar a autorização de dados e as licenças de usuários, contendo os comandos GRANT (autoriza o usuário a executar operações) e REVOLKE (remove a autorização de um usuário para executar operações), e o os comandos para transação de dados DTL (Data Transaction Language), sendo responsáveis por gerenciar transações ocorridas em um banco de dados, contendo os comandos BEGIN TRANSACTION, que marca o começo de uma transação no banco de dados; COMMIT, que envia os dados da transação ao banco de dados de forma permanente; e ROLLBACK, que desfaz as alterações feitas na transação realizada. 1.1 Criando um Banco de Dados e Tabelas O principal comando DDL é o CREATE, que pode ser usado para criar esquemas e tabelas. As primeiras versões do SQL não incluíam o conceito de esquema de banco de dados, sendo introduzido a fim de agrupar tabelas e outras construções que pertencem à mesma aplicação de banco de dados. O esquema SQL é identificado por um nome de esquema, por exemplo: a instrução a seguir apresentada na Figura 1 cria um esquema chamado EMPRESA (ELMASRI; NAVATHE, 2019): 53 Figura 1 – Criação de schema 1 create schema empresa; Fonte: elaborada pelo autor O comando CREATE TABLE é utilizado para criar uma nova tabela (relação), atribuindo um nome e especificando seus atributos e restrições. Os atributos são os primeiros a serem especificados, em que cada um recebe um nome e um tipo de dado e restrições como o NOT NULL (atributo não pode ficar vazio). A criação de uma tabela Funcionário é realizada da seguinte forma: Figura 2 – Sintaxe para criação de uma tabela • CREATE TABLE FUNCIONARIO; Fonte: elaborada pelo autor. Os tipos de dados básicos que são utilizados nos atributos são numéricos, cadeia de caracteres, cadeia de bits, booleano, data e hora. Os seguintes tipos são considerados (ELMASRI; NAVATHE, 2019): • Numérico: incluem números inteiros (INTEGER ou INT) e números reais (FLOAT e DOUBLE PRECISION). O formato dos números pode ser DECIMAL (i, j), em que i é a precisão (número de dígitos decimais) e j é a escala (número de dígito após o ponto decimal). • Cadeia de caracteres: são de tamanho fixo CHAR(n), em que n é o número de caracteres ou de tamanho variável VARCHAR(n). • Cadeia de bits: pode ser de tamanho fixo n BIT(n) ou de tamanho variável BIT VARYING (n), em que n é o número máximo de bits, sendo 1 o valor padrão para a cadeia de bits. Outro tipo de cadeia de bits de tamanho variável é o BLOB, usado para especificar colinas com grandes valores binários, como imagens. 54 • Booleano: o tipo booleano tem os valores TRUE (verdadeiro) ou FALSE (falso). • Data: o tipo de dado DATE possui dez posições e seus componentes são dia (DAY), mês (MONTH) e ano (YEAR) no formado DD-MM-YYYY. • Hora: o tipo de dado TIME (tempo) possui oito posições, com os componentes hora (HOUR), minuto (MINUTE) e segundo (SECOND) no formato HH:MM:SS. • Timestamp: o tipo de dados TIMESTAMP engloba os campos DATE e TIME. O comando DROP é utilizado para apagar esquemas e tabelas. Por exemplo, para remover o esquema Empresa, é utilizado o seguinte comando: Figura 3 – Sintaxe para apagar um schema 1 drop schema empresa; Fonte: elaborada pelo autor. Para excluir uma tabela, por exemplo, a tabela Dependente, é utilizado o seguinte comando: Figura 4 – Sintaxe para apagar uma tabela 1 drop table empresa; Fonte: elaborada pelo autor. Uma chave primária identifica um único registro armazenado na tabela. Para que um campo seja definido como chave primária, é utilizado primary key. Se considerarmos uma tabela pessoa, o identificador (chave primária) dessa tabela pode ser o CPF. 55 Figura 5 – Sintaxe para definir a chave primária de uma tabela Fonte: elaborada pelo autor. A chave estrangeira é utilizada para expressar o relacionamento que existe entre tabelas, sendo uma referência em uma tabela a uma chave primária de outra tabela. Consideremos, por exemplo, a tabela Carro. O relacionamento entre Pessoa e Carro é do tipo 1:N, pois uma Pessoa pode ter muitos Carros. Assim, a chave primária (CPF) de Pessoa aparece como chave estrangeria em Carro, conforme a Figura 6. Figura 6 – Sintaxe para definir a chave primária de uma tabela Fonte: elaborada pelo autor. A cláusula PRIMARY KEY especifica um ou mais atributos que definem a chave primária da relação. A cláusula UNIQUE define as chaves alternativas (secundárias), que é um identificador único dentro de uma relação que garante que nenhuma tupla será duplicada, e as chaves estrangeiras, que são chaves primárias de outras tabelas da relação, são definidas pela cláusula FOREIGN KEY. As Figuras 7 a 11 ilustram a criação, utilizando SQL, das tabelas Employee, Department, Dept_Locations, Project e Works_On. São definidos os campos, com 56 seus respectivos tipos e restrições. As chaves primárias e estrangeiras também foram definidas (ELMASRI; NAVATHE, 2019). Figura 7 – Criação da tabela Employee Fonte: elaborada pelo autor. Figura 8 – Criação da tabela Department Fonte: elaborada pelo autor. 57 Figura 9 – Criação da tabela Dept_Locations Fonte: elaborada pelo autor. Figura 10 – Criação da tabela Project Fonte: elaborada pelo autor. Figura 11 – Criação da tabela Works_On Fonte: elaborada pelo autor. 58 Uma tabela pode ter sua estrutura alterada por meio do comando ALTER. As ações possíveis são adicionar ou eliminar uma coluna (atributo), alterar a definição de uma coluna e adicionar ou eliminar restrições na tabela. A Figura 12 ilustra a alteração da tabela Employee adicionando a chave estrangeira no campo DNO, que tem como referência a tabela Department no campo DNUMBER. O uso de DELETE CASCADE e UPDATE CASCADE fará com que todas as restrições que fizerem referência a esse campo sejam apagadas e atualizadas. A tabela Employee recebe também a adição de um novo campo JOB (SILBERCHATZ; KORTH; SUDARSHAN,2012). Figura 12 – Alteração de tabelas utilizando a linguagem SQL Fonte: elaborada pelo autor. 1.2 Principais Comandos DML Após visualizarmos os comandos DDL, serão apresentados os comandos DML. Para a atualização de dados, os comandos INSERT, DELETE e UPDATE são utilizados. O comando INSERT permite a inserção de registros na tabela. A inserção é realizada conforme apresentado na Figura 13. A inserção deve obedecer à sequência de campos criados, sendo os campos definidos como CHAR, VARCHAR e DATE e inseridos entre aspas simples e os campos numéricos sem ASPAS. É possível escolher quais campos terão os dados inseridos, como, no segundo INSERT ,são inseridos apenas os registros para FNAME, LNAME e SSN, que são os campos que foram definidos como NOT NULL (ESMASRI; NAVATHE, 2019). 59 Figura 13 – Inserção de dados utilizando a linguagem SQL Fonte: elaborada pelo autor. O comando DELETE remove tuplas (registros ou linhas de dado) de uma relação. Incluir uma cláusula WHERE para selecionar as tuplas a serem eliminadas. A integridade referencial deve ser aplicada. As tuplas são excluídas da tabela somente uma de cada vez (a menos que a CASCADE for especificada em uma restrição de integridade referencial). A falta da cláusula WHERE especifica que todas as tuplas da relação devem ser excluídas. A cláusula WHERE é utilizada para definir a condição para a aplicação do comando; a tabela torna-se, então, uma tabela vazia. O número de tuplas excluídas depende do número de tuplas na relação que satisfazem a cláusula WHERE. A Figura 14 ilustra o uso do comando DELETE. A primeira instrução irá remover os registros da tabela Employee em que o campo LNAME for igual a Brown. A segunda instrução irá excluir os registros da tabela Employee em que o campo SSN for igual a 123456789. Já a terceira instrução irá excluir todos os registros da tabela Employee (ELMASRI; NAVATHE, 2019). Figura 14 – Exclusão de registros utilizando a linguagem SQL Fonte: elaborada pelo autor. O comando UPDATE usado para modificar os valores dos atributos de uma ou mais tuplas. Uma cláusula WHERE–seleciona as tuplas a serem modificadas. Um adicional de cláusula SET especifica os 60 atributos a serem modificados e seus novos valores. Cada comando modifica tuplas na mesma relação. A integridade referencial deve ser aplicada. A Figura 15 ilustra o uso do comando UPDATE para realizar atualizações. A primeira instrução atualiza o local e departamento de controle do projeto de número 10, alterando a localização do projeto para Bellaire e o número do departamento de controle para 5. A segunda instrução atualiza o salário de todos os empregados que trabalham no departamento Research, atribuindo 10% de aumento (ELMASRI; NAVATHE, 2019). Figura 15 – Atualização de registros utilizando a linguagem SQL Fonte: elaborada pelo autor. O comando SELECT é utilizado para a consulta de dados. O comando básico da declaração do SELECT é composto por três clausulas, SELECT, FROM e WHERE, e tem a seguinte forma (ELMASRI; NAVATHE, 2019): • SELECT <lista de atributos>. • FROM <lista de tabelas>. • WHERE <condição>. A lista de atributos é uma lista dos nomes dos atributos cujos valores são recuperados pela consulta. A lista de tabelas é uma lista dos nomes das relações necessárias para o processamento da consulta, e a condição é uma expressão condicional (booleana) que identifica as tuplas que serão recuperadas pela consulta. A Figura 16 ilustra a consulta de registros 61 utilizando o comando SELECT. Na primeira consulta, são recuperados a data de nascimento e o endereço do empregado de nome John B. Smith; na segunda consulta, são recuperados o nome e o endereço de todos os funcionários que trabalham para o departamento Research; e, na terceira consulta, são recuperados o número de projetos, o departamento de controle do projeto, o sobrenome, o endereço e a data de nascimento do gerente do departamento que está localizado em Stafford (ELMASRI; NAVATHE, 2019). Figura 16 – Consulta de registros utilizando a linguagem SQL Fonte: elaborada pelo autor. Em SQL, podemos usar o mesmo nome para dois (ou mais) atributos, desde que os atributos estejam em diferentes relações. Uma consulta que se refere a dois ou mais atributos com o mesmo nome deve qualificar o nome do atributo com o nome da relação, prefixando o nome da relação para o nome do atributo. Algumas consultas precisam disso para se referirem duas vezes à mesma relação. Nesse caso, aliases são dadas para o nome da relação. Consideremos, por exemplo, a seguinte situação apresentada na Figura 17: para cada empregado, vamos recuperar o nome do empregado e o nome do supervisor imediato. Foi criado um Alias para a entidade Employee por meio de EMPLOYEE AS E e EMPLOYEE AS S; dessa forma, o nome do atributo fica 62 qualificado. Ao visualizar E.FNAME ou S.LNAME, as letras E e S se referem à tabela EMPLOYEE (ELMASRI; NAVATHE, 2019). Figura 17 – Exemplo do uso do Alias nas consultas SQL Fonte: elaborada pelo autor. Para a codificação dos códigos SQL, é necessário o uso de um Sistema Gerenciador de Banco de Dados (SGBD), sendo um dos mais utilizados o MySQL. Para efetuar sua instalação, basta baixar a versão MySQL Community Server, que é uma versão de download gratuito e open source. Ele está disponível sob a licença General Public License (GPL) e recebe o suporte de uma imensa e ativa comunidade de desenvolvedores open source. É preciso escolher a plataforma na qual o MySQL vai rodar (Linux, Windows, Solaris e várias outras opções) e baixar o instalador do MySQL, já sendo possível instalá-lo e utilizá-lo. O MySQL é um serviço que fica rodando no sistema e que por padrão não possuí interface gráfica, mas permite a manipulação por linha de comando. Para realizar a instalação, é necessário as instruções da documentação do próprio MySQL. No Windows, basta utilizar o instalador, disponível na página de downloads, e seguir as instruções dele. Já no Linux existem as opções de instalar os binários, como em pacotes RPM, e a opção de baixar as fontes e compilá-las na máquina de destino do MySQL. Uma vez instalado o MySQL, para facilitar a sua utilização e o seu desenvolvimento de código SQL, há uma ferramenta integrada de desenvolvimento chamada MySQL Workbench (https://dev.mysql.com/ downloads/workbench/), que fornece recursos de modelagem e design https://dev.mysql.com/downloads/workbench/ https://dev.mysql.com/downloads/workbench/ 63 de banco de dados, desenvolvimento SQL, administração de banco de dados e migração de banco de dados. O MySQL Workbench, assim como o MySQL Community Server, é um software sob licença GPL e open source. Neste tema, aprendemos sobre os procedimentos de programação em banco de dados, a linguagem SQL e a programação, utilizando os principais comandos SQL. Referências Bibliográficas ELMASRI, R.; NAVATHE, S. B. Sistemas de Banco de Dados. 7. edição. São Paulo: Pearson Education, 2019. SILBERCHATZ, A.; KORTH, H. F.; SUDARSHAN, S. Sistema de Banco de Dados. 6. edição. São Paulo: Campus, 2012. 64 Bons estudos! Sumário Procedimento de programação orientada a objeto: Java e C# Objetivos 1. Programação Orientada a Objetos Referências Bibliográficas Procedimento de programação orientada a objeto: Python e Ruby Objetivos 1. Programação Orientada a Objetos com Python e Ruby Referências Bibliográficas Modelagem de banco de dados e o projeto do fluxo de dados Objetivos 1. Modelagem de banco de dados e o projeto do fluxo de dados Referências Bibliográficas Procedimentos de programação em banco de dados utilizando a linguagem SQL Objetivos 1. Programação em Banco de Dados utilizando SQL Referências Bibliográficas
Compartilhar