Prévia do material em texto
BANCO DE DADOS Professor Esp. Ronie Cesar Tokumoto Reitor Márcio Mesquita Serva Vice-reitora Profª. Regina Lúcia Ottaiano Losasso Serva Pró-Reitor Acadêmico Prof. José Roberto Marques de Castro Pró-reitora de Pesquisa, Pós-graduação e Ação Comunitária Profª. Drª. Fernanda Mesquita Serva Pró-reitor Administrativo Marco Antonio Teixeira Direção do Núcleo de Educação a Distância Paulo Pardo Coordenador Pedagógico do Curso Henrique Nieddermeyer Edição de Arte, Diagramação, Design Gráfico B42 Design *Todos os gráficos, tabelas e esquemas são creditados à autoria, salvo quando indicada a referência. Informamos que é de inteira responsabilidade da autoria a emissão de conceitos. Nenhuma parte desta publicação poderá ser reproduzida por qualquer meio ou forma sem autorização. A violação dos direitos autorais é crime estabelecido pela Lei n.º 9.610/98 e punido pelo artigo 184 do Código Penal. Universidade de Marília Avenida Hygino Muzzy Filho, 1001 CEP 17.525–902- Marília-SP Imagens, ícones e capa: ©envato, ©pexels, ©pixabay, ©Twenty20 e ©wikimedia F385m sobrenome, nome nome livro / nome autor. nome /coordenador (coord.) - Marília: Unimar, 2021. PDF (00p.) : il. color. ISBN xxxxxxxxxxxxx 1. tag 2. tag 3. tag 4. tag – Graduação I. Título. CDD – 00000 BOAS-VINDAS Ao iniciar a leitura deste material, que é parte do apoio pedagógico dos nossos queridos discentes, convido o leitor a conhecer a UNIMAR – Universidade de Marília. Na UNIMAR, a educação sempre foi sinônimo de transformação, e não conseguimos enxergar um melhor caminho senão por meio de um ensino superior bem feito. A história da UNIMAR, iniciada há mais de 60 anos, foi construída com base na excelência do ensino superior para transformar vidas, com a missão de formar profissionais éticos e competentes, inseridos na comunidade, capazes de constituir o conhecimento e promover a cultura e o intercâmbio, a fim de desenvolver a consciência coletiva na busca contínua da valorização e da solidariedade humanas. A história da UNIMAR é bela e de sucesso, e já projeta para o futuro novos sonhos, conquistas e desafios. A beleza e o sucesso, porém, não vêm somente do seu campus de mais de 350 alqueires e de suas construções funcionais e conectadas; vêm também do seu corpo docente altamente qualificado e dos seus egressos: mais de 100 mil pessoas, espalhados por todo o Brasil e o mundo, que tiveram suas vidas impactadas e transformadas pelo ensino superior da UNIMAR. Assim, é com orgulho que apresentamos a Educação a Distância da UNIMAR com o mesmo propósito: promover transformação de forma democrática e acessível em todos os cantos do nosso país. Se há alguma expectativa de progresso e mudança de realidade do nosso povo, essa expectativa está ligada de forma indissociável à educação. Nós nos comprometemos com essa educação transformadora, investimos nela, trabalhamos noite e dia para que ela seja ofertada e esteja acessível a todos. Muito obrigado por confiar uma parte importante do seu futuro a nós, à UNIMAR e, tenha a certeza de que seremos parceiros neste momento e não mediremos esforços para o seu sucesso! Não vamos parar, vamos continuar com investimentos importantes na educação superior, sonhando sempre. Afinal, não é possível nunca parar de sonhar! Bons estudos! Dr. Márcio Mesquita Serva Reitor da UNIMAR Que alegria poder fazer parte deste momento tão especial da sua vida! Sempre trabalhei com jovens e sei o quanto estar matriculado em um curso de ensino superior em uma Universidade de excelência deve ser valorizado. Por isso, aproveite cada minuto do seu tempo aqui na UNIMAR, vivenciando o ensino, a pesquisa e a extensão universitária. Fique atento aos comunicados institucionais, aproveite as oportunidades, faça amizades e viva as experiências que somente um ensino superior consegue proporcionar. Acompanhe a UNIMAR pelas redes sociais, visite a sede do campus universitário localizado na cidade de Marília, navegue pelo nosso site unimar.br, comente no nosso blog e compartilhe suas experiências. Viva a UNIMAR! Muito obrigada por escolher esta Universidade para a realização do seu sonho profissional. Seguiremos, juntos, com nossa missão e com nossos valores, sempre com muita dedicação. Bem-vindo(a) à Família UNIMAR. Educar para transformar: esse é o foco da Universidade de Marília no seu projeto de Educação a Distância. Como dizia um grande educador, são as pessoas que transformam o mundo, e elas só o transformam se estiverem capacitadas para isso. Esse é o nosso propósito: contribuir para sua transformação pessoal, oferecendo um ensino de qualidade, interativo, inovador, e buscando nos superar a cada dia para que você tenha a melhor experiência educacional. E, mais do que isso, que você possa desenvolver as competências e habilidades necessárias não somente para o seu futuro, mas para o seu presente, neste momento mágico em que vivemos. A UNIMAR será sua parceira em todos os momentos de sua educação superior. Conte conosco! Estamos aqui para apoiá-lo! Sabemos que você é o principal responsável pelo seu crescimento pessoal e profissional, mas agora você tem a gente para seguir junto com você. Sucesso sempre! Profa. Fernanda Mesquita Serva Pró-reitora de Pesquisa, Pós-graduação e Ação Comunitária da UNIMAR Prof. Me. Paulo Pardo Coordenador do Núcleo EAD da UNIMAR 007 Aula 01: 016 Aula 02: 027 Aula 03: 039 Aula 04: 052 Aula 05: 064 Aula 06: 073 Aula 07: 083 Aula 08: 104 Aula 09: 114 Aula 10: 127 Aula 11: 142 Aula 12: 151 Aula 13: 162 Aula 14: 175 Aula 15: 184 Aula 16: Introdução à Teoria de Banco de Dados Projeto de Banco de Dados Banco de Dados Relacionais Diagramas Entidades – Relacionamentos Complexos Desenvolvimento de Banco de Dados Linguagem SQL – Definição de Tabelas Linguagem SQL – Consultas Armazenamento e Consulta de Dados Linguagem SQL – Variações em Consultas Tópicos Complementares em SQL Banco de Dados Orientados a Objetos e Banco de Dados XML Gerenciamento de Transações Controle de Concorrência e Recuperação Arquiteturas de Banco de Dados Paralelos e Distribuídos Banco de Dados Paralelos e Distribuídos Tópicos Avançados e Mineração e Análise de Dados Introdução Olá, alunos! Bem-vindos à disciplina Banco de Dados. Preparei este material apoiado na ideia de que sem um software para controlar suas funcionalidades, um hardware acaba se tornando apenas um dispositivo eletromecânico, praticamente sem nenhuma automatização e, assim, não existiria a necessidade de programação como ocorre em máquinas de operação manual. Vamos começar com uma breve introdução à teoria do banco de dados, as principais linguagens de programação, processos e muito mais. Bons estudos! 6 01 Introdução à Teoria de Banco de Dados 7 Alunos, os dados, como é comum se ouvir, são a base para a existência e para o uso do banco de dados – que funciona como repositório para variadas quantidades de dados, com propósitos igualmente variados. Para o adequado armazenamento, organização e uso desses dados, foram desenvolvidos os chamados Sistemas de Gerenciamento de Banco de Dados (SGBD) que são excelentes recursos da Tecnologia da Informação (TI) para manter grandes bases de dados organizadas com alto desempenho. Existe uma necessidade natural de uso de hardware para o armazenamento de dados, e mesmo com a ideia do uso da tecnologia de armazenamento em nuvem, em algum lugar do planeta, os dados �cam �sicamente armazenados e podem ser gerenciados por algum SGBD. Numa época em que o uso massivo da Internet movimenta enormes volumes de dados e permite que esses dados possam ser acessados praticamente de qualquer lugar, o uso de sistemas para trabalhar com dados se tornou fundamental para o mercado e para a sociedade, de forma que representa uma das grandes fatias de vagas de emprego disponíveis para pro�ssionais de TI. 8 Diversos setores se bene�ciaram com o uso de sistemas que trabalham com banco de dados,tais como �nanças, transporte, educação, comunicações, compra e venda, indústria e entretenimento, por exemplo. De tempos em tempos, inovações tecnológicas geram novas possibilidades de uso desses sistemas, como vem ocorrendo com o uso cada vez maior e mais bem �ltrado de dados para os setores de marketing, serviços e produção. As inovações tecnológicas estão permitindo revoluções que ocorrem em todas as áreas da TI e afetam os sistemas gerenciadores de banco de dados que, décadas atrás eram simples, rodando em máquinas isoladas, ou no máximo, em redes locais cabeadas, e décadas depois, funcionam em infraestruturas sem �o, cobrindo grandes distâncias através de tecnologias como a da Internet, e tendo recursos avançados para tratamento de dados como a Inteligência Arti�cial (IA) e mineração de dados em geral para que dados existentes possam gerar novos dados. Com estas inovações mais recentes aplicadas aos Sistemas SGBD, é possível adquirir novos dados obtidos a partir de dados já existentes, decisões podem ser tomadas de forma mais con�ável e sistemas se tornam autônomos e inteligentes – o que é capaz de reduzir a interação humana em muitas atividades. Outra tecnologia que acompanhou e auxiliou o desenvolvimento e massi�cação de uso de banco de dados foi a de armazenamento de dados que, com o passar do tempo, conseguiu aumentar muito a capacidade de armazenamento na proporção inversa a uma constante busca por redução no tamanho físico dos dispositivos de conservação, assim como melhorias em desempenho e con�abilidade destes dispositivos de hardware. 9 Com as evoluções tecnológicas ocorridas nas últimas décadas, a própria forma como o mercado utiliza os dados e como os gerencia sofreu mudanças em função não apenas das evoluções, mas de novas formas de oferta de serviços que permitiram ao mercado trabalhar de forma diferente os Sistemas Gerenciadores de Banco de Dados. Empresas criaram serviços de armazenamento locais, que através de meios de comunicação como a Internet, proporcionavam a custos variáveis, espaços de armazenamento e infraestrutura para comportar dados puros ou sistemas inteiros de gerenciamento de dados, de forma que as empresas não precisassem de grandes investimentos em infraestrutura própria, sendo esta modalidade situada dentro da chamada tecnologia em nuvem (cloud computing). Algumas empresas criaram enormes infraestruturas de TI (data centers) para armazenamento de dados e sistemas e acabaram se tornando grandes fornecedores de serviços de cloud computing, sendo responsáveis pelo armazenamento de dados de empresas de todos os setores e lugares do mundo. O armazenamento de dados aumentou de volume de forma monstruosa e o armazenamento destes dados gerou problemas em infraestruturas de TI, pois necessitam, além de dispositivos de armazenamento muito robustos, de hardware com bom poder de processamento. O futuro deste segmento parece estar na nuvem, em que grandes empresas podem oferecer serviço de qualidade com uma relação entre custo e benefício bastante interessante. Leia em: 10 https://go.eadstock.com.br/x4 Pontos de atenção em Sistemas de Gerenciamento de Banco de Dados Sistemas do tipo SGBD possuem certas características comuns neste tipo de sistema que se tornou a base das atividades do mercado de indústria, comércio e serviços, além de muito do que está relacionado à sociedade. Silberschatz (2020) cita algumas situações importantes que devem ser observadas em um SGBD e, na sequência, estes pontos são trabalhados de forma a oferecerem uma maior compreensão de como funcionam os sistemas de gerenciamento de banco de dados. Uma das características relevantes em sistemas desse tipo se relaciona com a forma como os dados são gerados e o controle sobre eles, pois é comum que dados pessoais, por exemplo, sejam inseridos em diversos sistemas separados de empresas distintas, mas possam também estar inseridos em bases de dados distintas numa mesma empresa, com formatos diferentes e sem que uma base enxergue a outra. Desta forma, ocorre a chamada redundância em dados que remetem à ideia de que existam dados repetidos, mas não desnecessários, por estarem em bases distintas de sistemas que não se comunicam, mas que em certos casos, poderiam ser otimizados em sistemas que podem se comunicar. Outro aspecto relevante é que um SGBD deve ser implementado como qualquer outro software, seja ele desenvolvido por uma equipe própria da empresa, por uma empresa terceira, ou comprado como software de prateleira, como são chamados os softwares prontos comprados no mercado – como sistemas operacionais, por exemplo. É que eles devem atender às demandas relacionadas ao cotidiano de trabalho com os dados, mas solicitações pontuais podem não ser contempladas. Um dos problemas relacionados é a chamada di�culdade de acesso a dados especí�cos, geralmente ligados a �ltros em consultas que geram relatórios resumidos de interesses especí�cos e que, por vezes, não fazem parte da implementação atual do sistema. Neste caso, é comum que se obtenham relatórios próximos do desejado contendo informações extras desnecessárias, mas de forma rápida, se possível, pode-se optar pela solicitação de desenvolvimento do relatório especí�co desejado. Fica a critério de uma avaliação para se optar pela melhor solução nesse caso, pois entram pontos a serem levados em consideração como a frequência com que este relatório pode ser utilizado e os custos envolvidos em termos de tempo e valores para as duas opções de solução para a demanda. 11 Outro ponto de atenção no desenvolvimento de um SGBD é que à medida que aumenta de tamanho e complexidade, podem ser que dados de bancos diferentes sob um mesmo sistema e armazenados em estruturas e formatos diferentes façam com que atualizações no sistema que necessitem uni�car esses dados sejam mais complexos em sua implementação. É importante citar que dados precisam se manter corretos no banco de dados e, muitas vezes, diferentes componentes de um SGBD podem aplicar regras distintas de validação sobre um mesmo dado ou um excluir dados essenciais para outro subsistema do SGBD. Essa chamada integridade também é complexa de ser administrada em sistemas maiores, pois a documentação de sistemas grandes pode não ser uni�cada e nem consultada quando novos sistemas ou atualizações que aparentem ser independentes de outros podem afetar esta integridade. Também podem ocorrer problemas relacionados ao processo de manipulação de dados que acontecem o tempo todo e que, por diferentes motivos, podem ser interrompidos abruptamente, ocasionando riscos de perdas de dados de forma parcial ou até de bases inteiras de dados. A chamada atomicidade tenta minimizar estes problemas, mantendo pontos seguros de recuperação de dados antes de estes processos ocorrerem, durante e até mesmo depois. 12 Existem sistemas que permitem que diversos usuários ou processos acessem a mesma base de dados de forma simultânea, e isto também pode ocasionar problemas com dados, pois processos ocorrendo em paralelo podem estar tentando acessar ou alterar um mesmo dado e situações como a leitura de um dado desatualizado ou falha por requisições que ocorrem exatamente no mesmo instante de forma concorrente podem ser problemáticas também. Outro aspecto importante em relação a sistemas de gerenciamento de banco de dados é a segurança que, de forma geral, engloba muitos pontos, sendo alguns deles relacionados às permissões de acesso de usuários que pode ser organizado em níveis, proteção a invasões externas (ainda mais com a conexão com a Internet), segurança física contra extravio de equipamentos de hardware em uma infraestrutura, etc. Conceitos Fundamentais Os dados são uma representação virtual da realidade podendo se referir às características de coisas reais como nomes, cores, valores, etc. e objetos podem ser identi�cados por um determinado conjunto de dados que o diferencie de outros objetos. Uma importante característica de um SGBD é que ele deve fornecer visões dos dados, ou seja, meiospara que esses dados sejam visualizados e modi�cados dentro da proposta do sistema. Silberschatz (2020) cita que a chamada abstração de dados é utilizada para que aquilo que é relevante do modelo real seja utilizado como base para os dados do SGBD, e esta abstração envolve aspectos ligados ao nível físico e ao nível lógico do problema, em que os dispositivos e métodos de armazenamento se referem à parte física, e a organização dos dados e as relações entre eles estão no nível lógico, um pouco mais elevado e perceptível do sistema. 13 Um terceiro nível, mais alto e visível, é o nível de visão no qual aquilo que é necessário do SGBD é exibido em determinado momento, de forma �ltrada e adequada aos propósitos do sistema para os usuários. A organização dos dados em um SGBD é feita através de estruturas de dados criadas para que os dados possam ser armazenados e manipulados de forma correta e adequada, partindo da estruturação do esquema que representa o termo associado à própria estruturação do banco de dados, ao passo que todo o banco de dados trabalha com base em instâncias que são os estados nos quais o banco de dados se encontra em determinado momento, segundo Silberschatz (2020). O termo esquema se aplica aos três níveis citados: físico, lógico e de visão, sendo que no nível de visão é comum o uso do termo subesquema em função de poder existir diferentes visões com base nos dados. Outra parte importante do estudo de banco de dados são os modelos utilizados para descrever dados e relações entre eles, de forma a permitir a de�nição teórica dos três níveis citados anteriormente, sejam físico, lógico ou de visão: Modelo relacional: baseia-se em tabelas para organização de dados e relacionamentos que interligam estas de forma a organizar toda uma estrutura de dados. Modelo entidade relacionamento (ER): baseia-se em modelar objetos reais como elementos chamados de entidades e a forma como eles podem estar interligados através de relacionamentos. Modelo orientação a objetos: nele, de�nem-se classes para a organização de dados e métodos para trabalhar os processos que manipulam estes dados. Modelo semiestruturado: utilizado em aplicações web com base em XML (Extensible Markup Language), no qual dados podem ter conjuntos diferentes de atributos. 14 A manipulação de sistemas de gerenciamento de banco de dados pode ser feita por meio de uma linguagem especí�ca para esta �nalidade, como é o caso da linguagem SQL. Pode-se dividir a linguagem em uma parte para de�nição de dados ou DDL (Data De�nition Language) e outra parte com comandos para a manipulação de dados ou DML (Data Manipulation Language). 15 Projeto de Banco de Dados 02 16 Olá novamente! O banco de dados possui uma �nalidade aparentemente simples, ainda mais pensando que sua �nalidade essencial é apenas de se armazenar dados, mas, na verdade, este armazenamento abrange toda a infraestrutura necessária para o armazenamento do volume de dados esperado e imaginável, e toda a organização lógica dos sistemas que vão gerenciar esses dados, sendo, então, um conjunto relacionado à arquitetura do sistema. Os dados podem ser armazenados em um repositório simples de dados apenas para consultas, mas um SGBD pode também ser composto por subsistemas interligados que gerenciam bases de dados compartilhadas ou não, podendo conter quantidades muito grandes de dados e depender deles para a realização de um grande volume de transações, como ocorre no comércio eletrônico (e-commerce). No projeto de um banco de dados, a parte relacionada ao esquema é fundamental dentro de um contexto no qual projetos complexos de grandes empresas ou propósitos de uso podem exigir grande planejamento da estrutura de um banco de dados. 17 Processo do Projeto Partindo dos requisitos de�nidos como necessidades que um SGBD deve atender, esta representa a primeira e não menos importante fase do projeto de um sistema gerenciador, sendo que a de�nição dos requisitos de cada sistema são obtidos a partir de entrevistas e outros meios que permitam que se descubram todas as informações necessárias para se de�nir um esquema para um banco de dados e o mesmo represente, de forma adequada, as estruturas de dados que sejam compatíveis com o que se espera do sistema. Algum modelo de dados é escolhido e aplicado aos requisitos, de forma que um modelo conceitual possa ser desenvolvido e partido deste, e um banco de dados possa ser implementado para que dados sejam inseridos, armazenados e manipulados sempre que desejado de forma segura e íntegra. Na etapa conceitual é preciso que a estrutura a ser pensada leve em consideração todos os aspectos envolvidos tais como redundâncias de dados que possam ser resolvidas, relacionamentos entre tabelas ou outras estruturas, a forma como acessados e processados os dados, e se o sistema todo, parte dele ou nada do sistema será alocado na nuvem. Pensando no modelo relacional, por exemplo, dentre outras ações, é preciso abstrair do problema real, os dados e suas características a serem utilizadas para a estruturação de tabelas, lembrando que nesta etapa de projeto inicial, não há nada implementado ainda, e os custos de mudanças são insigni�cantes em relação a mudar tabelas em sistemas prontos e em uso. O esquema desenvolvido deve ser �el às regras de negócio que devem ser contempladas pelo sistema e deve ser capaz de fornecer uma visão detalhada de uma empresa segundo Silberschatz (2020), evitando con�itos e especi�cando detalhes lógicos e não físicos nesta etapa. 18 Modelo Entidade Relacionamento (ER) Dentro da modelagem, o uso de diagramas entidade relacionamento pode se constituir em um excelente material para auxiliar na modelagem de forma intuitiva e de fácil compreensão, inclusive para clientes leigos que precisem compreender o que está sendo desenvolvido para atender às suas demandas. Esse modelo permite especi�car, de forma conceitual, problemas reais por meio da estruturação de entidades e relações que possam existir entre estas dentro da proposta das regras de negócio que devem ser respeitadas no desenvolvimento de um SGBD. Entidades são representações virtuais de elementos reais como produtos, serviços, pessoas, etc., sendo que estas entidades possuem atributos escolhidos dentre todo o conjunto de características que estes elementos possuem, como cor, peso, altura, idade, valor, dentre muitas outras que podem ser ou não relevantes para o contexto de cada sistema a ser desenvolvido. Os chamados atributos representam os dados que, porventura, serão armazenados no sistema e estes precisam ser escolhidos e representados conceitualmente no modelo através da escolha de nomes intuitivos e da de�nição de qual domínio de valores numéricos ou não serão aceitos por estes atributos. Uma entidade então dita um conjunto de dados relativos às características de algo real armazenadas em atributos, sendo então chamado de tupla em uma tabela de dados, e o conjunto de todas as tuplas de dados que representam dados de diversos elementos reais é chamado de conjunto de entidades, como num cadastro de pessoas, de produtos, etc. O conjunto de entidades pode ser subdividido, e um conjunto chamado, produtos pode envolver produtos físicos em um subconjunto de entidades, e serviços em outro subconjunto, mas isto não é obrigatório, pois por mais que possuam certa a�nidade, conjuntos de entidades podem se manter separados em um mesmo modelo ER. A associação entre entidades, quando possível, é chamada de participação, sendo que essas entidades participam de um relacionamento entre si e, segundo Silberschatz (2020), uma instância em um relacionamento assim dentro de um esquema ER, seria equivalente a uma tupla de dados de cada tabela que tenham relacionamento entre si no sistema, como no caso de uma determinada pessoa que compra certo produto da empresa. 19 Um termo utilizado na modelagem ER é o papel da entidade, dado a uma entidade que participe de um relacionamento, sendo o termo utilizado para identi�car entidades que estejam em ummesmo conjunto de entidades, mas que em determinadas situações, assume diferentes situações, como no caso de pessoas em um cadastro de colaboradores em que cada uma tem uma função especí�ca dentro da hierarquia da empresa (vendedor, gerente, �nanceiro, etc.). Existe a possibilidade de um relacionamento entre entidades e necessitar de um dado adicional para que seja mais completo em seu signi�cado, e que não esteja contido em nenhuma das entidades, como poderia ocorrer no caso de uma entidade pessoa se relacionar com outra entidade evento e ser adicionado um chamado atributo descritivo inscrito para que seja indicado se uma pessoa se inscreveu num evento ou não, mas este atributo não seria adequado para nenhuma das entidades em separado, mas apenas para este especí�co relacionamento. Geralmente, os relacionamentos são ditos binários, ou seja, envolvem duas entidades em uma ligação direta entre ambas em função da obtenção de uma determinada informação. No entanto, podem ocorrer casos em que um relacionamento envolva mais entidades, como no caso de uma pessoa estar inscrita em determinada turma para assistir determinada disciplina, ministrada por um professor especí�co, resultando na combinação de pessoas (aluno e professor), turma e disciplina, que podem todas ser entidades separadas por não compartilharem atributos entre si, apenas em relacionamentos propostos. 20 pessoa código_p nome_p função_p 1 João Aluno 2 Pedro Professor 3 Marta Aluno curso código_c nome_c turno_c 1 TI M 2 Letras T Fonte: O autor. disciplina código_d nome_d crédito_d 1 Matemática 10 2 Português 10 Na imagem anterior, são exempli�cados três conjuntos de entidades que podem se relacionar devido à geração de alunos matriculados em turmas com professores vinculados e, assim, gerar um relacionamento entre entidades que poderiam ser exempli�cadas, com o aluno João matriculado na turma A, do turno da manhã, do curso de Letras, com o professor Pedro, por exemplo, mas observando os dados, é preciso que seja gerado um relacionamento que contenha algum meio de unir estas entidades diferentes do modelo e, então, pode-se pensar em atributos descritivos para identi�car as turmas com alunos matriculados. O relacionamento poderia conter um atributo identi�cador, número de chamada para associar alunos a uma turma e, nesta turma, estariam indicados os atributos código_p, código c e código_d identi�cadores únicos das entidades. 21 Com isto, poderia ser gerada uma turma 1 a partir do relacionamento das entidades, e o aluno 1 da chamada poderia ser João (código_p = 1) e o aluno 2, Marta (código_p = 3), ambos inscritos na disciplina de Matemática (código_d = 1), no curso de TI, no período da manhã (código_c = 1). Neste relacionamento poderiam ser armazenados apenas os atributos códigos de cada entidade, pois através destes códigos é possível se obter todos os demais dados, se necessário, sendo então estes códigos conhecidos como atributos de chave da entidade. Os atributos podem ser chave de uma entidade ou não, sendo que os atributos chave não podem, de forma alguma, receberem dados repetidos, pois ocorreria perda de integridade do banco de dados. Pode acontecer de a chave ser formada por mais de um atributo e, neste caso, um ou outro dos atributos que compõem a chave chamada composta pode receber dados iguais, mas o conjunto de atributos da chave composta de uma entidade nunca pode ser igual ao de outra entidade. Atributos podem conter um valor único como é o caso da maioria dos atributos de�nidos em relações, mas podem ocorrer casos em que atributos podem conter valores múltiplos, como no caso de uma pessoa poder possuir um ou mais números de telefone, veículos ou endereços, por exemplo. Existem os chamados atributos derivados, obtidos a partir de outros atributos da entidade, como no caso da idade que pode ser obtida a partir da data de nascimento, ou do endereço parcial que pode ser obtido a partir do CEP. Atributos também podem não conter dados em uma entidade e assumirem valor nulo para a indicação ao banco de que o atributo não teve dado associado a ele, como no caso do cadastro de uma pessoa que não possua telefone pessoal ou veículo próprio. Um ponto importante é observar como ocorrem as relações entre entidades, pois há casos em que uma entidade de um conjunto de entidades pode se relacionar com apenas outra entidade de outro conjunto de entidades ou do mesmo conjunto, mas há casos em que se pode relacionar com mais de uma entidade do mesmo ou de outro conjunto de entidades. Isto é chamado de cardinalidade e pode ocorrer de quatro formas básicas: 22 a primeira é chamada um-para-um e ocorre quando uma entidade de um conjunto de entidades A se relaciona com apenas uma entidade de outro conjunto de entidades B, por exemplo. a segunda é chamada de um-para-muitos e ocorre no caso em que uma entidade do conjunto A se relaciona com mais de uma entidade do conjunto B. a terceira forma de cardinalidade é a muitos-para-um, que ocorre da forma inversa da anterior, na qual várias entidades do conjunto A podem se relacionar com apenas uma entidade do conjunto B. a quarta é a muitos-para-muitos, pois permite que haja relacionamento entre várias entidades do conjunto A com várias do conjunto B e vice-versa, ilustrando casos em que é comum a não exclusividade das relações entre entidades como em locações de veículos onde pessoas alugam carros, sendo que um carro pode ser locado por várias pessoas e uma pessoa pode locar diferentes carros. Inicialmente, é fundamental compreender os conceitos de entidades e atributos, para que se possa depois compreender como são construídos os relacionamentos entre entidades e estes possam gerar modelos que sirvam de base para a estruturação de propostas de desenvolvimento de um SGBD. 23 Retângulos para conjuntos de entidades: Elipses para atributos: Losangos para conjuntos de relacionamentos: Linhas simples para ligar elipses a retângulos (e estes a losangos): Elipses duplas para atributos múltiplos: Elipses tracejadas para atributos derivados: Linhas duplas para entidades totalmente inseridas em retângulos: Retângulos duplos para as chamadas entidades fracas: Imagem 4 cod cli cod prod nome_cli prod desc Quantidade ProdutoVendaCliente Fonte: O autor. Diagrama Entidade Relacionamento A construção do modelo ER não é apenas textual ou baseado em tabelas, mas pode conter diagramas estruturados de maneira que as diferentes formas utilizáveis na construção de diagramas sejam todas úteis e bem diferenciadas em suas funções. Para a construção dos diagramas ER, utilizam-se: Na imagem 4, temos um exemplo de diagrama Entidade_Relacionamento em que um conjunto de entidades “cliente” com os atributos cod_cli e nome_cli se relaciona com outro conjunto de entidades “produtos” com os atributos cod_prod, prod_desc e 24 Imagem 5 cod cli cod prod nome_cli prod desc Quantidade data_nasc Telefone Idade ProdutoVendaCliente Fonte: O autor. “quantidade”. Reforçando, neste diagrama, existe uma relação “venda” em forma de losango ligando os conjuntos de entidades “cliente” e “produto” em retângulos, sendo que ambos possuem seus respectivos atributos em elipses também ligadas por linhas simples. Um ponto importante a ressaltar no diagrama é que os atributos-chave que não se repetem e identi�cam as entidades estão sublinhados (cod_cli e cod_prod) para que �quem destacados e são facilmente identi�cáveis. Neste outro exemplo, da imagem 5, foram adicionados os atributos “telefone” como atributo múltiplo que aceita zero ou mais dados, data_nasc como atributo comum adicional e “idade” como atributo derivado, que pode ser obtido a partir de data_nasc. Com isso, foram apresentados os conceitos mais comuns de desenvolvimento do modelo entidade relacionamento, mas �ca indicada a pesquisa na bibliogra�a da disciplina e outras boas fontes de consulta para que se possa aprofundar dessa forma de modelagem bastante tradicional e utilizada no mercado. 25 Para compreender comosão estruturados os diagramas ER, é interessante pesquisar diagramas prontos a �m de identi�car os diferentes símbolos, interpretá-los e entender por que foram escolhidos na elaboração do diagrama. Outra forma de aprender melhor o uso dos diagramas é imaginar modelagens diversas e tentar criar diagramas utilizando os símbolos que julgar adequados e, no �nal da criação, observar se o diagrama é compreensível em sua proposta e se os símbolos parecem adequadamente utilizados. 26 Banco de Dados Relacionais 03 27 Olá, alunos! Com base no modelo relacional, o banco de dados relacionais trabalha com base em estruturas organizadas em tabelas que de�nem quais dados e características (ou atributos) devem ser aceitos e como devem ser inseridos. Dois pontos importantes a serem considerados são que a linguagem SQL costuma ser a linguagem base para uso em um SGBD e que se baseia em comandos dos tipos DDL e DML para a de�nição dos dados e sua manipulação, respectivamente. Tendo como base o uso de tabelas que são formadas por linhas e colunas numa estrutura bidimensional, cada coluna de uma tabela representa um tipo de dado de�nido por certas características, sendo que o conjunto das colunas é a representação de uma ocorrência do que está sendo representado pela tabela, seja um cadastro de pessoas, veículos, vendas, etc. As linhas de uma tabela são mais variáveis em quantidade, sendo que cada linha é equivalente a uma ocorrência de um conjunto de dados que identi�ca uma pessoa, veículo ou venda, como citado e, assim, duas pessoas podem ter seus dados cadastrados em duas diferentes linhas de uma tabela. Para criar tabelas, é preciso conhecer, por exemplo, os comandos DDL da linguagem SQL para de�nir as características dos campos de uma tabela de forma que recebam dados adequados aos requisitos de�nidos em regras de negócio ou outras regras que de�nam quais tipos de dados serão armazenados. Segundo Silberschatz (2020), um modelo de dados é uma representação formal da descrição de um conjunto de dados a partir de ferramentas próprias para a descrição dos dados e suas relações, além de outros aspectos envolvidos e necessários. Com base no uso de tabelas representativas da estrutura montada para o armazenamento organizado de dados nas colunas, têm-se as linhas utilizadas para armazenar cada conjunto de dados relacionados entre si e representativos de um objeto, por exemplo. Os aspectos preocupantes citados anteriormente, tais como integridade dos dados e atomicidade das operações realizadas com os dados, são tratados neste modelo de trabalho com banco de dados. 28 Uma tabela pode ser gra�camente representada, como mostra a imagem 7, que traz uma tabela de cadastro de produtos em um banco de dados hipotético qualquer, sendo que a primeira linha desta tabela representa títulos que nomeiam as colunas de dados, servido de referência para eles e sendo chamados de atributos. Imagem 7 Fonte: O autor. CÓDIGO DESCRIÇÃO QUANTIDADE 1 PRODUTO A 100 2 PRODUTO B 200 3 PRODUTO C 300 Neste exemplo da imagem 7 temos, então, os atributos CÓDIGO, DESCRIÇÃO e QUANTIDADE, que servem apenas como referência para as colunas e dados que, posteriormente, poderão ser armazenados nela. A escolha dos nomes é livre, e o uso de nomes escolhidos de forma intuitiva a facilitar a compreensão dos dados armazenáveis na tabela é bastante útil para posterior continuidade do projeto e desenvolvimento do banco de dados. Os tipos de dados permitidos em cada atributo geram um conjunto de valores aceitáveis chamados de domínio de cada atributo, lembrando que para alguns atributos, a quantidade de valores distintos aceitos pode ser in�nita, como no caso de nomes de pessoas, onde existe um sem �m número possível de combinações de nomes, mas pode delimitar faixas de valores aceitos como dias da semana, altura, peso ou idade de pessoas. É comum que sejam usados os termos relação para se referenciar tabelas e tuplas para linhas da tabela, ou seja, em uma relação, uma tupla é o conjunto de dados relacionados entre si que delimitam um objeto real representado, podendo-se também utilizar o termo registro para linhas. 29 Um aspecto importante é que na tabela, a ordem das tuplas é determinada pela ordem de inserção das mesmas na tabela ou outra regra como a ordenação dos dados de determinado atributo, como no caso dos dados de CÓDIGO, no exemplo da imagem 7. As tabelas são a base estrutural do banco de dados relacionais e sua compreensão se torna essencial para o prosseguimento dos estudos. Existem variações nos meios de se trabalhar com banco de dados, mas em geral, os bancos de dados deste tipo são armazenados por sistemas SGBD, como os oferecidos sob os nomes de Oracle ou MYSQL. Definição de Esquemas de Banco de Dados Um esquema de um banco de dados, segundo Silberschatz (2020), representa o projeto lógico de um banco de dados e a instância, a situação dos dados contidos no banco em determinado instante. Ainda, de�ne os termos relação representando ideia semelhante à de variáveis de armazenamento de dados em programação, e esquema de relação se referindo às de�nições de tipos de dados para relações. Geralmente, são de�nidos nomes iniciados com letras maiúsculas para esquemas de relação e com letras minúsculas para relações. Veja um exemplo deste padrão de nomenclatura: 30 https://go.eadstock.com.br/x5 Esquema_produtos = (código_produto, descrição_produto, quantidade_produto) Observe que uma forma de de�nir um esquema para a tabela imaginada no exemplo da imagem 7 mantém os mesmos nomes para as relações em relação aos atributos da tabela, gerando um nome para o esquema que contém estas relações. Uma relação produtos pode, então, ser de�nida como no esquema de esquema_produtos, em que a ideia de um esquema de relação pode ser uma representação dos atributos e domínios de�nidos para estes atributos Silberschatz (2020). Sendo uma instância o estado do banco em determinado momento, o exemplo da imagem M traz, além da estrutura da tabela, dados contidos na mesma em três tuplas, representando a instância daquele momento. Se mais dados forem inseridos ou dados forem alterados ou removidos, uma nova instância pode ser obtida com novos dados constantes na tabela, assim como �ltros utilizados sobre a tabela, de forma a trazer apenas dados desejados para determinada �nalidade, gerando novas instâncias também. Os esquemas vão sendo criados de acordo com as necessidades do sistema, e baseando-se na tabela do exemplo da imagem 7 é possível criar novos esquemas para ações envolvendo ações relativas à manipulação dos atributos dela, de forma 31 que se possam realizar as ações básicas de criação da tabela, inserção de dados, leitura de dados, alteração ou até exclusão de dados. Com base no esquema de relação esquema_produtos, podemos criar novos esquemas para algumas ações envolvendo ações relacionadas aos atributos como os indicados a seguir: Esquema_descrição = (código_produto, descrição_produto) Esquema_quantidade = (código_produto, quantidade_produto) Esses dois esquemas de relação podem ser a base para processos de inserção ou leitura de dados especí�cos do banco de dados, com o objetivo de evitar que informações redundantes ou desnecessárias sejam utilizadas e, por isso, num dos esquemas de relação se utiliza o atributo descrição_produto e no outro apenas quantidade_produto, mas ocorre a dúvida em relação ao atributo código_produto que aparece nos dois esquemas de relação. Existem algumas operações que são adaptadas da área da matemática, da álgebra, relacionadas para trazer funcionalidades às estruturas de banco de dados que funcionam como conjuntos de subconjuntos de elementos, imaginando cada subconjunto como uma tabela. Operações como a de seleção de tuplas, a partir de critérios de seleção, união de dados de tabelas distintas para obter resultados agregados, intersecção de dados de tabelas distintas para veri�car resultados mais especí�cos, etc. 32 Chaves É comum que, em todos os processos de uso de dados deum banco de dados, um ou mais atributos sejam utilizados, além daqueles realmente desejados, pois algo fundamental na estrutura de uma tabela são atributos que servem a um propósito de organização estrutural e ordenação das tuplas. Esta organização é importante para otimizar processos, pois se um banco está organizado e com seus dados ordenados sob algum critério, seu uso é mais ágil em termos de desempenho nas buscas por dados, principalmente, à medida que esta base aumente e exista uma tendência natural aos processos irem se tornando mais lentos com este crescimento na base de dados. Estes atributos das tabelas que são necessários para sua organização são chamados de chaves e possuem uma característica importante associada a elas que é a de não permitirem repetição de dados. Todavia, há casos em que um atributo considerado chave possa armazenar dados repetitivos, mas isso só deve acontecer em casos em que a chave da tabela seja formada por este atributo e um ou mais outros atributos que juntos não permitem a repetição de um mesmo grupo de dados nas tuplas da tabela. Sem essas chaves, certamente, ocorreriam problemas graves de identi�cação de dados, e um exemplo simples e direto disso seria se numa tabela, o número de CPF de pessoas cadastradas fosse a chave e fosse comum a repetição desse número para pessoas diferentes. Para de�nir melhor as chaves, utiliza-se o termo superchave para o atributo único ou conjunto de atributos que possuem a função de ordenar os dados de uma tabela e identi�car individualmente cada tupla. Mas um ponto importante é que uma superchave possui apenas os campos realmente necessários para ordenação dos dados e, assim, é preciso atender ao princípio de que qualquer subconjunto de atributos de uma superchave não pode ser considerado uma superchave também, pois, neste caso, o menor conjunto seria o mais adequado como superchave. 33 Numa tabela, podem existir mais de um conjunto de superchaves possíveis e estes conjuntos com um ou mais atributos, reforçando, são chamados de chaves candidatas, e dentre estas, uma superchave é escolhida. Um ponto de atenção é que subconjuntos de chaves candidatas não podem ser também chaves candidatas, pois foge ao conceito essencial de superchave. Dentre as chaves candidatas, uma é escolhida como superchave para a tabela e, a partir desse momento, passa a ser chamada de chave primária, sendo formada por um único atributo ou mais, pois a chave primária necessita identi�car individualmente as tuplas, independentemente da quantidade de atributos necessários. Outro aspecto que envolve a escolha de uma chave primária é que depois de escolhida e implementada esta chave, é recomendável que os atributos dela não tenham seus dados modi�cados, pois isso pode gerar chaves com dados repetidos, ferindo o propósito de sua escolha, o que pode acontecer mais facilmente em chaves compostas por mais de um atributo. Um conceito importante do uso de atributos como chaves é que uma tabela pode se relacionar com outra, e isso é possível por meio de vínculos criados entre atributos destas tabelas, de forma que quando ocorrerem repetições dos dados destes atributos nestas tabelas, exista realmente uma ligação nesta repetição, mas isto deve também ser estruturado com cuidado. 34 Um caso hipotético adequado seria um SGBD de uma empresa de vendas de produtos, por exemplo, em que tabelas possam ser de�nidas para o armazenamento de dados relativos a clientes, compras, vendas, etc. Para estruturar um sistema assim, de forma adequada e reduzindo redundâncias, os dados necessários para realizar os processos deste negócio devem ser organizados em uma ou mais tabelas, a partir da análise de situações de uso destes dados e escolha da melhor forma de estruturação do banco para otimizá-lo. Um sistema assim certamente deve possuir algo que possa cadastrar vendas, e estas, geralmente, associam dados de clientes realizando as compras, os produtos adquiridos e outras informações complementares como data, valores, etc. Um cliente pode retornar ao local para novas compras ou não, mas um sistema deve prever esta possibilidade, assim como um determinado produto pode ser adquirido pelo mesmo cliente mais de uma vez, e também por outros clientes e, assim, começa o processo de se estruturar um modelo para um SGBD. Neste processo, as relações entre tabelas precisam ser muito bem desenvolvidas, pois toda a integridade do banco de dados e o correto propósito do mesmo podem ser prejudicados por más escolhas feitas nesta etapa. Para gerar essas relações entre tabelas é preciso utilizar as chaves primárias de�nidas no processo de estruturação do banco e, assim, partindo do exemplo do sistema de vendas, pode-se imaginar que as vendas podem ocorrer com ou sem a geração de nota �scal, dependendo do tipo da venda e da empresa que utilizará o sistema. Para evitar esta inde�nição para certos tipos de atividades comerciais, pode- se usar como chave primária um valor numérico inteiro, simples, para que sejam gerados códigos sequenciais automáticos a cada nova venda, garantindo, assim, a não duplicidade de chaves. Um ponto importante a ser observado e que será explorado mais adiante é que pode ocorrer de um mesmo cliente comprar mais de uma vez e suas vendas serem lançadas no sistema da mesma forma que seria feito com clientes diferentes que realizaram compras diferentes. Para economizar dados armazenados no banco e assim reduzir a redundância de dados, é possível usar de um importante recurso na elaboração de um modelo relacional, que é agrupar atributos relacionados entre si em uma tabela junto com outros agrupamentos de dados – lembrando que todas as tabelas geradas devem ter chaves primárias de�nidas. Estas chaves primárias são essenciais na de�nição de relacionamentos entre tabelas, pois por meio delas, dados de uma tabela são associados com outra tabela a partir do uso dos atributos que formam a chave primária em uma tabela como atributos comuns em outra, e estes atributos replicados são chamados de chaves 35 Imagem 8 Endereço_cliente Telefone_cliente CPF_cliente Nome_cliente Código_cliente Clientes Código_cliente Preço_produto Quantidade_produto Descrição_produto Código_venda Vendas Fonte: O autor. estrangeiras. Esta relação é chamada de relação estrangeira, e a ocorrência de dados iguais na chave primária de uma tabela e na chave estrangeira de outra indica a ocorrência de uma relação entre as respectivas tuplas das duas tabelas. Um exemplo seria pensar num cadastro de clientes em uma tabela usando um código para cada cliente que seja numérico sequencial automático, mas poderia ser imaginado o uso do número de CPF como chave primária para cada cliente cadastrado, o que poderia restringir cadastros de clientes em casos especí�cos, como o de clientes que não estão portando documentos no momento do cadastro de uma compra e não têm meios para obter esse dado naquele momento. A associação, então, seria feita com a inserção deste código de cliente numa venda realizada de forma a associar à venda apenas este dado chave do cadastro de clientes ao invés realizar repetidas vezes todo o cadastro de dados todas as vezes que o cliente realizar compras. Além de facilitar as vendas, também se atenua a redundância nos dados pessoais de clientes no sistema, pois em cada venda realizada, apenas o código dos clientes é adicionado aos registros de vendas feitas. Observe a imagem 8 para ter uma ideia de como poderiam ser modeladas as tabelas em um chamado diagrama de esquemas neste exemplo. No exemplo da imagem 8, uma relação é de�nida entre a chave primária Código_cliente da tabela Clientes e a chave estrangeira de mesmo nome na tabela Vendas, reforçando que o uso do mesmo nome nas duas tabelas permite uma associação mais intuitiva entre as tabelas e indicação da relação entre os dois atributos das tabelas. Um ponto que pode chamar a atenção é o porquê de o campo chave primária da tabela Clientes ser chave estrangeira na tabela Vendas, mas o campo chave primária da tabela Vendasnão ser chave estrangeira na tabela Clientes. Isso porque é preciso 36 Imagem 9 Quilimetragem_rodada Descrição_veículo Renavam Código_veículo Veículos Código_veículo Data_devolução Data_retirada Nome_cliente CPF_cliente Código_locação Locações Observações Fonte: O autor. veri�car que, neste exemplo, uma venda pode ser realizada para apenas um cliente, mas um cliente pode realizar muitas compras, caracterizando uma relação dita 1 para N (ou uma para muitos). Existem casos em que existe uma relação do tipo 1 para 1 como no caso de casamentos, nos quais uma pessoa se casa com apenas uma outra, para �ns de registro civil, mas também podem existir relacionamentos N para N (ou muitos para muitos) ainda, em casos como o de pessoas se alimentando em praças de alimentação onde os estabelecimentos podem atender mais de um cliente, e estes clientes podem ser atendidos por vários estabelecimentos. Uma forma bastante e�ciente de se praticar a elaboração de modelos de banco de dados relacionais é partir de problemas reais simples e tentar obter as informações necessárias para se modelar diagramas de esquemas. Um exemplo seria imaginar como poderia ser modelado um diagrama de esquema para uma locadora de veículos, no qual é preciso cadastrar veículos e realizar locações para clientes diversos. Poderia ser obtido um primeiro esboço simples de diagrama com algumas tabelas e atributos essenciais como uma primeira proposta a ser complementada e ajustada até que se obtenha um modelo aceitável para a de�nição formal de um SGBD como se pode observar na imagem 9. Neste exemplo da imagem 9 é possível observar que são de�nidas duas tabelas para o cadastro de veículos e controle de locações, nas quais os atributos Código_veículo e Código_locação são chaves primárias, e o atributo Código_veículo é repetido na tabela de Locações como chave estrangeira para permitir o relacionamento entre as tabelas. 37 O uso de diagramas de esquemas auxilia visualmente na compreensão da estrutura de um banco de dados, pois ilustra as tabelas com seus atributos e as relações de�nidas entre estas tabelas, facilitando a compreensão dos exemplos. É importante observar que a chave estrangeira é ligada a uma chave primária através de uma seta com a ponta apontando para a chave primária, de forma a indicar qual é o papel de cada atributo incluído na lista em relação à tabela na qual está inserido. 38 Diagramas Entidades – Relacionamentos Complexos 04 39 O uso de diagramas Entidade Relacionamento (ER) proporciona um meio bastante e�ciente de se modelar banco de dados relacionais, tendo diferenciais para a especi�cação de banco de dados bastante �éis às regras de negócio e ideia de como poderia ser uma solução para o armazenamento de dados para determinado negócio. Nas aulas anteriores, estudamos os conceitos fundamentais utilizados em praticamente todos os bancos de dados projetados, mas existem especi�cidades em vários casos que necessitam de formas variantes disponíveis para a elaboração dos diagramas ER. Lembrando que os elementos básicos de um diagrama são o retângulo, que representa uma entidade, o losango, um relacionamento entre entidades, e as elipses, em geral, os atributos. É importante analisar as situações importantes que envolvem esses elementos. A representação de relacionamentos é um importante ponto e pede atenção nos diagramas, pois indica como ocorrem as ligações entre entidades, e como existem diferentes formas de isto ocorrer, também há diferentes formas de se representar estas diferentes relações entre conjuntos de entidades. As entidades podem se relacionar de quatro formas distintas, sendo uma em que uma entidade de um conjunto de entidades só pode se relacionar com uma entidade de outro. Outras três formas são relacionamentos de uma entidade de um conjunto com várias entidades de outro, várias entidades de um conjunto com apenas uma entidade de outro e, por �m, várias entidades podendo se relacionar com outras várias de outro conjunto, simultaneamente. Estes relacionamentos são chamados de 1 para 1, 1 para muitos, muitos para 1, e muitos para muitos. 40 Figura 1 1 1 1 1 2 A B C D 2 2 2 Fonte: O autor. Até então, a representação deste tipo de variação de relacionamento não era indicada no diagrama, sendo apenas utilizada a linha simples para esta representação geral, mas de agora em diante, a adição de setas nas linhas em relacionamentos irá possibilitar a diferenciação dos quatro tipos. Observe a Figura 1 para conhecer as indicações de tipos de relacionamentos. Nas ilustrações da Figura 1, podemos observar o uso de setas nas linhas que ligam alguns dos elementos, servindo de diferenciador entre os quatro tipos de relacionamentos. 41 A seta sempre aponta para o relacionamento equivalente a 1, ou seja, aquela entidade de um conjunto que é a única que se relaciona com uma ou mais entidades de um outro conjunto. Nos exemplos indicados na Figura 1, temos então o relacionamento indicado por A, como sendo muitos para muitos, pois não há seta em nenhuma extremidade da linha que indica o relacionamento. Na letra B, estando a seta na entidade à esquerda (1) apenas, temos um relacionamento 1 para muitos, onde uma entidade do conjunto à esquerda é a única que se relaciona com uma ou mais entidades do conjunto à direita (2) e, assim, a restrição �ca por conta das entidades do conjunto 2 só poderem ter relacionamento com uma entidade apenas pertencente ao conjunto 1. No exemplo da letra C, estando a seta apontada para o conjunto 2, temos um relacionamento muitos para 1 que signi�ca que muitas entidades do conjunto 1 podem se relacionar com apenas uma entidade do conjunto 2, sendo então impossível mais de uma entidade do conjunto 2 se relacionar com uma mesma entidade do conjunto 1. Por �m, no exemplo D, existem setas nas duas extremidades da linha, indicando um relacionamento 1 para 1, onde cada entidade de qualquer um dos dois conjuntos pode apenas se relacionar a uma entidade do outro conjunto, criando relacionamentos exclusivos entre entidades de cada conjunto. 42 Figura 2 1 2 Fonte: O autor. Figura 3 1 1..1 0..* 2 Fonte: O autor. A Figura 2 traz um conceito a ser reforçado que é o de atributos que podem ser adicionados em relacionamentos de forma a complementar ligação entre entidades de dois conjuntos diferentes 1 e 2, de maneira que este atributo seja independente das entidades em si, mas relevante a um relacionamento entre estas entidades, como seria a data em uma venda, que não faz sentido ser associada diretamente a um cadastro de clientes e nem ao de produtos. Outro conceito incluso na Figura 2 é o de que é possível que entre uma entidade e um relacionamento existam variantes na forma como a entidade se comporta, devido ao contexto dos dados das entidades, e casos como o de cadastro de pessoas que possuam diferentes funções em uma empresa, a forma como estes cargos se comportam no relacionamento podem variar entre 1 e muitos. Sobre a cardinalidade, existe uma indicação adicional que pode ser útil por indicar os chamados limites de borda entre entidade e relacionamento que indica as cardinalidades mínima e máxima permitidas, como se pode observar no exemplo da Figura 3. 43 Neste diagrama da Figura 3, os limites de borda entre a entidade 1 e o relacionamento do tipo 1..1 indicam que é obrigatória uma única entidade para cada relacionamento, e nos limites de borda da entidade 2 com o mesmo relacionamento está especi�cado que a entidade 2 pode não ter nenhum ou vários relacionamentos nesta situação. Uma escolha que pode ser importante na modelagem de um projeto de banco de dados a de�nição de algo como um conjunto de entidades com seus atributos ou um relacionamento entre conjunto de entidades podendo agregar atributos descritivos, se necessário. Esta decisão depende muito da análise de cada situação e de como isto impacta a estrutura de todo o projeto, pois são propostas distintas. Um conjunto de entidades é independente e possui seus atributos comuns,tendo uma chave primária de�nida, ao passo que um relacionamento não existe por si só, mas depende de ao menos dois conjuntos de entidades que compartilhem atributos com a relação de forma a estruturá-la, e isso gera uma economia no volume de dados armazenados, mas apenas se for possível a de�nição de uma estrutura de relacionamento a partir de conjuntos de entidades já de�nidas. O uso de mais relacionamentos aumenta a complexidade do banco de dados, ainda mais se forem adicionados atributos descritivos, mas pensar em banco de dados com vários conjuntos de entidades e poucos relacionamentos pode gerar relacionamentos entre três (ternários) ou mais (enários) conjuntos de entidades, do que o uso de mais relacionamentos entre apenas dois conjuntos de entidades (binários). Há casos em que não se podem estruturar bancos apenas com relacionamentos binários, mas sempre que possível, os binários tendem a simpli�car a compreensão e desenvolvimento de sistemas gerenciadores para a manipulação de dados. 44 A correta escolha de posicionamento de atributos também é importante, como já citado, e sempre deve ser observada a lógica de cada atributo estar associado diretamente a uma entidade, como uma característica ou ser um atributo descritivo, que é usado apenas quando ocorre um relacionamento entre duas entidades e este atributo contribui com a identi�cação da tupla de relacionamento. A de�nição de conjunto de entidades é algo bastante intuitivo, dependendo muito de uma boa compreensão das regras de negócio para uma adequada visualização de como seriam estruturadas as entidades. Já os relacionamentos e suas variantes em termos de cardinalidade e a indicação de cardinalidades mínima e máxima podem ser menos intuitivos e necessitar de mais tempo de trabalho sobre as regras de negócio e experimentação de de�nição de relacionamentos entre os conjuntos de entidades de�nidos. Conceitos Complementares Os conjuntos de entidades são formados por atributos, e dentre estes atributos, geralmente, um ou mais são selecionados para comporem a chamada chave primária a partir de chaves candidatas, mas pode haver casos em que não haja um conjunto adequado para se obter uma chave primária que garantidamente seja única em cada entidade. 45 https://go.eadstock.com.br/zX Figura 4 1 2 Fonte: O autor. Conjuntos de entidades com chaves primárias são chamados de fortes, ao passo que conjuntos de entidade em que não seja possível de�nir uma chave primária são ditos fracos como no caso de um conjunto de entidades com os atributos número_parcela, nome_cliente e valor_pago, em que quaisquer dos campos podem ter dados repetidos, e uma entidade pode ser igual à outra, pois para todos os clientes, as parcelas são numeradas, sequencialmente, a partir do mesmo número. Para que se possa manter uma estrutura funcional em um banco de dados com casos assim, é preciso que este conjunto de entidades fraco esteja relacionado com um conjunto de entidades forte que será designado como identi�cador para o fraco. No diagrama da Figura 4, é ilustrada a situação do conjunto de entidades fraco 1 e um relacionamento de dependência com um conjunto de entidades forte 2 identi�cador para que seja gerada uma estrutura válida e funcional. Outro conceito complementar importante é o de especialização, no qual dentro de um conjunto de entidades, possam existir diferentes tipos de entidades que possuem atributos em comum, relacionadas às suas características básicas, mas estas entidades podem se diferenciar em algumas características particulares de um subconjunto e outro, criando a possibilidade de se dividir um conjunto de entidades. 46 Figura 5 1b1a Fonte: O autor. Neste diagrama da Figura 5, é possível observar que o diagrama possui um conjunto de entidades 1, mas logo abaixo, uma nova forma (triângulo invertido) que intermedia uma conexão com outros dois conjuntos de entidades 1a e 1b. Este triângulo invertido representa a especialização que faz com que o conjunto de entidades 1 seja subdividido em outros conjuntos de entidades 1a e 1b que possuem as mesmas entidades do conjunto 1, mas separadas contendo os seus atributos especí�cos. Há casos nos quais a estruturação dos conjuntos de entidades é construída e depois de alguns conjuntos estarem de�nidos, é percebido que dois ou mais conjuntos possuem muitos atributos em comum, e aí surge a possibilidade de se gerar um conjunto de entidades que reúna todas estas entidades num só conjunto, sendo este processo chamado de generalização. Com isso, realiza-se o oposto da especialização, ressaltando atributos comuns entre os conjuntos de entidades e omitindo-se atributos especí�cos não comuns entre os conjuntos separados. Outro conceito bastante importante relacionado à especialização e generalização é o de herança, que semelhante ao conceito em programação orientada a objetos, permite que atributos do conjunto de entidades mais geral possam ser compartilhados com os conjuntos de atributos especializados e, assim, forma-se uma estrutura muito e�ciente de se trabalhar os dados, pois sem esta possibilidade 47 de herdar atributos, não haveria necessidade de generalizar um conjunto de entidades ou especializá-los, pois haveria muita redundância de dados e, desta forma, apenas o conjunto geral possui os atributos e dados comuns aos conjuntos de entidades especializados. Um último conceito importante a ser citado é o de agregação que permite que um agrupamento seja feito contendo conjuntos de entidades e relacionamentos de forma que sejam considerados como um único elemento e, assim, possam ser ligados a um relacionamento. Isso existe para que seja possível interligar diretamente dois relacionamentos, pois a notação base ER não permite este tipo de ligação direta. Observe a Figura 6 para compreender a ideia de agregação onde um retângulo se posiciona ao redor de dois conjuntos de entidades e um relacionamento entre eles, agrupando-os. Assim, é possível que uma ligação entre este relacionamento da agregação seja ligado a outro relacionamento fora da agregação sem que haja um conjunto de entidades entre eles. 48 Figura 6 1 2 Fonte: O autor. Com os conceitos adicionados aos já estudados para a modelagem ER, é muito válido para o aprendizado gerar diagramas para diversas situações �ctícias que possam simular ao menos, parcialmente, situações reais e suas regras de negócio. Os diagramas tendem a conter erros com a pouca prática, mas como todas as áreas, com a prática e estudos mais aprofundados, a tendência é minimizar erros de elaboração dos diagramas e aumentar a agilidade na de�nição dos conjuntos de entidades e relacionamentos. Inicialmente, o diagrama pode ser desenhado à mão mesmo de forma rústica no projeto, mas para efeito de documentação, acaba sendo feito em alguma ferramenta que permita o desenho seguindo os padrões ER e, para este material, o SGBD utilizado para estudos será o MySQL que permite a criação de diagramas além da implementação do banco de dados. 49 Figura 7 Fonte: O autor. Ao instalar o SGBD MySQL, como poderá ser visto em aula posterior, existe a opção de criação de novo modelo ER (File, New model) que abre uma interface para criação de diagramas e é possível a criação de tabelas para a modelagem de conjuntos de entidades, como se pode ver na Figura 7. Com o uso desta ferramenta do MySQL, assim como outras disponíveis para uso gratuito ou pago, pode-se elaborar a estrutura conceitual de todo o banco de dados, obtendo-se um primeiro esboço ainda sem componentes importantes como o da Figura 8, e que deve ser aprofundado e complementado para que seja realmente completo e correto, mas isso varia em cada situação com base nas regras de negócio que geram os documentos de requisitos utilizados como base na modelagem. 50 Figura 8 Fonte: O autor. 51 Desenvolvimento de Banco de Dados 05 52 Após as etapas iniciais de concepção de um banco de dados e uso da ER para modelagem, estamos estudando os conceitos relevantes, dentro deste contexto, nas primeirasaulas desta disciplina. Aos poucos, com o ganho de experiência prática e conhecimentos adquiridos com estudos, você vai aprimorar a forma como utiliza o conhecimento e vai pensar em melhores soluções, aplicando de forma cada vez mais e�ciente os recursos disponíveis. Ao se pensar em como será a estrutura de um conjunto de entidades, é preciso delimitar bem o conjunto de atributos que serão utilizados a partir da abstração do modelo real, e também especi�car adequadamente o domínio de dados para estes atributos, como estudado anteriormente. Nesta etapa do projeto, a correta escolha depende de bons requisitos obtidos logo no início, mas também da chamada expertise, que se obtém com o tempo e aperfeiçoamento das habilidades na elaboração de conjuntos de atributos, fazendo com que se tenha plena consciência de cada tipo adequado de dado para cada atributo e como de�nir estes atributos. Um exemplo é o atributo endereço que, inicialmente, era colocado como atributo único textual no qual toda informação era inserida numa única coluna da tabela que pode representar a estrutura do conjunto de entidades. Com o tempo, foi sendo dividido em partes com um atributo logradouro, outro para número, complemento, etc. Com o tempo e com o aumento do início das vendas online, o atributo de endereço foi tornando-se cada vez mais completo e complexo com atributos para indicação de pontos de referência, país e pessoa que pode receber uma entrega no local, por exemplo. 53 Os esquemas também foram sendo melhorados e re�nados, de forma que esquemas gerados por meio de outros esquemas trouxeram novas visões dos dados armazenados e ofereceram uma maior possibilidade de auxílio a gestores em estratégias e tomadas de decisão. Os esquemas gerados a partir de outros esquemas permitem que aos poucos seja possível unir dados de conjuntos diferentes de entidades com o objetivo de obter novas informações com o cruzamento de dados. Atualmente, com a evolução e a popularização da Internet, isto se tornou um nicho de mercado fortemente explorado. Com isso, os sistemas de gerenciamento de banco de dados evoluíram e foram agregando funcionalidades que contribuíram com esta melhoria da gestão e uso de bases de dados cada vez maiores, e, aos poucos, foi sendo moldado um campo para o surgimento dos termos Big Data e Business Intelligence que estão em alta no mercado devido ao nível de auxílio gerencial obtido por estas inovações em TI. 54 cliente = (cod_cliente,nome_cliente, cpf_cliente, fone_cliente) produto = (cod_produto,descrição_produto, quantidade_produto) venda = (cod_venda, cod_cliente,cod_produto, quantidade_venda) Em esquemas como os indicados em cliente, produto e venda possuem atributos próprios que não seriam corretamente alocados se mudassem de lugar na de�nição feita, pois atributos como CPF são especí�cos de pessoas e não de produtos, por exemplo. É importante observar que a partir destes conjuntos de entidades é possível imaginar novos usos para as entidades armazenadas, como no caso em que a empresa pode desejar criar um canal de comunicação de pós-venda de produtos para avaliação do serviço prestado na compra física ou pela Internet, além do próprio produto. Para isso, usando apenas o conjunto de entidades cliente, seria possível a obtenção de telefones, mas não seria possível descobrir se são clientes que �zeram compras ou não. Cruzando dados de cliente com dados do conjunto de entidades venda, é possível �ltrar os dados de forma que sejam buscados telefones apenas de CPFs cadastrados nas vendas obtendo-se, assim, apenas clientes que realizaram compras. É possível re�nar mais ainda o processo, mas para isso, podem ser necessários outros atributos como data da venda, valor total da venda e por produto, de forma que seria possível a obtenção de uma lista de quem comprou produtos nos últimos 15 dias, quem mais comprou determinado produto, quem realizou o maior volume de compras num certo período, etc. 55 Assim, aumenta-se muito a e�ciência e aplicabilidade dos bancos de dados em negócios de qualquer natureza, pois com tantos dados disponíveis podendo ser cruzados sob determinados critérios, mudanças de rumo nas empresas, ajustes em processos e até abertura e fechamento de unidades podem ser estudadas. Independentemente de qual a proposta de uso de um banco de dados, é essencial que todo este uso seja pensado e os atributos escolhidos a serem inseridos nos conjuntos de entidades, pois a falta de dados também é um grande impedimento do progresso de muitas empresas no atual cenário competitivo do mercado. Como citado, com o uso de alguns atributos adicionais como data da venda e valores obtidos nas transações, é possível ter um banco de dados mais completo e que não seja apenas um repositório de histórico de transações, mas uma ferramenta de gestão completa. Assim, uma adequada modelagem do banco de dados é essencial, partindo de uma boa análise e interpretação das regras de negócio de clientes que solicitem o desenvolvimento de sistemas de banco de dados para gerir suas operações, lembrando que um dos maiores problemas em sistemas deste tipo são adições e exclusões de atributos em conjuntos de atividades depois que o sistema está em uso e tendo já uma base de dados cadastrada. Para a etapa de desenvolvimento de um banco de dados é possível utilizar vários métodos e ferramentas, mas a unanimidade é o uso de um SGBD completo que ofereça recursos diversos para o gerenciamento de um banco de dados. 56 Para se trabalhar da melhor forma em TI, uma dica é a escolha de boas ferramentas de trabalho, assim como em todas as demais pro�ssões, e, com isto, uma forma de se iniciar os estudos e treino para o desenvolvimento de banco de dados é o teste de diferentes SBGD para que se possa escolher um mais adequado ao estilo pessoal de trabalho ou necessidades de uma empresa pela qual desenvolva seu trabalho. Busque opções gratuitas e até versões de teste de ferramentas pagas para conhecer um pouco dos recursos disponíveis, pontos positivos e negativos de cada opção, de forma a ter maior segurança e conforto no desenvolvimento de soluções computacionais na área de banco de dados. Existem opções gratuitas e pagas no mercado, e como é comum na área de TI, softwares pagos, geralmente, possuem melhores recursos e maior suporte, mas alternativas gratuitas que podem inclusive entrar na categoria de software livre de código aberto (open source) e poderem ter suporte em grandes comunidades de desenvolvimento que criam, inclusive, variações da versão original do software e podem se adequar melhor às necessidades. A grande referência da área certamente é o SGBD da Oracle que é pago, mas que suporta massivas quantidades de dados de forma estável e segura, assim como o SQL Server da Microsoft que também é bastante utilizado para o gerenciamento de banco de dados. Opções como MySQL e PostGre SQL também são seguras e capazes de suportar grandes volumes de dados, tendo versões gratuitas que suprem as necessidades da maioria dos bancos de dados. Para se iniciar o desenvolvimento de um banco de dados, uma ferramenta como qualquer uma das citadas facilita bastante o processo, permitindo um bom gerenciamento do banco depois de criado através do uso de recursos próprios da ferramenta e do uso da linguagem padrão para banco de dados SQL. 57 Instalação de um SGBD (MySQL Workbench 8.0 CE) Para se desenvolver uma solução para armazenamento e manipulação de dados, pode-se optar pela instalação de um dos bons Sistemas de Gerenciamento de Banco de Dados disponíveis no mercado, mas alguns são pagos e podem oferecer versões de demonstração, e outros são gratuitos enquadrando-se, inclusive, em alguns casos, como open source, ou seja, que disponibilizam acesso ao código fonte para quem tiver interesse em modi�car suas funcionalidades ou aparência, por exemplo. Foi escolhida uma versão já bastante conhecida do mercado e possui diversas versões já disponibilizadas e para este material, foi escolhida a versão MySQL Workbench 8.0CE gratuita e disponível no endereço https://dev.mysql.com/downloads/windows/installer/8.0.html. 58 https://dev.mysql.com/downloads/windows/installer/8.0.html Figura 1 Fonte: Disponível aqui Importante frisar que é constante o desenvolvimento de atualizações e novas versões que podem mudar a interface de instalação, além de novos recursos e correções de problemas identi�cados em versões anteriores. Após o download da versão do instalador ou baixar a completa (Figura 1), inicia-se o processo de instalação com a execução do pacote de instalação baixado e temos, então, uma sequência de passos indicada nas imagens da sequência da aula. 59 https://dev.mysql.com/downloads/windows/installer/8.0.html Figura 2 Fonte: O autor. Depois, é preciso optar por uma das versões de uso, sendo adequado e su�ciente para a disciplina, a opção padrão indicada na Figura 2, onde o pacote típico para desenvolvimento é oferecido. Na Figura 2, são exibidos os conteúdos que necessitam ser baixados do site o�cial para o processo de instalação. Basta avançar com a opção Next. Aos poucos, o instalador vai executando o download dos componentes necessários e prepara para o processo de instalação local na máquina para posterior uso no desenvolvimento de sistemas gerenciadores de banco de dados. Depois de instalados os pacotes solicitados e necessários, a instalação é encerrada nesta etapa e, na sequência, inicia-se o processo de adição dos pacotes que forem interessantes para seu trabalho. Na tela da Figura 3, são exibidos os pacotes disponíveis para download em versões distintas de uso de linguagem de programação Java ou Net, por exemplo. 60 Figura 3 Fonte: O autor. Figura 4 Fonte: O autor. A instalação vai chegar a um ponto mostrado na Figura 3, onde se escolhem os pacotes desejados selecionando-os na parte esquerda da tela e adicionando à parte direita para instalação. Neste caso, foram selecionados apenas componentes básicos de manipulação de banco de dados MySQL. Após completar o download dos componentes solicitados, eles são instalados e o processo de instalação é encerrado como mostrado nas etapas exibidas na Figura 4. 61 Figura 5 Fonte: O autor. Depois de terminada a instalação, é possível executar o SGBD e se deparar com uma interface de apresentação da ferramenta onde é apresentada a tela de boas-vindas da interface e depois, na Figura 5, a janela de trabalho quando se inicia um novo projeto de banco de dados. Após esta etapa de instalação, o SGBD está pronto para uso e, a partir daí, é preciso se ambientar à ferramenta e conhecer seus recursos, não perdendo de vista o foco principal que é o de se criar tabelas, inserir dados e manipulá-los, gerar consultas e tudo mais que for necessário e disponível pela ferramenta. 62 Um software complexo como um SGBD possui muitas funcionalidades e particularidades de uso, e sempre é recomendável que se inicie o uso de uma nova ferramenta com o auxílio de um manual ou conteúdo de ajuda sobre a ferramenta. No caso do SGBD MySQL, existe conteúdo o�cial disponível em inglês, mas que pode ser traduzido em tempo real pelas ferramentas do navegador, visto que a ajuda é online, mas podem-se buscar outras fontes e encontrar materiais de qualidade até mais adequados ao tipo de ajuda desejado. 63 https://go.eadstock.com.br/zY Linguagem SQL – Definição de Tabelas 06 64 Para se trabalhar efetivamente com banco de dados, é preciso que alguma ferramenta possa manipular os dados de um banco de dados ou uma linguagem possa desenvolver uma aplicação para tal. Existem sistemas gerenciadores de banco de dados capazes de manipular sem problemas os dados das tabelas de um banco, mas para um sistema desenvolvido para um terceiro como ocorre, na maioria das vezes, o processo de manipulação do banco de dados deve ser o mais transparente possível e, em muitos casos, não necessitar que o usuário tenha conhecimento algum dos conceitos de banco de dados e seu gerenciamento. Pensando em um meio mais transparente e de fácil aprendizado para manipulação dos bancos de dados, foi implementada a linguagem SQL, considerada uma referência para o trabalho com banco de dados relacionais, tendo uma boa coleção de comandos para criação de scripts que servem como roteiros de ações pré- de�nidas para que ações tais como criar tabelas, inserir dados, consultá-los ou alterá- los possam ser escritas e executadas em um banco de dados sem muitas linhas de código, como ocorre na maioria das linguagens de programação. A linguagem SQL possui suas características próprias para as tarefas de manipulação de banco de dados e pode ter seus comandos subdivididos em partes conhecidas como DDL e DML citadas anteriormente. Os comandos DDL para de�nição de dados representam os comandos estruturais para criar tabelas a partir de esquemas, modi�cá-las e excluí-las, se necessário. Também são responsáveis pela indicação de restrições voltadas à maior garantia de integridade dos dados, porventura armazenados no banco. De�nições de visões e direitos de acesso a usuários também são de responsabilidade de comandos DDL. 65 Outro conjunto de comandos se enquadra como DML de comandos de manipulação de dados envolvendo ações inserção, alteração e exclusão de dados e não de toda a estrutura das tabelas, sendo assim, utilizados muito mais vezes que os comandos do tipo DDL. A linguagem SQL também pode ser embutida dentro de códigos de outras linguagens compatíveis como C++ e Java, por exemplo, permitindo que estas linguagens não necessitem que nelas sejam implementados comandos de interação direta com banco de dados. A linguagem sofreu mudanças e evoluiu como a maioria das demais linguagens de programação e possui em atividade versões como as SQL-92, SQL-1999, SQL-2003, SQL-2008 e SQL-2016. Independentemente da versão utilizada, os fundamentos da linguagem são padronizados, pois a base da linguagem é mantida de forma a aumentar a compatibilidade entre sistemas e, geralmente, o que ocorre em novas versões implementadas é o acréscimo de recursos e melhorias no que já era oferecido, se necessário ou útil. 66 A manipulação de dados com SQL é bastante fácil e rápida de aprender, mas existem ferramentas que oferecem recursos robustos de gerenciamento de banco de dados, além de aceitarem perfeitamente os comandos SQL. Um SGBD completo é um excelente recurso para se trabalhar com dados de forma con�ável e opções como Oracle, MySQL e SQL Server são excelentes opções no mercado, podendo ser gratuitos ou não. Definindo Esquemas As relações necessitam ser criadas e mantidas através da linguagem SQL, e o conjunto de instruções disponíveis na DDL foi implementado para que se possam determinar esquemas para cada relação e tipos de dados contidos nos atributos de�nidos. Assim, por meio destes comandos, as tabelas e seus atributos podem ser gerados e suas estruturas gerenciadas, além de permitirem que os atributos tenham regras de�nidas em relação ao que deve ser aceito como dado válido, de forma a oferecer integridade ao banco de dados todo. Ao de�nir esquemas para criar tabelas, é preciso lembrar-se da ideia básica de que as tabelas possuem como base as colunas, que representam seus atributos, e serão as estruturas de armazenamento de dados. Sendo assim, no momento em que são de�nidos quais atributos farão parte de uma tabela, é preciso também delimitar os tipos de dados aceitos e o domínio de valores deste tipo que podem ser inseridos nestes atributos. 67 https://go.eadstock.com.br/zZ Figura 1 Os tipos de dados mais utilizados segundo Silberschatz (2020), na de�nição de dados são char (N) ou character (N), que permite que sejam armazenados até N caracteres de texto no atributo, sendo então adequado para textos comuns. O tipo varchar (N) ou character varying (N) representa uma alternativa ao tipo char em que a diferença básica entre ambos é que o tipo char armazena um tamanho �xo N de caracteres, ao passo que varchar pode conter até N caracteres, armazenando apenas a quantidade signi�cativa de caracteres.Outro tipo fundamental se chama int ou integer, que representa um dado simples numérico inteiro limitado a um valor máximo aceito pelo hardware e sistema operacional. Uma variação smallint também pode ser utilizada, sabendo-se que esta aceita um valor limite menor também indicado pela limitação de hardware. O tipo numeric (N, M) é outro tipo numérico, mas para números reais com casas decimais, sendo que N representa o total de dígitos numéricos aceitos (contando com os dígitos à direita da vírgula), e M o total de dígitos aceitos como casas decimais à direita da vírgula. Um exemplo seria numeric (4,2) que aceita valores desde 0 a 99,99 no máximo, por exemplo. O tipo real é utilizado em aplicações matemáticas, pois aceita números de ponto �utuante, ou seja, com casas decimais além de números inteiros, e existe uma variante double precision que aceita números maiores e mais precisos em termos de casas decimais, permitindo o trabalho com valores muito grandes. Por �m, o tipo �oat (N) é usado também como número decimal com uma precisão de pelo menos N dígitos à direita da vírgula sendo, então, uma terceira alternativa para números decimais. Para criar um esquema usando SQL, é utilizado o comando create table para de�nir a estrutura a ser gerada seguindo uma sintaxe bastante simples que seria a forma como se deve escrever o comando. Suponha que se queira criar um esquema para uma tabela de clientes com os atributos básicos pessoais como CPF, nome e telefone. O comando para esta ação é bastante simples, e uma sugestão seria a da Figura 1. create table cadastro_cliente 68 Fonte: autor. (Código_cliente int, cpf_cliente numeric (11,0), nome_cliente varchar (50), telefone_cliente numeric (10,0), primary key (Código_cliente)) No exemplo da Figura 1, foram de�nidos os tipos de dados para cada atributo, de forma intuitiva, apenas como exemplo, pois em casos reais, é preciso veri�car junto ao cliente, os tipos e tamanhos adequados em função das regras de negócio do local para que sejam indicados com exatidão os tipos e tamanhos adequados aos requisitos levantados. Observando o exemplo da Figura 1 é importante destacar que o script para geração do esquema se inicia com a identi�cação do nome da tabela a ser criada e, entre parênteses, vêm todos os atributos e seus respectivos tipos e domínios de dados aceitos, mas ao �nal, é fundamental a indicação do campo ou campos que compõem a chave primária da tabela com o uso das palavras reservadas primary key e a lista de atributos (apenas os nomes) indicados entre parênteses e separados por vírgula se forem mais de um. 69 Manipulando um Banco de Dados Após a criação de uma tabela, esta pode ser gerenciada através de scripts com comandos diversos para que seja povoada com dados e estes possam ser utilizados para as atividades previstas para o SGBD. A inserção de dados também é um processo relativamente simples, porém trabalhoso, pois geralmente os dados a serem inseridos no banco são obtidos por interações manuais de usuários direta ou indiretamente. Seja qual for a origem dos dados, para �ns de estudos os dados serão inseridos manualmente com o uso da palavra reservada insert que necessita de alguns parâmetros em sua sintaxe para que possa ser funcional. Partindo da tabela Clientes gerada pelo script exemplo, da imagem 26, pode atribuir um conjunto de dados aos parâmetros do comando para que estes sejam inseridos como uma nova tupla de dados na tabela Clientes. Observe uma sugestão de como poderia ser escrito um comando para inserir dados referentes a uma tupla na tabela Clientes. insert into cadastro_cliente values (1, 12345678900, ‘Charles Chaplin’, 1198765432) É importante estar atento aos detalhes no uso dos comandos da linguagem, pois em sua sintaxe, os detalhes fazem diferença, e não respeitar as regras de escrita destes comandos pode implicar erros nos dados ou o não funcionamento dos scripts gerados para a realização de ações. As três palavras-chave devem ser utilizadas da forma como mostrado, o nome da tabela onde serão inseridos os dados deve ser indicada após a palavra into e os dados dentro de parênteses após a palavra value, e na ordem em que os atributos foram de�nidos na tabela, pois não são especi�cados quais dados são para quais campos na tabela. Caso algum dado seja nulo, basta deixar sem o dado, mas inserindo as vírgulas separadoras, normalmente, cuidando que dados numéricos são inseridos de forma simples, e os dados do tipo texto entre aspas simples. 70 Pode-se excluir todos os dados de uma tabela, mantendo sua estrutura para uso posterior, usando-se o comando delete de forma bastante simples, pois como parâmetro na sintaxe do comando é preciso apenas indicar qual tabela terá todos os seus dados excluídos como se pode ver no exemplo. delete from cadastro-cliente Outras formas de se trabalhar com exclusões utilizam o comando drop para estas tarefas, sendo que sua sintaxe permite duas variantes diferenciadas apenas por um parâmetro, mas que geram ações bastante diferentes. Observe os dois exemplos a seguir: drop from cadastro_cliente drop table cadastro_cliente A primeira linha de comando do script funciona como o comando delete, excluindo apenas os dados de todas as tuplas da tabela, mas a segunda opção de comando exclui não somente todos os dados da tabela, mas também remove toda a sua estrutura, eliminando-a do banco de dados, e para que se possa novamente inserir dados, ela precisaria ser recriada com o comando create table. Por �m, atributos podem ser adicionados ou excluídos de uma relação ou tabela utilizando-se o comando alter que modi�ca a estrutura de tabelas, sendo essencial observar com cuidado as ações realizadas por este comando. alter table cadastro_cliente add estado_cliente char (2) alter table cadastro_cliente drop telefone_cliente 71 Nos dois exemplos, o comando se inicia da mesma forma com as palavras alter table e o nome da relação desejada cadastro_cliente. Depois, o primeiro comando acrescenta um atributo chamado estado_cliente que aceita dois caracteres de texto, sendo adequado para siglas de estados no Brasil. No segundo exemplo, o uso da palavra drop faz com que o atributo indicado telefone_cliente seja excluído da estrutura da relação, mas é importante observar que existe um enorme risco no uso deste comando, pois ao se excluir o atributo, seus dados também são perdidos automaticamente (sendo que alguns gerenciadores podem não permitir esta ação), e outro risco é o de o atributo fazer parte de uma chave primária ou ser chave estrangeira num relacionamento entre tabelas. A melhor forma de aprender comandos da linguagem SQL é criando banco de dados de teste com relações e atributos variados, mas que sejam coerentes e baseados em algum problema �ctício, por exemplo. Assim, as estruturas criadas podem ser melhor compreendidas, avaliadas e testadas com a inserção e manipulação de dados nestas para que a prática permita que se compreenda o uso dos comandos e a organização de um banco de dados. 72 Linguagem SQL – Consultas 07 73 Os bancos de dados possuem a função essencial de armazenar dados, mas esta não é a única motivação para se desenvolver um sistema gerenciador, e sim utilizar, posteriormente, os dados armazenados para diferentes �ns. Uma das maiores atividades realizadas em banco de dados são as consultas em dados armazenados para a obtenção de informações variadas necessárias para atividades diversas e tomadas de decisões, por exemplo. O comando utilizado chamado select é provavelmente o mais utilizado e importante dos comandos SQL e em função de seu amplo uso permite que muitas variações nos parâmetros e formas de uso estejam disponíveis para a realização de pesquisas em banco de dados. A base de um comando de consulta select se baseia nas palavras select, from e where, com seus respectivos parâmetros, mas por mais que aparentemente seja uma sintaxe simples, neste caso, o comando permite muitas combinações de parâmetros para estas três palavras e, ainda, permitea adição de outros elementos nos comandos, tornando este um recurso extremamente poderoso da linguagem SQL. Para se escrever comandos select é importante ter em mente que a base do uso do comando é a de se buscar certos dados de determinada relação, sendo que os dados podem ser especi�cados ou não, e a relação pode ser de uma tabela especí�ca ou de mais de uma tabela que possam ser relacionadas através de suas chaves primárias e estrangeiras. O terceiro componente de um comando select é o que permite maior variação, em que a cláusula where de�ne os critérios para �ltragem dos dados localizados numa relação a serem retornados ao solicitante. Um exemplo de formato básico de uso do comando select é apresentado a seguir: select dados from tabelas where condições Esta sintaxe básica do comando serve para que se possa conhecer a estrutura sintática do mesmo, mas a escrita de scripts de consulta funcionais dependem de uma melhor de�nição dos parâmetros na elaboração dos comandos. 74 Supondo a base de dados contida numa relação, a forma mais simples de se utilizar o comando select, mas não a mais usual é solicitando que todos os dados desta relação sejam exibidos como no exemplo: select * from cadastro_cliente Este comando trará como retorno todos os dados contidos em todos os atributos da tabela cadastro_cliente e, com isto, pode surgir o questionamento do motivo de não ser muito usual uma consulta simples como essa, mas o problema com ela é que é bastante comum que uma tabela possa conter uma quantidade enorme de tuplas com vários atributos, resultando numa listagem muito grande de dados que pode mais prejudicar que auxiliar uma análise sobre os dados obtidos. O uso do símbolo asterisco (*), assim como nos sistemas operacionais, representa qualquer valor, ou seja, como após a palavra select são indicados atributos da relação a serem exibidos, o símbolo indica ao comando que todos os atributos devem ter seus dados exibidos na consulta, e caso se deseje apenas alguns, pode-se ajustar o exemplo anterior. select nome_cliente, telefone_cliente from cadastro_cliente Com esta alteração, todas as tuplas armazenadas na tabela cadastro_cliente serão listadas, mas apenas os dados dos atributos nome_cliente e telefone_cliente, atendendo à ideia de que são necessários apenas o nome e o respectivo telefone de cada cliente cadastrado na tabela naquele momento. Também é possível ajustar a relação que serve de base para as consultas, permitindo que uma ou mais tabelas sejam indicadas, separadas por vírgulas, na cláusula de�nida pela palavra from, mas, como dito, é preciso veri�car se existe relacionamento entre as tabelas utilizadas e, se for necessário, que exista uma correspondência entre dados das tabelas para a �ltragem de dados. 75 Tabelas que possuam relacionamentos entre si através da existência de chaves primárias e chaves estrangeiras podem usar isso para encontrar ligações entre outros dados das tabelas, como no caso de se buscar todas as compras realizadas por determinado cliente em um estabelecimento. Aproveitando uma situação hipotética já utilizada de um sistema de vendas com cadastro de vendas e clientes, a Tabela 1 traz alguns dados contidos nas tabelas para exempli�car um banco de dados para auxiliar na compreensão das consultas. Tabela 1 Fonte: O autor. cadastro_cliente código_cliente cpf_cliente nome_cliente telefone_cliente estado_c 1 12345678900 Charles Chaplin 1198765432 SP 2 98765432100 Thomas Edison 1432564852 SP 3 55555555500 Albert Einstein 4398653325 PR cadastro_venda código_venda descrição quantidade código_cliente 1 PRODUTO A 2 3 2 PRODUTO B 5 2 3 PRODUTO A 10 2 76 Nestes exemplos da Tabela 1, alguns detalhes são relevantes, como, por exemplo, a coincidência de valores das colunas de códigos dos atributos código_cliente e código_venda que repetem os valores 1, 2 e 3, mas isto ocorre em função dos códigos em ambos os atributos serem de�nidos como valores numéricos inteiros incrementados, sequencialmente. Com isso, é importante a�rmar que um valor 1 no atributo código_cliente não possui relação direta com um valor 1 no atributo código_venda, pois são códigos utilizados apenas para identi�cação de clientes diferentes e vendas diferentes nas respectivas tabelas. O que não é coincidência e relevante é observar que existe a ligação entre os valores 2 dos atributos código_cliente das duas tabelas, pois na tabela cadastro_cliente, este valor é a chave primária de identi�cação da tupla, ao passo que na tabela cadastro_venda indica que o cliente 2 realizou compras no estabelecimento (duas neste exemplo). Um exemplo de consulta sobre as tabelas seria solicitar a exibição de todos os dados das duas tabelas, inserindo o nome das duas separado por vírgulas, fazendo com que todos os dados das duas tabelas fossem exibidos em listagem única, mas isto não é interessante, pois além de poder ser trazida uma lista muito longa e confusa, existe a redundância de códigos das chaves primárias e alguma confusão que pode ser gerada com a chave estrangeira. 77 Lembre-se de que, comumente, consultas não geram mudanças nos dados, e apenas os �ltram a partir de um conjunto de parâmetros que incluem condições de validação de critérios para as buscas, podendo trazer muitas variações de pesquisas. Existem diferentes composições de pesquisas, mesmo em banco de dados pequenos capazes de retornar detalhes contidos no banco que podem surpreender e aumentar o grau de especialização de um especialista em banco de dados. Filtrando Consultas Normalmente, as consultas buscam retornar apenas dados esperados a partir do que é solicitado em scripts de comandos select, mas para isso, estes comandos precisam ser escritos de forma adequada, atendendo à sintaxe necessária e, principalmente, de�nindo os critérios indicados nos parâmetros. Dentro do comando select, as palavras select e from indicam, respectivamente, os atributos a serem exibidos e as tabelas que servem de base para a consulta, mas para se �ltrar o conteúdo a ser exibido, entra em uso a terceira parte do comando que utiliza a palavra where como base para a sintaxe do comando. Na cláusula where são indicados �ltros para seleção de dados a partir de critérios que devem ser escritos segundo a sintaxe do comando, mas neste ponto é que a complexidade aumenta, pois esta cláusula permite bastante variação de parâmetros. 78 https://go.eadstock.com.br/z0 Para se escrever os parâmetros de �ltragem das consultas existem alguns símbolos matemáticos utilizáveis para que cláusulas baseadas em lógica possam ser escritas. Os principais símbolos utilizados são descritos na Tabela 2. Tabela 2 Fonte: O autor. SÍMBOLO DESCRIÇÃO EXEMPLO = Veri�ca a igualdade de um atributo em relação a um valor especí�co. nome = ‘João’ > Veri�ca se um atributo é maior que um valor especí�co. saldo > 1000 >= Veri�ca se um atributo é maior ou igual a um valor especí�co. idade >= 18 < Veri�ca se um atributo é menor que um valor especí�co. saldo < 0 <= Veri�ca se um atributo é menor ou igual a um valor especí�co. peso <= 70 <> Veri�ca se um atributo é maior que um valor especí�co. cor <> ‘azul’ and Une duas condições para veri�car se as duas resultam verdadeiro ao mesmo tempo. saldo < 0 and situação = ‘desempregado’ or Une duas condições para veri�car se pelo menos uma das duas resulta verdadeiro. idade <18 or idade >= 60 not Inverte o resultado de uma condição de verdadeiro para falso e vice-versa. Not NULL 79 O uso dos símbolos é essencial na construção dos critérios de �ltragem de dados na cláusula where, pois por meio deles é possível elaborar critérios a serem veri�cados no conjunto de dados da relação, bem como obter uma listagem de dados desejados. No exemplo da imagem R, além de estarem listados os símbolos usuais de elaboração de condições, também estão inseridas descrições para auxiliar na compreensão do que cada símbolo representa, logicamente, como no caso do símbolo de igualdade, que permite que um valor sirva de basepara que sejam localizadas todas as tuplas onde o atributo especi�cado na condição seja igual. Além dos símbolos matemáticos indicados, existem três operadores lógicos and, or e not que representam operadores lógicos que permitem a avaliação de outras condições. O operador and, por exemplo, necessita que duas condições sejam de�nidas de forma que ele sirva para comparar os resultados individuais das duas condições em função da lógica deste operador. Para o operador and, o resultado apenas é verdadeiro se as duas condições ligadas a ele resultem verdadeiro também, caso contrário, o resultado é falso e os dados da respectiva tupla não são retornados na consulta. O exemplo utilizado na Tabela 2 para o operador and indica que serão exibidos apenas dados de tuplas onde saldo < 0 and situação = ‘desempregado’, ou seja, em tuplas onde o saldo seja negativo e a pessoa esteja desempregada, sendo que pessoas com saldo positivo ou zero não sejam aceitas ou que estejam empregadas também não. O operador or possui sintaxe igual à do operador and e também necessita de duas condições que resultem em verdadeiro ou falso para que as duas sejam avaliadas em conjunto, com a diferença que se qualquer uma das duas resultar verdadeiro, o resultado também é verdadeiro e a tupla que contém os dados comparados é utilizada. No exemplo da imagem 29, idade <18 or idade >= 60 temos que são aceitas tuplas nas quais a idade seja menor que 18 anos ou maior ou igual a 60 anos, formando, assim, um conjunto de valores aceitos na condição, e o resultado é falso apenas em tuplas com valores entre 18 e 59 no atributo idade. Existe uma opção complementar chamada between que permite a de�nição de intervalos de valores que pode ser usada no lugar de and e or para casos, como o desse do intervalo de idade, sendo que a mesma condição poderia ser escrita como between 18 and 59 e teria o mesmo efeito. 80 Por �m, o operador not apenas inverte o resultado de uma condição, sendo que se uma condição resultaria verdadeira, este operador muda o resultado para falso, mas seu uso é um pouco diferente na linguagem SQL pode receber complemento de outras palavras reservadas da linguagem para maior �exibilidade de uso. select * from cadastro_cliente select nome_cliente from cadastro_cliente select nome_cliente from cadastro_cliente where estado_cliente = “SP” select nome_cliente from cadastro_cliente where estado_cliente = “SP” and telefone_cliente = 1432564852 Partindo dos exemplos acima, temos uma progressão não apenas do tamanho dos comandos do script SQL, mas também de sua complexidade e capacidade de �ltragem de dados. No primeiro exemplo já citado, mostra todos os clientes cadastrados na tabela cadastro_cliente, ao passo que o segundo exemplo traz a mesma quantidade de entidades listada, mas contendo apenas os dados do atributo nome_cliente. No terceiro exemplo, novamente são mostrados apenas os nomes de clientes, mas no exemplo apenas os nomes de clientes do estado de São Paulo podem ser retornados da consulta, pois existe a cláusula de �ltragem no comando indicando um critério de pesquisa. No último exemplo é ampliada a �ltragem de exibição de nomes, e a consulta se especializa a um nível que apenas clientes do estado de São Paulo com determinado número de telefone será retornado como resultado, e isto gera uma expectativa de que seja retornado apenas um resultado, ou até nenhum. 81 A melhor forma para se compreender as consultas é pensar em casos reais em que se deseja procurar dados especí�cos em uma listagem, por exemplo, e iniciando a elaborar consultas simples que retornam dados sem muitos �ltros para que se acostume com a sintaxe dos comandos e erros comuns que se aprende na prática. Criar scripts com muitas consultas baseadas em atributos de uma tabela ou mais é bastante e�ciente como aprendizado, pois com este treino, as chances de se obter um bom aprendizado aumentam muito. 82 Armazenamento e Consulta de Dados 08 83 Aproveitando conceitos estudados de de�nição de projeto de banco de dados usando o modelo ER e conhecendo a base da linguagem SQL, é possível imaginar uma pequena aplicação de exemplo para o emprego destes conceitos. Para isso, o foco é a etapa de desenvolvimento de um pequeno projeto experimental utilizando o SGBD MySQL que foi introduzido nos estudos para aplicar o que foi estudado até o momento e que pode continuar servindo de base para a continuidade dos estudos. Para iniciar este trabalho, é preciso primeiro idealizar uma aplicação �ctícia e, partindo da ideia, seguir os passos seguintes de projeto básico deste banco de dados, para que depois ele possa servir de base para o desenvolvimento no SGBD MySQL. Partindo da proposta da criação de um banco de dados para gerenciamento de vendas de produtos para clientes de uma pequena loja, é preciso então compreender as regras de negócio deste estabelecimento, pois não existe uma padronização universal para as atividades do mercado e é preciso conhecer o máximo possível do negócio. Regras do Negócio e Requisitos do Sistema Os requisitos de um sistema representam toda a abstração obtida a partir do que é real e pode ser implementado de forma digital em software, ignorando elementos supér�uos e desnecessários, e organizando bem os requisitos relevantes para que forneçam boa base para o projeto. Supondo que a pequena loja necessite controlar apenas um cadastro de produtos, clientes e vendas no banco de dados, é preciso compreender que dados são relevantes nestes cadastros. Neste negócio, o cadastro de clientes é composto por algumas informações essenciais dos clientes de forma a possibilitar identi�cação dos mesmos e geração de notas �scais eletrônicas se desejado pelo cliente. Com isso, �ca de�nido que para o cadastro de clientes são necessários o nome, CPF, endereço que não precisa ser dividido em atributos separados, e telefone com DDD. Para os produtos, a loja trabalha com o ramo de motopeças e precisa que um cadastro destes itens contenha uma descrição da peça, modelo de moto que a utiliza, anos que aceitam a peça, quantidade disponível para venda e valor para venda. Após a identi�cação dos atributos para venda, veri�cou-se que um módulo adicional seria interessante, pois a quantidade disponível e o valor de venda são informações que dependem das compras destes produtos para revenda, pois não são itens fabricados no local. 84 Partindo dessa necessidade adicional identi�cada, foram de�nidos os atributos de compra, como nota �scal de compra não obrigatória, pois existem produtos que são adquiridos sem nota �scal, como peças adquiridas de uma o�cina caseira de um mecânico que as fornece informalmente para venda como itens usados, e com isto, adicionando a ideia de que é interessante adicionar um atributo de estado da peça no cadastro de produto. Também existe a parte da venda na qual, basicamente, o processo envolve a indicação do cliente que realiza a compra, quais produtos ele comprou, a data da compra e o valor total da compra, sendo que a forma de pagamento não foi citada como relevante, pois o proprietário não se importa em praticar formas distintas de valores de acordo com a forma de pagamento e, assim, os valores �nais podem sofrer algum tipo de desconto aplicado ao �nal apenas e, assim, podendo afetar diretamente o valor recebido na venda. Criando um Banco de Dados O trabalho de criação de um banco de dados usando a linguagem SQL será demonstrado a partir do uso da SGBD MySQL que teve sua instalação explicada em outra aula, de forma que agora é preciso preparar um ambiente para desenvolvimento prático para complementar o que foi estudado até então. 85 Figura 1 Fonte: O autor. Para isso, é preciso antes de iniciar o uso da linguagem SQL em si, preparar o SGBD para o processo, e além do uso do MySQL, será instalado um servidor web para que se possa simular um banco de dados inserido em um servidor. Para este material será utilizado o servidor Apache Xampp que no momento de criação do material estava em sua versão 3.2.4,assim como o SGBD MySQL estava em sua versão 8.0.23, mas independentemente da versão, os aspectos essenciais de funcionamento, normalmente, não são tão afetados por mudanças de versão e basta algum tempo dedicado, e é possível conhecer os diferenciais de novas versões lançadas posteriormente. Após download do instalador do repositório o�cial Xampp, e um processo de instalação bastante simples e intuitivo, chega-se ao ponto no qual basta acionar o servidor e para efeitos de estudo nesta disciplina, ativar com a opção Start, os dois primeiros módulos do servidor (Apache e MySQL), e depois de ativados por meio do botão Admin, é possível acompanhar o andamento do desenvolvimento do banco no servidor. 86 Figura 2 Fonte: O autor. Após a instalação e inicialização dos serviços do servidor terem ocorrido com sucesso (observar a indicação das portas de comunicação para veri�car o processo), como se pode conferir na Figura 1, é possível iniciar o uso do SGBD MySQL normalmente. Existe a necessidade de utilização de um servidor para banco de dados, pois sem a existência de um, qualquer banco de dados gerado seria considerado local e não disponível para conectividade web, por exemplo, tornando-o de uso bastante limitado em um computador local que poderia servir para estudos, mas que �caria muito distante do que ocorre na realidade. Ao abrir o SGBD, veri�ca-se logo na interface inicial de boas-vindas a existência da opção de criação de conexão de banco de dados gerados com o servidor Xampp, como indicado na Figura 2. Ao ser clicada, a opção abre uma janela para criação da conexão, bastando que seja dado um nome para a mesma livremente no campo Connection Name, mostrado na Figura 3. 87 Figura 3 Fonte: O autor. Depois de criada a conexão, ela aparece como opção na tela de boas-vindas, como mostrado na Figura 4 e, ao ser clicada, abre a interface de desenvolvimento, mas antes, pode ser exibida uma mensagem de aviso na qual basta que seja utilizada a opção Continue Anyway. 88 Figura 4 Fonte: O autor. Já na interface de gerenciamento de banco de dados, existe todo um enorme conjunto de opções e ferramentas a serem conhecidas e que podem ser aos poucos exploradas, mas para os estudos nesta disciplina, serão utilizadas apenas as opções essenciais de forma a otimizar o aprendizado, focando em parte do que é mais comum que se utilize. Na Figura 5 é visível, inicialmente, diversas opções de gerenciamento da conexão com o servidor, mas, neste momento, como a conexão já foi criada e se mantém funcional, interessa o que pode ser utilizado na opção Schemas, destacada na parte esquerda da imagem. 89 Figura 5 Fonte: O autor. Figura 6 Fonte: O autor. Na área livre do menu esquerdo, é possível acionar o menu sensível ao contexto ativado pelo clique do botão direito do mouse para que se possa acionar a opção Create Schema e dar início ao desenvolvimento. 90 Figura 7 Fonte: O autor. Na Figura 6, é mostrada a tela que traz o comando SQL para criação de um Schema livro vendas, que pode servir de base para o início do desenvolvimento, gerando o resultado da Figura 7, onde é exibida a estrutura criada do banco de dados com seus principais elementos como tabelas e visões. 91 Figura 8 Fonte: O autor. Este resultado obtido no SGBD pode também ser veri�cado no Xampp clicando-se na opção Admin do painel de controle, para que uma interface semelhante à da Figura 8 mostre que o banco de dados gerado também aparece no servidor através de sua conexão de�nida, anteriormente. Próximos Passos Para que se possa, então, seguir uma lógica de estudos e aplicação prática, será excluído o banco criado livro venda, clicando-se em seu nome na janela esquerda e escolhendo-se Drop Schema. Em seguida, será então utilizada a linguagem SQL puramente para que todo o processo seja executado, ignorando opções especí�cas deste SGBD MySQL, obtendo- se algo mais geral que pode valer para outros SGBDs também. Como mostrado na imagem 36, reinicia-se o desenvolvimento de forma manual com o uso do comando create database vendas, observando que todo comando em SQL para ser completo, necessita que seja incluso um sinal de ponto e vírgula ao �nal, pois a ausência deste indica ao SGBD que ainda podem ser adicionados parâmetros ao comando atual. Depois, basta seguir a sequência padrão de uso do botão para executar comando destacado na imagem 39, na parte direita da janela, observando a mensagem na janela Output, que exibe o resultado dos comandos. Ali diz que o comando foi executado com sucesso por meio do ícone verde e a mensagem de 1 linha afetada, que representa que foi criado o banco de dados. 92 Figura 9 Fonte: O autor. Para con�rmar o processo, é preciso sempre que for executado um comando, que se crie ou altere a estrutura do banco, o botão de atualização dos Schemas destacado na parte esquerda da janela, como mostrado também na Figura 9. Para que o banco seja criado de forma mais adequada, é possível adicionar parâmetros ao comando create database de forma a garantir que os caracteres inseridos sejam mais �elmente aceitos e armazenados quando inseridos. 93 Existem países com conjuntos de caracteres diferentes do usado no português e nos padrões de teclado utilizados no país e, assim, existe o risco de que dados tenham sua integridade prejudicada. A �m de reduzir esta possibilidade, é possível usar os parâmetros adicionais, a seguir, sempre que criar um novo banco de dados, de forma que o padrão utf8 seja usado, mais adequado ao nosso idioma. create database nome default character set utf8 default collate utf8_general_ci; Isso evita que algum conjunto de caracteres de um idioma diferente daquele utilizado no país seja usado e ocorram erros na inserção de dados como perda de acentuação ou aparecimento de caracteres trocados ou indesejados nos dados. Depois de criado o banco de dados, inicia-se a criação das tabelas para conter os conjuntos de entidades, e estas também podem ser criadas com comandos SQL, mas antes, é muito importante lembrar que as tabelas são de�nidas por um nome, mas também, por atributos que devem ter seus respectivos nomes e domínios de dados aceitos, mais comumente chamados de tipos. Estes tipos podem ser variados, e no caso da linguagem SQL, existem muitas variantes possíveis de serem usadas, permitindo que o banco tenha entidades bem ajustadas, reduzindo desperdício de espaço de armazenamento. Sempre é preciso ter em mente que um banco de dados terá a função de armazenar conjuntos de entidades, e a quantidade de entidades armazenadas pode ser tão grande que qualquer ajuste pode in�uenciar este armazenamento. 94 Os tipos principais de domínios para dados são, numérico, data e hora, texto e espacial, sendo cada tipo ideal para determinado domínio de dados e para que haja uma melhor otimização dos atributos, todos possuem subdivisões como se pode conferir na Tabela 1 Tabela 1 Tipo Básico Variante Descrição Numérico tinyint Tipos numéricos inteiros que armazenam desde pequenos valores a valores muito grandes, podendo ter parâmetros que de�nem a quantidade de dígitos aceita. smallint int mediumint bigint decimal Tipos decimais de valores com maior ou menor precisão e aceitando valores menores ou muito grandes para �ns cientí�cos. �oat double real numeric Tipo genérico SQL para números inteiros ou reais. bit Tipos mais voltados a avaliações de valor verdadeiro ou falso. boolean 95 timestamp time year Texto char Tipo padrão para atributos de texto como nomes, endereços, etc. varchar tinytext Tipos atribuídos a dados de texto maiores como atributos de respostas de questões de provas com várias linhas. text mediumtext longtext tinyblob Blob ou binary large object representa uma coleção de dados binários como arquivos inteiros diversos como PDF, imagens, etc. blob mediumblob longblob enum Tipos especí�cos para listas de dados textuais especí�cas como dias da semana, etc. Set Data e Hora date Tipos especí�cos para armazenamento de dados temporais,muito importantes na construção de banco de dados.datetime 96 Fonte: O autor. geography Cada SGBD como MySQL ou SQL Server, por exemplo, possuem particularidades na interface de uso, opções e ferramentas disponíveis, mas existem também diferenças na parte estrutural de sua linguagem SQL, e para os tipos de dados, podem ser observados pontos de atenção em consultas às documentações de um SGBD. Observe como são os tipos de dados no padrão SQL Server. Como são muitos tipos, e muitos deles apenas variações entre si, alguns serão utilizados nos exemplos deste material para exempli�car a forma de uso, enquanto outros �cam em aberto para que o aluno possa complementar seus estudos, posteriormente, com fontes alternativas como os livros utilizados na bibliogra�a. Partindo dos tipos disponíveis indicados na imagem 40, é possível de�nir como seriam os atributos básicos para uma tabela cliente para cadastro do conjunto de entidades relativa a esse conjunto de dados. create table cliente ( cod_cliente int, Espacial geometry Tipo de dados especí�cos para aplicações grá�cas baseadas em polígonos e coordenadas. 97 https://go.eadstock.com.br/z1 nome_cliente varchar(30), cpf_cliente numeric(11,0) ); Observando o exemplo, são de�nidos os atributos cod_cliente como dado do tipo inteiro, escolhido entre as cinco opções de valores sem casas decimais, nome_cliente como texto para até 30 caracteres, onde foi escolhido o tipo varchar ao invés de char pela otimização que se obtém no armazenamento de dados, e cpf_cliente com até 11 dígitos numéricos sem casas decimais indicado com o tipo numeric para este �m especí�co. As escolhas de tipos para atributos não são feitas apenas pelas categorias de valores que se espera armazenar, mas envolve uma análise mais profunda no que se espera destes atributos e seus requisitos identi�cados. Os tipos inteiros, por exemplo, são simples e sua escolha se baseia mais nos maiores ou menores valores que seriam aceitos pelos atributos, pois o tipo inteiro trabalha na faixa de -2.147.483.648 a 2.147.483.647, ao passo que smallint usa a faixa de -32.768 a 32.767 nitidamente mais restrita, e o menor tipo tinyint de 0 a 255, equivalente a 1 byte apenas. Já os tipos relacionados com números decimais permitem que parâmetros decidam detalhes como casas decimais e a quantidade de bits utilizados para armazenar os valores e cada SGBD pode delimitar de diferentes formas esta categoria de dados com maior especi�cidade que os tipos inteiros, por exemplo. Em MySQL, por exemplo, o tipo chamado decimal, muito utilizado, é de�nido por dois parâmetros decimais (m,n), sendo m o tamanho total do número em si a ser armazenado em dígitos, sendo que pela documentação o�cial da versão utilizada, o máximo aceito para a quantidade de dígitos neste tipo numérico é de 65, e para a 98 parte decimal n, o máximo é de 30 dígitos para de�nir a quantidade de casas decimais de precisão. Se estes valores não forem informados o MySQL assume m=10 e n=0. O tipo �oat aceita valores muito grandes, e a composição hardware e sistema operacional podem variar estes valores que, de qualquer forma, são enormes e indicados para aplicações matemáticas e cientí�cas cuja precisão é de enorme importância, com valores que podem ter dezenas de casas decimais, por exemplo. É comum pensar em números tão grandes que, normalmente, se utiliza a chamada notação cientí�ca para delimitá-los gerando, assim, valores limites como -3.40E+38 a 3.40E+38 que seriam equivalentes a números com 39 dígitos fora o ponto, por exemplo. Os dados do tipo texto são mais simples de serem delimitados e compreendidos, mas existem alguns pontos relevantes e os dois principais tipos são chamados de char(m) e varchar(m), sendo que o primeiro possui uma de�nição de que uma quantidade m de caracteres será armazenada, independentemente do texto signi�cativo a ser inserido, ao passo que varchar também estabelece um limite m de caracteres, mas apenas os caracteres signi�cativos são armazenados, reduzindo desperdício de espaço em disco. Assim, caso sejam de�nidos dois atributos char(3) e varchar(3), ambos podem ocupar 3 bytes de armazenamento, lembrando que, em geral, a quantidade de bytes equivale a de caracteres, mas com a de�nição utf-8, este valor pode ser diferente, pois esta codi�cação aceita caracteres que ocupam mais de 1 byte de espaço de armazenamento. De qualquer forma, digamos que sendo armazenado o caractere ‘a’ em ambos os atributos, no primeiro, algo como ‘a’ seria armazenado, ocupando os 3 bytes, mas no caso de varchar, seria realmente armazenado ‘a’ ocupando apenas 1 byte. Outro tipo relevante que pode ser utilizado se chama text(m) e aceita textos longos de até 216 caracteres praticamente ou 65535 caracteres podendo, então, con�gurar vários parágrafos de texto, podendo ser de�nido um limite através de um valor para m, e outro tipo chamado blob aceita cerca de 224 bytes, praticamente, ou 16.777.215 de caracteres como outra opção para textos longos. Um tipo importante de texto se chama enum e de�ne listas de dados �xas que são ótimas opções para conjuntos delimitados de opções de escolhas para atributos como sexo que, geralmente, é identi�cado com apenas 1 caractere, dias da semana com os nomes dos sete dias abreviados ou não, meses do ano, nomes de pessoas especí�cas, cargos, etc. 99 Complementando os tipos básicos de texto que podem ser utilizados ao longo do material, o tipo set traz a possibilidade de se criar conjuntos de dados textuais no qual a quantidade de 0 a 64 dados, sendo que os dados aceitos são predeterminados na de�nição do atributo. create table listagem (cores set('azul', 'verde', 'amarelo’, 'branco')); insert into listagem (cores) values ('amarelo,verde,verde,cinza,roxo'); select cores from listagem Neste exemplo, a tabela listagem é de�nida de forma que possa receber entidades com dados apenas pertencentes ao conjunto delimitado no parâmetro col set, e cada tupla a ser inserida conterá dados não repetidos dentre as opções oferecidas, avisando apenas em caso de dados repetidos estarem colocados no comando insert. Como resultado da inserção, a consulta traria amarelo e verde como dados inseridos na tabela, apenas, pois a repetição de verde é ignorada, e os dados cinza e roxo descartados por não pertencerem ao conjunto de dados aceitos no domínio. Por �m, um tipo de dado bastante utilizado se refere ao trabalho com datas e horas importantes para que não seja necessário utilizar tipos numéricos que deixariam os componentes de data ou hora separados, ou texto que di�cultaria cálculos de tempo. O tipo date, por exemplo, suporta datas formatadas em um intervalo de 1000-01-01 a 9999-12-31 seguindo o padrão ano-mês-dia do SGBD, mas pode ser ajustado o formato da data para nosso padrão dia-mês-ano através do uso de date_format para converter o formato tanto na inserção, quanto na consulta ao banco, por exemplo. insert into cliente set data_nasc = str_to_date ( ‘27/02/1990’, ‘%m/%d/%y’ ); select date_format (data_nasc, ‘%d/%m/%y’ ) from cliente; 100 Figura 10 Fonte: O autor. A hora também segue o mesmo modelo de uso, e como padrão utiliza hora:minuto:segundo que não se altera nas diferentes regiões do mundo, e pode ser trabalhado com o comando date, estando limitado ao intervalo -838:59:59.000000 a 838:59:59.000000, sendo pouco provável que seja utilizada uma faixa tão grande de tempo, exceto em dados históricos. Outros tipos podem ser utilizados de acordo com as necessidades de cada projeto, e uma consulta ao material o�cial de cada SGBD utilizado juntamente com consultas a livros e à web pode ser um bom caminho para se aperfeiçoar os conhecimentos sobre tipos de dados que podem ser utilizados em banco de dados. Com a aquisição dos conceitos dos tipos de dados, é possível analisar o contexto da Figura 10, que traz um script para criação de uma tabela com maior detalhamento e otimização dos atributos. Neste script da Figura 10, é importante estar atento aos tipos utilizados nos atributos, mas também,a outros parâmetros que foram já incluídos para que se compreenda quão detalhada pode ser a de�nição de um banco de dados. 101 No primeiro atributo, é importante destacar que, além de se utilizar o tipo tinyint que reduz bem a quantidade de entidades aceitas, dando a impressão de uma ótima otimização, é importante se lembrar da limitação do tipo a valores entre 0 e 255, permitindo então a inserção de no máximo 256 tuplas de dados, insu�ciente para a maioria dos bancos de dados, sendo que para bancos grandes nem o tipo int seria adequado. Também consta o parâmetro not null que impede o atributo de ser mantido vazio, obrigando a inserção de um valor, mas este valor é de�nido automaticamente pelo sistema em função do parâmetro auto_increment que adiciona uma unidade a cada nova entidade neste atributo, garantindo a não repetição de dados. Isso foi de�nido para este atributo em função do que vem na última linha de parâmetro de atributos do comando create table, que indica o atributo cod_cliente como chave primária através do parâmetro primary key. O segundo atributo nome_cliente está ajustado para aceitar até 30 caracteres ajustando o armazenamento apenas aos caracteres signi�cativos do texto e sendo obrigatória sua inserção (not null). O terceiro atributo utiliza o tipo numeric(11,0) para que possa ser um campo numérico e não textual para o CPF, permitindo validação do mesmo pela regra matemática de CPFs, sendo que o formato padrão atual deste documento utiliza 11 caracteres, sem afetar os documentos mais antigos que possuem menos dígitos que este padrão atual. São onze números sem o uso de casas decimais, fazendo com que 11 e 0 sejam valores que delimitam bem a entrada de dados, impedindo números com mais de 11 dígitos, mas aceitando menos que isso, e não aceitando a inserção de pontos ou vírgulas na digitação. Por �m, apenas é colocado um parâmetro adicional ao �nal do comando para de�nir o padrão utf8 para que seja aceito um conjunto maior de caracteres, apenas para ilustração, pois os dados utilizados nos atributos de�nidos são bastante comuns, e não seria necessária a especi�cação deste padrão em casos assim. Atributos bastante especí�cos como sexo e dia da semana podem ser representados como tipo enum, onde podemos indicar uma lista de dados aceitos e que são validados na entrada de dados pelo usuário, como podemos ver no exemplo em que o uso da palavra default garante que o atributo não seja cadastrado em branco na ausência de um dado informado a ele, pois em casos assim, assumiria o dado informado como padrão. 102 Compreender os conceitos relacionados aos atributos é importante para poder elaborar tabelas para o armazenamento de conjuntos de entidades de forma adequada e funcional. Observar quais os tipos de dados corretos para os atributos é uma tarefa importante, assim como veri�car se devem ser marcados como obrigatórios, se devem ter seus dados preenchidos, automaticamente, se possuem valores padrão de preenchimento para facilitar a inserção de dados, etc. Mas talvez o mais importante seja de�nir, corretamente, e se possível, a composição de atributos para formar a chave primária de cada tabela, observando se nas tabelas, seria necessária a inserção de chaves estrangeiras e outros pontos importantes. 103 Linguagem SQL – Variações em Consultas 09 104 A linguagem SQL possui todos os requisitos essenciais de gerenciamento para banco de dados e, após conhecer a base de trabalho relacionada à criação de bancos e suas tabelas com atributos, inserção e consulta de dados, inicia-se uma etapa de apresentação de recursos complementares da linguagem. Um recurso bastante utilizado e simples é o chamado alias, ou renomear tabelas ou atributos em consultas, de forma a simpli�car a exibição dos títulos das colunas representativas de atributos nos resultados destas consultas. Esse é um recurso interessante, pois com ele, atributos com nomes complexos, como nomes mais simples e intuitivos para a listagem a ser exibida, permitem o agrupamento de atributos para serem exibidos juntos sob um mesmo título. select cod_cliente as codigo, nome_cliente as nome from cliente; select nome_cliente as nome, endereco_cliente + ', ' + cidade_cliente + '' + estado_cliente as endereco from cliente; No primeiro exemplo acima, os atributos cod_cliente e nome_cliente são identi�cações não muito adequadas para relatórios a serem exibidas em reuniões, por exemplo, diferente do que seria em uma avaliação do banco de dados por uma equipe técnica de gerenciamento do mesmo, e o primeiro caso gera a necessidade de uso da renomeação temporária dos atributos para código e nome, respectivamente, mais intuitivos e apropriados. O segundo exemplo é uma forma diferente de uso, onde o alias é utilizado como recurso para que dados das entidades sejam uni�cados sob um único título endereço, para que este exiba os dados separados de atributos, que juntos atendem a uma demanda especí�ca de formato de endereço, desejado para uma listagem resultante de uma consulta. Outra forma bastante utilizada de uso do renome é para simpli�car nomes de tabelas em consultas envolvendo mais de uma tabela em intersecção para que o cruzamento de dados possa ser feito e, assim, determinado critério possa de�nir qual combinação de dados retornar. 105 select c.nome_cliente, p.descricao_produto from cliente as c, produto asp, venda as v where v. cliente_status = ‘Ativo’ and v.total >= 1000; No exemplo acima, três tabelas são cruzadas com o intuito de que todas participem do processo de execução de uma consulta, em que a tabela venda renomeada v é a base da consulta e, a partir dos dados dos atributos nome_cliente e total são selecionados os clientes ativos que realizaram compras de 1000 ou mais, retornando apenas seus nomes e produtos adquiridos para determinado �m. Complementando os recursos para a elaboração de consultas, existem símbolos especiais que podem ser usados como coringas na de�nição de condições para busca de dados. Um exemplo bastante comum ocorre quando se buscam pessoas das quais não se sabe todo o nome, e com o uso destes símbolos pode-se generalizar parte da condição para que sejam retornados mais resultados que o esperado, propositalmente, na esperança de que o que se busca esteja no resultado obtido. Um destes símbolos é % que indica que quaisquer conjuntos de caracteres são aceitos, e outro é _ que indica que um único caractere qualquer pode ser aceito, fazendo com que seja possível de�nir bem o que se espera obter como resultado. Como exemplo, supondo que se coloque Jo_o em uma busca, tanto Joao quanto João seriam resultados aceitos, mas também Joeo ou quaisquer resultados que tivessem Jo e o com apenas algum caractere entre eles, assim como Elian_ traria resultados como Eliana, Eliane, Eliani ou Eliany, por exemplo. Para inserir esta forma de condição em comandos SQL, é utilizado o comando like como operador para condição da cláusula where, servindo, então, como �ltro em consultas de forma isolada ou em conjunto com outros parâmetros. select telefone_cliente from cliente where nome_cliente like ‘Jo_o’; 106 O comando de consulta acima poderá trazer vários resultados em uma base com várias tuplas de dados armazenadas, e pode acontecer de a lista vir desorganizada di�cultando sua leitura e busca por resultados especí�cos. Para melhorar a entrega de resultados de consultas, uma cláusula adicional pode ser acrescentada utilizando-se o comando order by que permite a adição de um ou mais atributos de tabelas em uso na consulta, de forma que a ordem de inserção destes atributos no comando seja determinante na ordenação prioritária da lista de resultados. select nome_cliente, telefone_cliente from cliente where nome_clientelike ‘Jo_o’ order by nome_cliente, telefone_cliente asc; O comando acima determina que nomes e telefones de clientes da tabela cliente sejam exibidos em listagem, desde que o nome encontrado contenha os caracteres indicados na cláusula where, e estes resultadosdevem ser classi�cados em ordem crescente pelo parâmetro asc, após os atributos da ordenação, primeiramente, pelo nome e, em caso de nomes repetidos, ordenar pelo telefone. Numa busca como esta, além da busca por dados desejados, pode ocorrer de serem encontrados dados não desejados além dos imaginados na construção do comando, pois podem retornar nomes e telefones iguais em mais de uma tupla que poderia ou não ser representativo de tuplas duplicadas em função de entradas de dados repetidas, mas é possível haver duas pessoas com mesmo nome e telefone numa empresa, mas pode não ser aceito o cadastro de duas pessoas de mesmo nome e telefone celular. 107 É sempre importante estar atento, durante os estudos, em fontes alternativas ou especi�cidades de variações entre um SGBD e outro que possam afetar o resultado daquilo que se aprende. O MySQL é a base para os estudos, mas, paralelamente, é importante que se busquem referências auxiliares para conhecer, por exemplo, como as consultas podem ser elaboradas em um SGBD alternativo como o SQL Server da Microsoft. Leia mais em: Operações Sobre Consultas As consultas agem sobre tabelas buscando dados contidos em conjuntos de entidades inseridos em tabelas, como é feito matematicamente em operações realizadas em conjuntos de elementos. Uma operação bastante utilizada em consultas é union que representa a união de tuplas de duas tabelas através de um atributo que possuam em comum, principalmente, em casos em que este atributo seja a chave primária em uma das tabelas e chave estrangeira na outra. Como podem ser usadas chaves ou atributos comuns, é bastante comum resultados repetidos ocorrerem na consulta, mas existe uma alternativa caso seja desejado que as repetições de dados sejam exibidas ou não, bastando para isto 108 https://go.eadstock.com.br/Bx utilizar o comando union para excluir resultados repetidos ou union all para mostrar os mesmos resultados repetidos. (select nome_cliente from cliente) union (select nome_cliente from venda); (select nome_cliente from cliente) union all (select nome_cliente from venda); A diferença do uso do termo all nos comandos select acima mostra que detalhes in�uenciam os resultados de cada comando, e como o gerenciamento de banco de dados, através do uso da linguagem SQL, envolve a manipulação de bancos que podem possuir milhares ou milhões de entidades de dados, é preciso estar atento ao que deve ser feito e à escrita dos comandos em cada script escrito. Outra operação relevante é a de intersecção de dados de tabelas que age de forma diferente da união, sendo que a união uni�ca dados de tabelas distintas e traz todos os dados de duas tabelas somados, a intersecção veri�ca ocorrências iguais nas duas tabelas e traz como resultados, apenas as que ocorrerem, simultaneamente, nas duas. Um exemplo para ilustrar a diferença seria que com o uso de uma union entre uma tabela de cadastro de clientes e outra de vendas para clientes, nomes de pessoas seriam exibidos estando ou não os clientes cadastrados no sistema, vindos do cadastro de clientes que podem ou não ter feito compras e de clientes que realizaram compras estando ou não cadastrados na tabela de cadastro de clientes. Usando a intersecção com o comando intersect que também possui a variante intersect all, apenas seriam retornados clientes que realizaram compras na empresa e que sejam cadastrados na tabela de cadastro de clientes, observando que o uso do parâmetro all permitiria que nomes repetidos fossem trazidos como resultados, o que seria algo comum, pois um cliente cadastrado pode realizar várias comprar na empresa, gerando várias novas tuplas de dados. (select nome_cliente from cliente) intersect (select nome_cliente fromvenda); 109 (select nome_cliente from cliente) intersect all (select nome_clientefrom venda); Outra alternativa de operador para consultas é bastante interessante, pois age num subconjunto diferente de dados dos dois anteriores, union e intersect, pois veri�ca e traz como resultados, apenas dados de uma tabela que não esteja na outra, ou seja, no caso do uso do comando except, os dados da segunda tabela indicada servem de �ltro e excluem os dados da primeira tabela equivalentes como possíveis resultados da consulta. (select nome_cliente from cliente) except (select nome_cliente fromvenda); (select nome_cliente from cliente) except all (select nome_cliente fromvenda); Este tipo de consulta pode ser bastante relevante, pois esta exclusão de dados faz com que uma consulta como a exempli�cada acima retorne o nome de todos os clientes cadastrados que nunca compraram nada, pois não possuem seu nome associado a nenhuma venda. O uso de except all traz nomes repetidos que poderiam ser algo bastante comum numa base de dados, e a inclusão de atributos-chave na consulta poderia garantir que seriam pessoas diferentes, usando, por exemplo, o atributo de algum documento pessoal como dado complementar nos resultados da consulta. (select nome_cliente, cpf_cliente from cliente) union all (selectnome_cliente from venda); 110 Algumas operações adicionais importantes para os estudos, nesta aula, são relacionadas a cálculos que podem ser efetuados sob resultados de consultas, sendo muito utilizados para gerar dados que não precisam ser armazenados num banco de dados, pois podem ser obtidos a partir dos demais dados inseridos nas entidades das tabelas. Operações podem ser realizadas em dados numéricos, por exemplo, para que dados úteis como médias, somas e contagem de elementos possam ser realizadas adicionando operadores em comandos de consulta. A contagem de entidades que atenderam a um critério de busca pode ser obtida através da função count que, simplesmente, conta quantas ocorrências de um determinado atributo ocorreriam como resultado de uma consulta, e exibe este valor. select count(*) from cliente; select nota_fiscal, count(*) from venda group by nota_fiscal; Um comando como o do exemplo acima simplesmente exibirá a quantidade de entidades encontradas na tabela cliente e devolverá, lembrando que pode ser especi�cado um atributo, e podem ser adicionadas condições, normalmente, ao comando como um select comum, tendo apenas a função como parâmetro adicional. O segundo exemplo traz uma forma simples de se veri�car inconsistência com um atributo importante, fazendo uma consulta simples a todas as vendas e listando os números de notas �scais. Caso haja, por algum problema, algum número de nota �scal repetido, este será agrupado pela função group e caso haja mais de uma venda com um mesmo número de nota �scal, aparecerá no relatório. Outra operação relevante para consultas se baseia no comando avg para calcular médias e, assim como count, possui sintaxe simples, bastando associar um atributo ou todos à função, e caso não seja atribuído um atributo não numérico que pode retornar resultados inesperados, a média será calculada. 111 Caso seja adicionada alguma condição ao comando select, a função avg retornará à média sobre os dados que seriam resultados da consulta apenas, e não sobre todos os dados da tabela. select avg(idade) from cliente; select cod_cliente, sum (total_venda) from venda group by cod_clientehaving sum (total_venda) >= 1000; Este comando simples do exemplo mencionado traz um resultado relevante para uma empresa, a média de idade de seus clientes, permitindo tomadas de decisão em relação à inserção de novos produtos para venda, estratégias de marketing, etc. e, de certa forma, servindo como ferramenta de Business Intelligence na gestão empresarial. No segundo exemplo, uma consulta mais complexa para análise de dados são somadas às compras totais feitas por clientes com o uso do operador sum, mas um limitador é utilizado no próprio agrupador de dados repetidos. As vendas são agrupadas por código do cliente, mas limitando a listagem a clientes que tiveram compras somadas de 1000 ou mais, excluindo da lista somas menores que este valor. Os operadores mine max também seguem a mesma sintaxe simples e necessitam apenas serem colocados no lugar dos demais operadores utilizados para que se tenham comandos alternativos para veri�cação dos menores ou maiores valores obtidos em uma consulta, como maiores vendas, menores quantidades de produtos, etc. 112 Às vezes é preciso identi�car inconsistências no banco de dados e, assim como mostrado no conteúdo da aula, é possível uma consulta e retornar se existem entidades nas quais um atributo repete dados e não deveria. Outra situação é na veri�cação de dados inexistentes em atributos essenciais como valores de vendas, quantidade de produtos vendida, etc. select nota_fiscal from venda where total_venda is null; Neste exemplo, é veri�cado justamente se na tabela venda existe alguma entidade na qual o total da venda não tenha sido indicada, sendo um campo vazio identi�cado com a constante null. 113 Tópicos Complementares em SQL 10 114 Dando sequência a uma etapa �nal de estudos especí�cos em linguagem SQL, existem muitos conceitos e recursos que podem ser explorados ainda na linguagem SQL, e que podem ser estudados à medida que se desenvolve maior conhecimento dos conceitos e recursos fundamentais da linguagem. Consultas Especializadas Um dos recursos que podem ser explorados em consultas SQL é a possibilidade de encadeamento de consultas para que se possa utilizar uma própria consulta SQL como critério condicional para a cláusula where. select distinct nome_cli, telefone_cli from cliente where cod_cli in (select cod_cli from venda); No exemplo, observa-se o uso do termo distinct logo após select para que não sejam exibidos resultados repetidos de nomes, mas é importante lembrar que pessoas diferentes podem possuir o mesmo nome e, com isto, o resultado desta consulta poderia não ser correto, havendo o risco de exclusão de entidades de forma equivocada, além de que o comando distinct se aplica apenas ao campo nome_cli neste exemplo. O ponto mais importante do exemplo acima é a inclusão de uma consulta como condição para a consulta principal que procura por códigos de clientes associados a vendas e a partir destes códigos, retorna os nomes de clientes da tabela de cadastros. O uso da variante not in antes da inclusão de uma subconsulta faz com que sejam buscados apenas resultados que não satisfaçam o select inserido como condição, fazendo com que dentro de todo o conjunto de entidades pesquisado, sejam exibidos justamente os que não foram encontrados na subconsulta, servindo em casos como a busca por clientes cadastrados que nunca realizaram compras ou que estejam há algum tempo sem realizar compras, ambas informações muito úteis numa empresa. 115 Existem inúmeras combinações de comandos de consulta possíveis em banco de dados e o uso das variações possíveis de parâmetros e combinação de cláusulas são diretamente responsáveis por isso, e para que se desenvolva a habilidade de elaboração de consultas, é preciso praticar ao máximo este recurso. Outra variante para o uso de subconsultas é o uso de > some que representa uma indicação na consulta de que ao menos uma ou mais ocorrências encontradas representam a condição da consulta para exibição de resultados, havendo a possibilidade de se utilizar as alternativas < some, >= some, <= some, = some, e <> some para que diferentes resultados da subconsulta sejam utilizados. select distinct nome_cli, telefone_cli from cliente where cod_cli >some (select cod_cli from venda); select distinct nome_cli, telefone_cli from cliente where cod_cli any(select cod_cli from venda); select distinct nome_cli, telefone_cli from cliente where cod_cli <=all (select cod_cli from venda); E, no caso demonstrado, se ao menos uma ocorrência de cod_cli na tabela vendas ocorra, nomes de clientes poderão ser exibidos como resultados da consulta. Existe como alternativa a cláusula any com efeito semelhante e usado desde versões bem mais antigas de SQL, assim como > all, < all, >= all, <= all, = all, e <> all que servem como comparador entre o dado contido no campo e todos os resultados obtidos na subconsulta. 116 Também é possível simplesmente veri�car se alguma entidade atende a uma determinada consulta inserida como condição, retornando verdadeiro (true) ou falso (false) apenas pela adição da cláusula exists antes da subconsulta na cláusula where da consulta principal. select distinct nome_cli, telefone_cli from cliente where exists (select* from venda where total_venda > 500); O retorno de verdadeiro ou falso com o uso da cláusula exists afeta diretamente a exibição ou não do nome de cliente e seu telefone no exemplo acima, de acordo com a condição de alguma venda maior de 500 ter sido feita a ele. Há variações para esta cláusula como not exists para que seja feita a veri�cação contrária de não existência de ocorrências que atendam à subconsulta, e pode-se agregar a cláusula except para criar exceções para as subconsultas que contenham exists ou not exists. Outra opção interessante para complementar a construção de condições em consultas é a cláusula unique que veri�ca se existem resultados duplicados como resultado da subconsulta, trazendo verdadeiro ou falso dependendo de haver ou não duplicidade de tuplas de dados na consulta, como pode ocorrer no exemplo a seguir, onde um mesmo cod_cli pode aparecer em várias vendas, uma ou nenhuma, gerando os valores falso, verdadeiro e falso, respectivamente. select distinct nome_cli, telefone_cli from cliente where unique (select cod_cli from venda); Views Na medida em que são demandadas consultas de maior complexidade, gera-se um problema de interpretação destas consultas, pois a quantidade de atributos, tabelas envolvidas e condições para a obtenção de determinados resultados tendem a gerar 117 comandos muito longos e de difícil validação com relação à sua real e�ciência e assertividade. Isso pode causar problemas de retorno de informações incompletas, equivocadas, ou elaboradas com erros lógicos nas condições de �ltragem que, muitas vezes, são difíceis de serem corrigidos sem a reescrita de todo o comando. Uma forma de facilitar a elaboração de consultas é criar as chamadas views para a criação de tabelas temporárias estruturadas a partir de consultas para facilitar o acesso a determinados resultados mais utilizados, evitando equívocos comuns de se escrever comandos novos, ao invés de se utilizar comandos já criados e testados com e�ciência comprovada. O uso desse recurso permite maior reúso das visões contendo bases otimizadas para que mais de um usuário possa acessá-la diretamente, aumentam a segurança, pois usuários podem ser direcionados a realizar consultas sobre views personalizadas que ocultem dados necessários ou protegidos, e simpli�ca a elaboração e consultas que, muitas vezes, precisam conter menos �ltros para a obtenção dos resultados esperados. create view visao_cli as (select c.nome_cli, v.total_venda from c as cliente, v as venda where v.total_venda >= 500); select nome_cli from visao_cli where nome_cli like ‘A%’; Pela exempli�cação é fácil perceber a facilidade de se utilizar uma view como base para outras consultas, e para isto basta incluí-la na cláusula from, lembrando que a mesma deve ter sido construída, anteriormente, e é preciso que se conheça o que foi gerado a partir dela. No exemplo, a view �ltra nome e valores de compras realizados com valor igual ou superior a 500, e a consulta posterior lista, dentre estes, aqueles cujos nomes iniciam pela letra A. 118 Gerenciamento do Banco de Dados Com sintaxe similar à do comando select, o comando delete exclui tuplas de dados em tabelas a partir de condições especi�cadas e parâmetros variados que permitem que este comando extremamente perigoso seja bem construído e sua ação delineada de forma segura e efetiva. Importante observar que é um dos conceitos estudados mais a fundo, por último, devido ao seu caráter perigoso, necessitando de atenção e que se tenha já uma base de como setrabalha com um banco de dados e o que está ligado ao seu uso e manipulação. delete from venda; delete from venda where total_venda between 0 and 499; delete from cliente where cod_cli in (select cod_cli from venda where avg (total_venda) < 300); 119 No exemplo citado, três diferentes formas de exclusão são de�nidas, em que, progressivamente, vai sendo aumentado o grau de complexidade dos comandos, sendo o primeiro, a forma mais simples de uso da sintaxe, onde se indica apenas a tabela que terá todo o seu conjunto de entidades excluído. No segundo, apenas tuplas da tabela vendas onde o valor total armazenado de cada venda seja um valor entre 0 e 499, e no terceiro exemplo, serão excluídos dados de entidades que a partir da consulta sobre vendas terem médias de valor da venda inferiores a 300. Alguns parâmetros adicionais relevantes são limit que permite estabelecer uma quantidade máxima de tuplas afetadas na exclusão, low_priority que indica ao gerenciador para aguardar que nenhum usuário esteja utilizando a mesma tabela para oferecer maior garantia de manutenção de integridade do banco e atomicidade das operações realizadas. A cláusula ignore pode ser utilizada para que erros gerenciáveis durante o processo sejam ignorados e o processo não seja interrompido. delete low_priority ignore from venda where total_venda < 1000 limit 100; Neste exemplo, são inseridas as cláusulas normais para de�nição de tabela e condição para exclusão, mas estão presentes as cláusulas adicionais low_priority para um processo mais seguro e ignore para que não seja interrompida a ação. Também foi adicionada a cláusula limit para que no máximo 100 tuplas sejam excluídas. Outra ação bastante comum no gerenciamento de banco de dados é a inserção no qual o uso do comando insert permite também o uso de cláusulas e parâmetros complementares para a escrita de scripts para que dados sejam adicionados a tuplas, gerando entidades para as tabelas em um banco de dados. insert into cliente (cod_cli, nome_cli, cpf_cli) values (18, ‘Pedro’, 02536266678); insert low_priority ignore into venda (cod_venda, total_venda) values (1, 200) on duplicate key update total_venda = total_venda + 200; 120 Observando os exemplos colocados, o primeiro deles é um comando de inserção tradicional que indica a tabela destino, e os atributos afetados entre parênteses, e os dados a serem inseridos, respeitando os tipos e a ordem dos atributos indicados na tabela. No segundo exemplo, são adicionadas cláusulas complementares como low_priority que gera uma menor prioridade da ação, por segurança, aguardando um momento seguro para a execução, complementando que existe a opção high_priority que realiza a ação contrária, mas menos segura. O parâmetro ignore fará com que ocorrências sejam relevadas e a ação ocorra de forma forçada, e a principal cláusula do segundo exemplo é on duplicate key update que realiza o que é indicado após o comando update que, ao invés de gerar erros pela duplicidade de chaves primárias, e ao invés da geração do erro, converte a ação em atualização da tupla com base no critério indicado de somar o valor existente no atributo com o novo valor indicado no comando. Este método gera uma inserção de novas tuplas em uma tabela, mas serve também para atualizar dados em entidades já existentes, mas não é a melhor forma de se atualizar dados, pois existe um comando próprio update para esta �nalidade que possui uma sintaxe que segue um padrão semelhante aos demais comandos de gerenciamento, com suas particularidades. update poupanca set saldo = saldo * 1,005; update cliente set status = ‘Bloqueado’ where debito_cliente > 0; update cliente set status = case when debito_cliente > 0 then status = ‘Bloqueado’ else status = ‘Desbloqueado’ end; 121 Com base nos exemplos citados, é possível ver como é mais completo o comando update em relação ao comando insert para esta �nalidade, pois permite cláusulas bem especí�cas que auxiliam no processo de atualização de dados. O primeiro exemplo de comando traz uma atualização simples e direta de saldos em uma tabela de poupanças onde é adicionado automaticamente 0,5% de aumento (equivalente a 1,005) em todos os saldos como uma atualização mensal, por exemplo. O segundo inclui uma condição que em caso de algum cliente possuir débito maior que 0, o sistema, automaticamente, muda o status do mesmo para bloqueado, servindo como um atualizador da situação cadastral de clientes inadimplentes. O último traz um comando maior, com uma lógica mais complexa por trazer a necessidade de interpretação de condicionais complementares num mesmo comando, em que uma melhoria no comando do segundo exemplo é feita de forma que se o débito for maior que zero, o status é bloqueado, mas, caso contrário, é atualizado o atributo status como desbloqueado. O uso de estruturas lógicas mais complexas, aproximando a linguagem SQL das demais linguagens de programação é algo que oferece um pequeno desa�o extra no aprendizado do gerenciamento de banco de dados. O SGBD SQL Server possui sintaxe bastante semelhante ao MySQL, facilitando o aprendizado e mostrando que os SGBDs possuem certa padronização sobre o uso da linguagem SQL, alterando recursos, pontualmente, mas não necessariamente a base da linguagem. Saiba mais em: 122 https://go.eadstock.com.br/By Um aspecto importante que complementa as ações estudadas até o momento de manipulação de dados é o de que as alterações realizadas nos dados devem ser con�rmadas ou desfeitas em uma etapa posterior à execução dos scripts de comandos, oferecendo uma garantia extra de que a ação desejada realmente foi a executada. O comando commit work tem a função de con�rmar as modi�cações realizadas por comandos insert ou update, por exemplo, tornando os efeitos dos comandos permanentes e o�cializados perante o banco. O comando rollback work realiza a ação de desfazer as ações de forma a retornar os conjuntos de entidades a um estado anterior ao da execução dos comandos feitos após o último commit work, lembrando que em ambos os comandos commit e rollback, a palavra work é opcional. É importante citar que rollback não desfaz o que foi feito antes de um commit, e uma boa aplicação para rollback é a de associar seu uso a erros que podem ocorrer em comandos ou desastres que necessitem de restauração de dados como em quedas de energia, por exemplo. Por �m, existe um comando que possui a �nalidade de mesclar dados de entidades de tabelas distintas, mas que possuam algum atributo em comum que permita servir de base para o processo de mesclagem. select cod_cli, nome_cli, cpf_cli from cliente inner join venda on cliente.cod_cliente = venda.cod_cliente; Existem variações para o comando join, como left join, right join e full join, além de apenas join, observando que dependendo da versão do SGBD pode haver diferenças no uso do comando, como o uso dos comandos inner join, left outer join, righ outer join, e full outer join. Essas variações do comando join servem para modi�car os resultados de consultas, como no caso do left join, que após veri�car a igualdade de dados entre atributos de duas tabelas, traz apenas dados da primeira tabela, enquanto que right join traz dados da segunda que tenham correspondência na primeira tabela. 123 Pensando na teoria de conjuntos da matemática, o comando inner join seria equivalente à intersecção de dados iguais nas duas tabelas, ignorando dados que não estejam simultaneamente nas duas tabelas. A opção left join resultaria em uma listagem que conteria todas as tuplas da primeira tabela mesclada com dados da segunda, quando houver correspondência (incluindo null nos atributos sem correspondência), e right join retornaria uma listagem contendo todas as tuplas da segunda tabela mesclada com a primeira, mas constando null nos atributos da primeira sem correspondência. Imagem 44 select * from cliente left join venda on cliente.cod_cli = venda.cod_cli; Fonte: O autor. cod_cli nome_cli cpf_cli cod_vendacod_cli total_venda 1 Pedro 02536521495 7 1 520 2 Márcio 12536523611 52 2 1200 3 João 03569863244 null null Null Observando a imagem 44, temos um exemplo de resultado obtido por uma consulta contendo a cláusula left join onde todas as tuplas da tabela cliente indicada pela cor amarela e na parte azul, os dados das tuplas da tabela venda, quando os valores de cod_cli das duas tabelas sejam iguais, caso contrário, retornando null. Mudando para right join, a diferença seria de que todas as tuplas da tabela venda seriam exibidas como resultado da consulta, mescladas com as tuplas da tabela cliente, caso contrário, quando houvesse correspondência ou null. 124 Por �m, full join une todas as tuplas das duas tabelas indicadas e exibe os atributos indicados a partir de uma regra de correspondência de atributos, reforçando a importância da correta estruturação das tabelas com atributos, chave primária e chave estrangeira. select c.nome_cli, v.cod_venda from cliente as c full outer join venda as v on c.cod_cli = v.cod_cli order by c.nome_cli; Após conhecer diversos conceitos e exemplos de uso da linguagem SQL, é importante reforçar que existem mais conteúdos que podem ser estudados na linguagem SQL e que, certamente, agrega mais conhecimento e recursos para um bom gerenciamento de dados em um SGBD. 125 Outras cláusulas podem ser estudadas e agregar conhecimento útil para o trabalho com banco de dados, como já citado, anteriormente, e uma cláusula interessante é a baseada no termo having que adiciona uma condição para que um agrupamento de dados seja feito, mas com a exibição de dados apenas quando a condição for satisfeita. select count (cod_cli), estado_cli from cliente group by estado_cli having count (cod_cli) >= 10; Neste exemplo, os clientes de um cadastro são contados e agrupados por estado, sendo que a exibição destes dados ocorre apenas se a base de clientes do estado tiver dez ou mais clientes cadastrados. 126 Banco de Dados Orientados a Objetos e Banco de Dados XML 11 127 Durante décadas, a forma como os dados foram armazenados ou expostos era padronizada pelo isso dos bancos de dados, mas com o surgimento e a popularização da Internet, o gerenciamento de dados começou a ser de�nido. Inicialmente, a Internet trabalhava com o chamado hipertexto, que continha textos formatados em páginas, postados em equipamentos espalhados pelo planeta e disponibilizados através de um protocolo bem de�nido de comunicação – o TCP-IP. Aos poucos, o contexto dessas páginas foi adaptado às inovações tecnológicas que foram sendo agregadas à Internet, e o tipo de conteúdo foi incrementado com outros tipos de dados, mas mantendo a ideia das páginas. Isso seguia na contramão das estruturas todas padronizadas dos bancos de dados relacionais, e quando as páginas web evoluíram ao ponto de poderem conter todo um conjunto de conteúdo não diretamente visível aos usuários, como banco de dados conectados a sistemas de informação, uma nova forma de organização de dados começou a ser pensada, e linguagens próprias para a web como o HTML e o XML ganharam muita força dentre os pro�ssionais de TI. Com o tempo, essas linguagens de marcação para criação de páginas de hipertexto foram se associando a outras linguagens como CSS, PHP, Javascript e Java de diferentes formas para permitir a constante geração de inovações que se vê na Internet. 128 Imagem 46 Fonte: autor. Uma diferença importante em XML que resulta numa opção a ser estudada neste material é que a linguagem XML possui recursos para trabalhar com banco de dados e outros tipos de estruturas de dados. A maneira como é estruturada um script HTML e um XML difere de forma a favorecer a adequação da XML para banco de dados, pois é possível a criação das chamadas tags especí�cas de identi�cação não só de palavras reservadas indicadas por sinais de < e >, mas também de outros tipos de elementos. Assim, aplicações criadas para acessar banco de dados através da Internet podem utilizar a XML, como interface de acesso aos usuários com um processo de desenvolvimento menos complexo do que utilizando linguagens de programação tradicionais. <Título>Cadastro de Clientes</Título> <cadastro> <cliente> <cod_cliente> 1 </cod_cliente> <nome_cliente> Pedro </nome_cliente> <cpf_cliente> 02456398563 </cpf_cliente> </cliente> <cliente> <cod_cliente> 2 </cod_cliente> <nome_cliente> Marcelo </nome_cliente> <cpf_cliente> 12365496345 </cpf_cliente> </cliente> </cadastro> 129 Observando o script da imagem 46, um exemplo em XML traz uma forma de representação da estrutura de uma tabela onde são inseridas duas tuplas de dados para comporem duas entidades. A tag, logo na primeira linha do exemplo, indica uma informação de identi�cação do script em relação à sua �nalidade, observando que o padrão em XML é que seja colocada uma tag inicial e uma �nal usando uma barra para diferenciação destas funções, e tendo um texto identi�cador da funcionalidade do script. Também é incluída uma tag de identi�cação da estrutura ou processo a ser executado que, no caso deste exemplo, é cadastro que é aberto logo após o Título e encerrado ao �nal das demais tags. As demais tags são para a operação de inserção de dados numa tabela cliente de um banco de dados, adicionando os dados para composição de duas tuplas em um formato não baseado no modelo relacional, exatamente, mas seguindo uma ideia de divisão dos dados em atributos como ocorre no modelo. insert into cliente (cod_cliente, nome_cliente, cpf_cliente) values (1,’Pedro’, 02456398563); insert into cliente (cod_cliente, nome_cliente, cpf_cliente) values (2,’Marcelo’, 12365496345); Um script semelhante ao que seria feito no modelo relacional usando SQL poderia ser criado com os comandos indicados acima através do uso do comando insert para adicionar os mesmos dados numa tabela chamada cliente. Um script criado em XML pode ser utilizado para gerenciar o processo de inserção em um banco de dados utilizando o processo similar ao do modelo relacional, mas pode também permitir estruturas menos padronizadas, assim como as tags podem ser organizadas em níveis e subníveis para a de�nição da inserção de dados em formatos mais �exíveis. 130 Imagem 47 Fonte: autor. <Título>Venda</Título> <venda> <dados> <cod_venda> 1 </cod_venda> <nota_fiscal_venda> 1 </notafiscalvenda> <data_venda> 10/2/2021 </data_venda> <cod_cliente> 1 </cod_cliente> </dados> <produtos> <cod_produto> 2 </cod_produto> <total_produto> 100,00 </total_produto> <cod_produto> 5 </cod_produto> <total_produto> 5000,00 </total_produto> <cod_produto> 18 </cod_produto> <total_produto> 250,00 </total_produto> </produtos> <fechamento> <total_venda> 5350,00 </total_venda> <forma_pagto_venda> Dinheiro </forma_pagto_venda> </fechamento> </venda> 131 Nesse exemplo da imagem 47, a base da estruturação do script segue o mesmo estilo, mas os dados e a estruturação desses é que varia, dividindo a estrutura da venda em outras três subestruturas de dados, produtos e fechamento com suas respectivas tags, e tags aninhadas equivalentes a atributos com os dados. Na estrutura de�nida, uma venda conteria dados básicos como número da venda, nota �scal, cliente e data, três produtos lançados na venda, e uma parte �nal contendo o valor total e a forma de pagamento. Fazendo uma comparação entre o uso da linguagem XML para o gerenciamento de dados de forma mais livre e o modelo relacional, existem pontos positivos e negativos numa comparação direta entre as duas opções. O uso das tags pode não ser o método mais garantido, pois elas se repetem ao longo do script, mas, por outro lado, servem como indicadores para facilitar a documentação pela forma como são escritas. Por sermais livre o formato, novas tags referentes a atributos e seus dados podem ser adicionadas ou excluídas mais livremente, sendo que numa transmissão de dados entre origem e destino pela web, o destinatário possui mecanismos para adaptar sua absorção aos dados enviados, ignorando dados não esperados e deixando nulos os não informados pelas tags. 132 Um terceiro ponto relevante é que a estrutura exibida na imagem 47, num modelo relacional seria mais complexo, envolvendo entidades e relacionamentos separados com scripts de maior complexidade, enquanto em XML, bastou-se encadear tags em níveis para que se pudesse identi�car níveis de aninhamento dos dados. Para simpli�car a nomenclatura de tags e seus conteúdos, será utilizada a nomenclatura utilizada por Silberschatz (2020), em que esse bloco delimitado por tag inicial e �nal é chamado elemento, lembrando que os elementos podem conter outros elementos dentro de seu conteúdo de forma aninhada. Inicialmente, todo script gerado em um documento começa com uma tag principal que é fechada ao �nal do documento, encerrando o script, e as demais tags �cam praticamente todas dentro desta principal, exceto pela tag de Título mostrada nos exemplos. Além da sintaxe padrão de se utilizar uma tag inicial e �nal para delimitar blocos de outras tags, há casos em que uma tag única pode já servir para de�nir alguma ação simples, por exemplo, com uma sintaxe simples como a utilizada para se pular linhas <br/>. Também existe a possibilidade de se adicionar parâmetros em tags para que outras de�nições sejam possíveis ou ajustes nas ações realizadas pelas tags como a possibilidade de se atribuir um alias para um endereço relacionado à web que se torna incômodo na escrita de scripts, tornando-o mais curto e intuitivo. 133 <vendas xmlns: site = “https://www.site_exemplo.com”> <site:cliente> ... </site:cliente > </vendas> Com o uso de um nome alternativo escolhido para representar um endereço web completo, como no exemplo acima, o uso do alias site torna todo o conjunto de tags contidas no bloco relacionado à tag <vendas> mais fácil de ser escrito, além da escolha de nomes intuitivos para alias também se mostrar uma boa prática. Outro conceito adaptável para XML do modelo relacional é o de schema o qual se pode delimitar domínios e permissões de acesso a um banco de dados, mesmo sabendo-se que a linguagem XML por padrão não estrutura dados como o modelo relacional faz, dando a impressão de que todos os dados são de um mesmo formato sem restrições. Uma forma de se de�nir schemas é através da inclusão da tag DOCTYPE, relacionada à chamada DTD (Doctype Type De�nition), opcional dentro de um script XML, mas que pode fornecer importantes de�nições para o restante do script no qual o próprio banco de dados e elementos contidos no banco podem ser descritos. 134 Imagem 48 Fonte: autor. <!DOCTYPE vendas [ <!ELEMENT vendas ( (cliente | produto | venda) +)> <!ELEMENT cliente ( (cod_cli nome_clie cpf_cli) )> <!ELEMENT produto ( (cod_prod descrição_prod valor_prod) )> <!ELEMENT venda ( (cod_venda nota_fiscal total_venda cod_cli cod_prod) +)> <!ELEMENT cod_cli ( #PCDATA ) > <!ELEMENT nome_cli ( #PCDATA ) > ... Demais atributos ... ] > <vendas> <cliente cod_cli = “1” nome_cli = “Pedro” cpf_cli = “12345678921”> <cliente cod_cli = “2” nome_cli = “Márcio” cpf_cli = “02536598532”> </vendas> Estudando o exemplo da imagem 48, o uso da tag DOCTYPE permitiu a de�nição de toda uma estrutura de dados, partindo do banco de dados e seus elementos, depois de cada elemento e seus subelementos e, na sequência, a de�nição destes subelementos e tipo de dados aceito #PCDATA que se refere a dados textuais que deveriam ser de�nidos para todos os atributos, mas alguns foram omitidos por serem repetitivos. 135 Imagem 49 Depois de de�nida a estrutura pela DTD no script XML, a tag <vendas> atribuiu dados ao banco para a geração de dois elementos, mas que poderiam ser muitos mais, tanto para a mesma estrutura cliente quanto para as demais produto e venda. XMLSchema Tendo uma sintaxe simples e recursos limitados, a DTD não consegue, por exemplo, de�nir um domínio exato de dados como números positivos ou um determinado intervalo de valores, por exemplo, mas é algo que pode ser melhorado com o uso do chamado XMLSchema que permite de�nições mais precisas como de tipos string ou decimal ou parâmetros que delimitam intervalos de valores. <exemplo: schema xmlns: exemplo = “https://www.siteexemplo.com”> <exemplo: element name = “vendas” type = “Detalhes” /> <exemplo: element name = “cliente”> <exemplo: complexType> <exemplo: sequence> <exemplo: element name= ”cod_cli” type= “exemplo: decimal”/> <exemplo: element name= ”nome_cli” type= “exemplo: string”/> <exemplo: element name= ”cpf_cli” type= “exemplo: decimal”/> </exemplo: sequence> </exemplo: complexType> </exemplo: element> <exemplo: complexType name= “Detalhes”> <exemplo: sequence> 136 Fonte: autor. <exemplo: element ref= ”cliente” minOccurs=”1” maxOccurs= “unbounded”/> </exemplo: sequence> </exemplo: complexType> </exemplo: schema> Analisando o exemplo da imagem 49, um schema é criado a partir da de�nição de um alias para um endereço web como citado anteriormente, e todos os demais elementos são de�nidos dentro deste schema. Pela sintaxe da linguagem XML, identi�ca-se o banco e, neste exemplo, indica-se que ele deve ser ajustado de acordo com o tipo Detalhes que é especi�cado mais ao �nal do script para determinar que faixa de valores representam os dados numéricos a serem inseridos. O elemento cliente, pertencente ao banco vendas, é de�nido dentro de uma nova tag complexType que de�ne elementos mais detalhados, e sequence, outro elemento utilizado na sintaxe da de�nição dos atributos do registro de dados. Em cada atributo, a cláusula type indica o tipo de dado para o elemento, e este tipo pode ser melhor descrito como feito no elemento complexType que de�ne, realmente, as especi�cidades do tipo Detalhes criado para uso no exemplo onde é indicado que os dados numéricos não podem ser menores que 1. Para especi�car adequadamente a estrutura de dados, é possível indicar que os elementos contidos na de�nição de um elemento representam atributos utilizando- se a cláusula attribute e chaves primárias e estrangeiras com base na cláusula key. 137 Fonte: autor. <exemplo: key name= “chave_cli”> <exemplo: selector xpath= “vendas/cliente”/> <exemplo: field xpath= “cod_cli”/> </exemplo: key> <exemplo: keyref name=”venda” refer= “chave _cli”> <exemplo: selector xpath= “vendas/venda”/> <exemplo: field xpath= “cod_cli”/> <exemplo: keyref/> Pelo exemplo da imagem 50 é possível separar o mesmo em três partes, sendo as duas primeiras linhas de�nições de elementos como atributos, apenas para mostrar um exemplo de como seria a de�nição dos elementos. Na segunda parte, a indicação do atributo cod_cli como chave para o elemento cliente, com o uso da tag key de�nindo a chave pelo nome chave_cli, e dentro desta, dois elementos que indicam o caminho do atributo no banco e o elemento original que serve de base para a chave. E, na terceira parte, a tag keyref traz o conceito de chave estrangeira, de�nindo para o elemento venda, a chave_cli de�nida, anteriormente, com chave estrangeira, sendo indicados também o caminho para os dados e a qual atributo se refere a chave. Imagem 50 <exemplo: attribute name= “cod_cli”/> exemplo: attribute name= “nome_cli”/>< ... 138 Dados contidos em formato XML podem ser convertidos para uso em SGBDs como MySQL, observando-se que, para que seja possível, a estrutura do banco em XML deve ser compatível com a utilizada no modelo relacional para o MySQL. Consulta XPath As consultas em banco de dados XMl podem também ser realizadas, mas o processo é diferente das consultas em bases relacionais, pois o formato dos elementos é diferente das tabelas e atributos da modelagem relacional. Com sintaxe bastante simpli�cada, sua utilização se baseia na indicação de expressõesque indicam caminhos para o banco de dados e que com base no que é indicado no comando, retorna valores. /vendas/cliente/nome_cli/text () Pedro Márcio 139 https://go.eadstock.com.br/Bz A expressão acima traria como retornos os elementos indicados logo em seguida no exemplo, e o uso do termo text () ao �nal do caminho possui a função de não mostrar tags com o nome do elemento no resultado, e apenas os dados em si. Pode-se re�nar as consultas acrescentado-se cláusulas adicionais como feito em SQL para que seja possível �ltrar resultados e se obtenham os resultados esperados. /vendas/produto[valor_prod>100] /vendas/produto[valor_prod>100]/ @cod_cli Nos exemplos acima, o primeiro traz como retorno uma lista contendo elementos com valor acima de 100, e o exemplo seguinte traz apenas o elemento cod_cli das mesmas tuplas de dados encontradas usando a mesma condição de �ltragem. 140 Outra alternativa para busca em um banco de dados XML é usar XQuery que traz a base da linguagem XML adaptada para os conceitos da SQL oferecendo uma alternativa ao uso de XPath. A base de uma consulta XQuery são os comandos for, let, where, order by e return (FLWOR) que compõem a sintaxe para um comando de consulta de dados como se pode ver no exemplo a seguir, no qual for de�ne uma variável que recebe um a um os dados do elemento indicado no banco, where uma condição para uso ou não dos dados, order by indica o elemento que serve de base para ordenação dos dados, e return quais dados serão exibidos (let pode realizar atribuições de dados lidos a variáveis). for $x in /vendas/venda where $x > 100 order by $x return $x 141 Gerenciamento de Transações 12 142 Segundo Silberschatz (2020), uma transação se refere a uma ação completa de manipulação de dados, iniciada por um script ou software que possuam em seu código, comandos similares à begin transaction e end transaction para iniciar e �nalizar o processo da transação. As transações estão diretamente ligadas à integridade do banco de dados e envolve o conjunto de propriedades chamadas ACID relacionadas aos conceitos de atomicidade, consistência, isolamento e durabilidade. A atomicidade representa a ideia de que uma transação deve ocorrer de forma única sem que seja fracionada ou interrompida de forma a garantir que dados não se percam ou sejam corrompidos. Também se refere à ideia de que os atributos de uma entidade devem conter dados únicos e não deve ser permitida a ocorrência de dados múltiplos em um atributo, o que tornaria a identi�cação do dado correto relacionado a uma entidade. O segundo conceito de consistência se refere a um aspecto complementar da atomicidade que, após o término de uma transação, o estado anterior do banco de dados em que as regras de consistência do mesmo que estavam corretas, devem se manter, envolvendo a garantia de que as chaves primárias não possuem valores repetidos, tipos de dados respeitados, restrições dos atributos ou constraints que representam objetos para de�nição de regras de integridades do banco, operações em cascata ou cascade entre chaves primárias e estrangeiras como exemplo, e gatilhos ou triggers SQL que acionam eventos especiais de�nidos na estruturação e gerenciamento do banco de dados. Qualquer ação realizada por scripts SQL ou em outra linguagem não deve corromper ou afetar negativamente a integridade e consistência do banco e suas regras e, para isso, as ações podem incluir regras de validação da entrada de dados como validações de campos chave ou com formatos especiais como no caso de dados de CPF, telefones, etc. O terceiro conceito de isolamento é extremamente importante em banco de dados que podem ser compartilhados entre dois ou mais usuários, simultaneamente, pois uma mesma entidade não pode ter seus dados atualizados por mais de um processo para evitar a perda da integridade dos dados que teriam seus dados perdidos total ou parcialmente, fato que não deve ocorrer. Técnicas que envolvam meios de que atualizações de dados em uma mesma base ocorram de forma paralela para os usuários, mas de forma serial no banco de dados, no qual cada usuário teria deu processamento realizado, individualmente, e seguindo 143 algum algoritmo de ordenação de processos e isolamento do acesso ao banco para atualizações. Processos concorrentes são muito comuns em banco de dados, pois com a evolução tecnológica ocorrida, primeiro com a introdução das redes locais, até a atual globalização dos bancos de dados pela Internet em que é possível que milhares de usuários ou processos estejam acessando paralelamente um banco de dados. Por �m, a durabilidade representa a garantia de que as transações �nalizadas sejam garantidas de forma permanente em disco e não apenas em armazenamento temporário para evitar perdas por desastres que podem ocorrer durante o funcionamento de uma infraestrutura, desde uma simples queda de luz, a falhas de equipamentos, eventos naturais, etc., sendo este processo chamado de commit em linguagem SQL. Este processo envolve a veri�cação da atualização efetiva dos dados após uma transação, se necessária, controle de versões do estado do banco de dados e outras validações necessárias para garantir que nada se perca ao �nal de cada transação ocorrida. Geralmente, as transações ocorrem sobre um banco de dados na forma de leitura de dados ou de escrita de dados, além de atualizações e exclusões, e estas ações podem ser resumidas pela sigla CRUD, representativa dos termos Create (criar), Read (ler), Update (atualizar) e Delete (excluir). As operações de leitura são nitidamente as mais seguras, pois não alteram dados no banco de dados, mas geram um pequeno risco pela necessidade de abertura do banco de dados e reserva do mesmo para a transação e, por isso, também precisa ser uma operação monitorada pelo SGBD. A operação de escrita transfere dados em memória temporária para o armazenamento permanente do banco, logo na transação, mesmo que de forma temporária, para uma segunda etapa de gravação física dos dados em disco, caso o processo seja feito em duas etapas, como em sistemas que trabalham com uma etapa intermediária de gravação antes da efetiva atualização do banco de dados por segurança. 144 Por adicionar novos dados, esse processo envolve também a organização de todo o banco para acomodação da nova entidade e isso envolve indexação das chaves e organização estrutural dos dados �sicamente em disco. A operação de atualização envolve menos processos que a criação, pois, normalmente, não manipula a indexação, mas envolve, em alguns casos, ajustes no armazenamento em disco, mas, geralmente, uma transação deste tipo se baseia apenas na alteração de dados de uma ou mais entidades. Por �m, o processo de exclusão também afeta a organização do banco de dados de duas formas distintas, sendo uma a de apenas remover a ligação de uma entidade com outras do banco que sejam diretamente ligadas a ela para manutenção da integridade estrutural dos dados, ou a liberação do espaço físico em disco para que outros dados possam ser armazenados naquele espaço, além da reorganização estrutural citada. Como dito, todos esses processos podem não ocorrer efetiva e instantaneamente no momento da transação, gerando uma lista de transações realizadas e afetando um banco de dados temporário que, em determinado momento, irá efetivar as transações no banco original de forma permanente, mas independentemente de como seja o processo, em uma ou mais etapas, todo o processo envolve a gravação dos estados em disco para garantir um dos 4 conceitos ACID de durabilidade. Existem casos nos quais as transações vão atualizando dados de entidades que podem depois serem utilizados em outras transações, e isto é outro motivo para que as transações sejam realizadas em sequência e com a integridade e os demais 145 aspectos respeitados, de forma a evitar um efeito cascata de problemas ocasionados pela falha na atualização de alguma transação dentro de uma sequência. Para conhecer mais sobre os aspectos estudados aolongo das aulas, é preciso buscar fontes alternativas e conhecer conceitos importantes citados por diferentes fontes, se necessário. Estados de Transações As transações ocorrem a todo momento, sendo �nalizadas e concretizadas como esperado (commit), mas há casos em que as transações podem não ser executadas como esperado e são abortadas, gerando um processo muito importante relacionado a esta interrupção. O chamado processo de rollback é aquele que deve ocorrer após a interrupção ou falha de uma transação no qual o estado anterior do banco de dados deve ser devolvido no caso de alterações terem ocorrido ou, simplesmente, ter seu estado original inalterado caso não tenham sido feitas atualizações de dados. Não representa, necessariamente, um processo de reversão, mas sim, de recuperação dos dados em um estado anterior, sendo que para isto, geralmente, são mantidas versões do banco para garantir este processo durante as transações. Após a ocorrência de uma transação de modo completo, o estado do banco de dados é atualizado e o estado anterior deixa de existir para permitir a criação de um novo estado após nova transação ocorrer. 146 https://go.eadstock.com.br/BA Se for desejada uma espécie de reversão de alguma mudança ocorrida, é preciso gerar uma atualização dos mesmos dados de forma a reverter, manualmente, os dados alterados necessários, como no caso de uma transferência indevida de valores para uma conta que precise ser desfeita. No caso de uma transação monetária, por exemplo, se ela for realizada com sucesso, gerará um novo estado do banco de dados, mas pode ocorrer de ser solicitado um estorno da mesma, mas isto não é considerado um rollback. É preciso gerar uma nova transação, debitando o valor se tiver sido depositado, ou depositado o mesmo valor no caso de uma retirada que foi desfeita. Silberschatz (2020) de�ne 5 estados para uma transação que se inicia ativa e assim permanece enquanto os processos vão sendo realizados e, em dado momento, a transação pode passar para um outro estado de parcialmente con�rmada ao �nal do processamento da transação, ou ter seu status alterado para falha em caso do não processamento correto. Caso uma transação entre no estado de parcialmente con�rmada, ainda pode ocorrer algum erro como na gravação dos dados pelo SBGD ou na etapa do sistema operacional e o status mudar para falha, mas caso tudo ocorra como devido, caminhará para um estado de con�rmada em que se obtém todo o ACID relacionado à transação. Por outro lado, se ocorre a falha, se a mesma acontece logo durante o processamento da transação, os processos acabam não sendo concluídos e um status de abortada ocorre, mantendo o banco em seu estado original de antes da transação, mas pode acontecer de dados terem sido parcialmente modi�cados e o banco ter mudado de status, necessitando, assim, de um rollback para retornar o banco a um status original anterior à transação. No caso de falha na transação, a mesma pode ser reexecutada se for um erro que possa ser contornado por algum motivo de momento, como queda de luz, por exemplo, mas pode ser encerrada (kill) em caso de erros na geração da própria transação, por exemplo. O processo de geração de uma cópia do banco de dados para que se tenha dois estados do mesmo a cada transação pode parecer complexo e exagerado, mas, na verdade, é a melhor forma de se garantir a possibilidade de um rollback quando necessário, mas é importante observar que a cópia de segurança é não gerar uma cópia extra a cada transação, pois seria insustentável do ponto de vista físico de armazenamento. 147 A chamada cópia de sombra é criada logo no início do processamento de uma transação, antes que a mesma possa gerar alguma alteração no banco, e se mantém durante todo o processamento até que um commit ou um rollback ocorra com a transação. No caso de ocorrer um commit e a transação efetivamente for concretizada, a cópia de sombra não mais será utilizada, tornando-se descartável para que numa próxima transação, o espaço ocupado �sicamente possa ser reescrito por uma nova cópia de sobra, de acordo com o gerenciamento de disco do sistema operacional. Caso ocorra um rollback, a cópia de sombra se torna a versão original do banco, novamente, fazendo com que o banco utilizado no processamento da transação se torne descartável pelo mesmo mecanismo de sobrescrita citado no caso de commit. Transações Simultâneas A chamada execução simultânea ou paralela de transações não acontece, efetivamente, pois o banco de dados é único e deve ser mantido íntegro, aspecto que não poderia ser garantido com mais de uma transação podendo modi�car seus dados num mesmo instante. As modi�cações poderiam ocorrer sobre dados sem ligação aparente no banco, mas como existe uma rede de conexões entre tabelas e atributos de um banco, é difícil garantir que uma transação não tenha in�uência em mais de um ponto do banco de dados. Um atributo pode ser modi�cado de forma a alterar apenas um dado de um atributo comum especí�co de uma tabela, como um ajuste em uma data de nascimento de um cadastro de clientes, mas é preciso compreender que em cada caso, este dado pode ter implicações maiores que apenas fazer parte de uma entidade, pois o dado pode ter relação com o processamento de outras transações que podem, inclusive, estar ocorrendo em paralelo. Um exemplo bem simples seria a atualização de um ano inserido incorretamente em uma pessoa num cadastro de pessoas e esta mudança gerar implicações como na liberação de uma solicitação de entrada num processo de obtenção de carteira de motorista para uma pessoa que poderia ter 17 anos, mas com o ajuste passe a ter 18, mas que poderia ter sua solicitação negada se o processamento do pedido ocorrer antes da atualização do ano de nascimento. 148 Outro caso poderia ser numa auditoria em um cadastro de pessoas que têm direito ao recebimento de uma aposentadoria por um erro de cadastro e que, num ajuste, poderia ser constatado o equívoco da idade e o benefício ser negado de forma justa, mas ocorrendo em paralelo, poderia ser mantido até nova validação que pode ocorrer apenas de tempos em tempos. Além de haver a preocupação com a atualização do banco de dados em transações simultâneas, existe o consumo de recursos de hardware associados aos processos das transações como processamento e memórias temporária e permanente. O chamado throughput se relaciona ao maior ou menor uso dos recursos de hardware de forma a aumentar ou diminuir a ociosidade destes de acordo com as necessidades de toda a infraestrutura. Geralmente, sistemas de banco de dados tendem a tentar otimizar o uso do hardware aumentando o throughput pelo maior processamento de transações por fração de tempo, mas cada sistema funciona de maneira distinta de acordo com o modo como funciona o uso do banco de dados. Alguns bancos estão ligados diretamente à Internet e geram transações 24 horas por dia em maior ou menor volume, ao passo que sistemas locais podem ter janelas de tempo para geração e processamento de transações, mas, de forma geral, sempre se busca a otimização do throughput para que se possa reduzir tempos de resposta em sistemas. Essa busca pela melhor produtividade operacional re�ete na implementação de melhorias no processamento concorrente de transações e demais operações, pois independentemente da forma como ocorra o throughput, a consistência não pode ser afetada, assim como os demais aspectos do ACID. Existem técnicas diferentes de gerenciamento de transações, baseadas nas técnicas de gerenciamento de processos em sistemas operacionais, gerando oferta de recursos de processamento para transações em função do tempo, mas garantindo a atomicidade destas para evitar perda de integridade. Transações maiores com vários processos podem ser fracionadas caso a divisão destas envolva a efetiva realização dos processos inteiros que estejam contidos na transação, mas que possam ser realizados separadamente de outros processos da mesma transação, como no caso de várias inserções de dadosnuma mesma transação que podem ser realizadas uma a uma em frações de tempo avulsas, permitindo que outros processos de outras transações sejam realizados, alternadamente, seguindo as mesmas regras de atomicidade. 149 Uma das características importantes do ACID, o isolamento, possui relação direta com a concorrência de transações, e uma transação deve ser executada por completo para ser considerada con�rmada, mas para se otimizar o gerenciamento e uso de um banco de dados, processos que ocorrem em paralelo auxiliam na dinamicidade do uso, pois se muitos usuários solicitam uma transação, mas todas são realizadas integralmente em sequência, aquele que solicitou por último, poderia esperar por um tempo desnecessário, assim como outros que solicitaram antes. Isto pode ocorrer em função da demora na inserção manual de dados, por exemplo, enquanto o processo de inserção não é realizado, todos os recursos estariam bloqueados. Trabalhar com processos em paralelo, mas mantendo as características ACID é algo fundamental e aumenta muito o desempenho de um sistema sobre um banco de dados, mas é preciso ter um controle muito e�ciente sobre a organização das transações para que ocorram sem gerar riscos ao banco de dados. O isolamento pode ser obtido pelo bloqueio dos recursos do banco de dados durante o processamento de uma única transação, mas pode também ser feito de forma concorrente isolando frações da transação e realizando-as com as mesmas garantias de uma transação completa, permitindo que frações de transações vão sendo executadas, sequencialmente, mas passando a impressão de transações ocorrendo em paralelo. 150 Controle de Concorrência e Recuperação 13 151 Visando controlar o processamento concorrente de transações, mecanismos foram criados para oferecer meios de que esse tipo de processo seja seguro e possa ao mesmo tempo ser capaz de aumentar o throughput de uso de infraestrutura, e garantir o isolamento necessário das transações e a integridade e durabilidade do banco de dados. Controle de Concorrência Um mecanismo básico para oferecer essa possibilidade de concorrência segura de transações é chamado de exclusão mútua, em que os recursos de banco de dados sendo acessados por uma transação �cam bloqueados para os demais, gerando um isolamento da transação e garantindo os meios para uma correta execução dos processos, independentemente de o resultado da transação ser falha (rollback) ou con�rmada (commit). Quando se pensa em gerar bloqueios de itens em um banco de dados para processamento de transações, existem duas possibilidades a serem levadas em consideração e que podem oferecer maior throughput, ou maior segurança, de acordo com o tipo de transação a ser executada. Um tipo de bloqueio é parcial, permitindo que uma transação possa apenas acessar dados do banco, em modo de leitura, sem poder realizar alterações, permitindo que os mesmos dados sejam compartilhados entre outras transações com o mesmo tipo de bloqueio, por exemplo, aumentando o uso de recurso de infraestrutura e de acesso ao banco de dados. Outro tipo é mais restritivo e exclusivo, permitindo que a transação realize todo tipo de ação com os dados em uso, desde leitura à exclusão dos mesmos, sendo que, neste mecanismo, todas as demais transações não possuem acesso nem de leitura dos mesmos dados para evitar problemas com os aspectos relacionados ao ACID. 152 Imagem 53 Fonte: O autor. TRANSAÇÃO 1 TRANSAÇÃO 2 TABELA CONSULTA BLOQUEIO COMPARTILHADO 1 CONSULTA INSERÇÃO BLOQUEIO COMPARTILHADO 1 INSERÇÃO DESBLOQUEADO INSERÇÃO BLOQUEIO EXCLUSIVO 2 ATUALIZAÇÃO INSERÇÃO BLOQUEIO EXCLUSIVO 2 ATUALIZAÇÃO INSERÇÃO BLOQUEIO EXCLUSIVO 2 ATUALIZAÇÃO DESBLOQUEADO ATUALIZAÇÃO BLOQUEIO EXCLUSIVO 1 ATUALIZAÇÃO BLOQUEIO EXCLUSIVO 1 DESBLOQUEADO A imagem 53 ilustra, de forma simpli�cada, a forma como os bloqueios poderiam ocorrer supondo que uma primeira transação solicitasse um bloqueio para consulta de dados de uma tabela e o gerenciador bloqueasse a tabela de forma compartilhada permitindo que outras transações de leitura possam ocorrer. No caso do exemplo, uma outra transação de inserção de dados deseja utilizar a mesma tabela, mas como se encontra bloqueada, mesmo que de forma compartilhada, a tabela não pode ser acessada durante o bloqueio. 153 Depois de encerrada a transação de consulta, a tabela pode então ser desbloqueada para ser requisitada pela transação 2 de inserção e, no passo seguinte, é efetivado um bloqueio exclusivo para que se possa realizar a transação. Durante esta transação de inserção, uma nova transação, desta vez, de atualização de dados na tabela solicita acesso à tabela, mas a mesma se encontra bloqueada e a transação �ca em espera até a liberação da mesma. Após a con�rmação ou falha da transação 2 de inserção, novamente a tabela pode ser desbloqueada, lembrando que em caso de falha, pode ser necessário aguardar um processo de rollback do banco para que, então, possa ser desbloqueada a tabela e possa ser acessada pela transação 1 de atualização, após novo bloqueio exclusivo ser feito. Da forma como é colocado no exemplo ilustrativo, da imagem 53, dá a impressão de o processo ser realmente simples, mas a realidade é que muitas variáveis estão envolvidas e o processo de bloqueio é complexo, pois é preciso resolver problemas como o de solicitações simultâneas de transações e decisão de qual favorecer em um bloqueio, falhas de infraestrutura que podem enganar os processos de bloqueios, etc. Uma situação que pode ocorrer e é até bastante provável seria de, durante um bloqueio compartilhado para uma transação, outra de manipulação de dados esteja aguardando a liberação do bloqueio para então poder ser realizada, mas neste meio tempo, outra transação de consulta poderia surgir e aproveitar o status de bloqueio compartilhado e também acessar os mesmos dados. Isso alongaria o tempo de bloqueio do recurso em muitos casos, atrasando a transação pendente e, num pior cenário, outras transações de consulta poderiam ocorrer e adiar inde�nidamente a transação de manipulação em espera. Para evitar situações problemáticas como a citada, mecanismos de controle de transações em espera podem auxiliar utilizando índices de ordenação de transações, permitindo até a de�nição de �las com prioridades de execução, como ocorre em processos envolvendo recursos de hardware controlados pelo sistema operacional. 154 Imagem 54 FILA DE TRANSAÇÕES TRANSAÇÃO A TRANSAÇÃO B TRANSAÇÃO D TRANSAÇÃO E TRANSAÇÃO C TRANSAÇÃO F Fonte: O autor. Silberschatz (2020) cita que pode ser utilizado um protocolo para bloqueio baseado em duas fases, em que uma primeira fase é chamada de crescimento na qual uma transação solicita bloqueio e o mesmo sendo concedido, realiza seu processamento. Depois, ao terminar a transação, libera-se o bloqueio, mas a mesma entra numa fase de encolhimento, e se precisar novamente de um bloqueio para outra etapa de sua transação, �ca impossibilitada de solicitar por determinado número de ciclos de tempo, permitindo que outras transações possam ter iguais chances de obter bloqueios e serem processadas. Claro que as transações podem ser simples e necessitarem de um único bloqueio para serem concluídas, não sendo afetadas diretamente pelo protocolo, mas transações maiores com mais processos a serem realizadas precisam de protocolos como este para organização da �la de processos. Também é possível organizar as transações em uma árvore baseada na teoria de grafos onde cada transação é recursivamente inserida em uma lista que ordena as transações de maneira a serem dependentes umas das outras para que se possa organizar a �la e os bloqueios e desbloqueios vão ocorrendo para atender a todos da estrutura de árvore seguindo um algoritmo de deslocamento pela árvore similar aos algoritmos de busca. 155 A ilustração da imagem 54 traz um exemplo de como poderia ser organizada a árvore de transações, supondo que o bloqueio iniciaria permitindo à transação A ser aprimeira processada, mas existe a necessidade de manutenção da estrutura e, por isso, a intersecção de todas as ligações entre as transações, ou raiz da árvore indica apenas um nome para a estrutura, sendo as transações indicadas abaixo da raiz. Assim, podem-se gerar algoritmos que possam percorrer as transações partindo de pontos como prioridades, ordem de solicitação, tipos de transação, etc. permitindo que diferentes algoritmos possam ser implementados para determinar a ordem de liberação dos dados bloqueados para cada transação, lembrando que esta árvore de transações pode se referir apenas a um conjunto de entidades de um banco e não ao banco todo, por exemplo. Existem outros métodos citados por Silberschatz (2020), como protocolos timestamp que realiza a ordenação de forma antecipada, a regra de write de Thomas que ajusta o algoritmo do protocolo timestamp reduzindo operações obsoletas, protocolos baseados em validação que monitoram as transações para veri�car se rollbacks em cascata possam ocorrer. Existem outros mecanismos também descritos por Silberschatz (2020) e que podem oferecer maior aprofundamento conceitual no tema de controle de concorrência de transações e permitirá maior conhecimento sobre como organizar o gerenciamento de banco de dados. Sistema de Recuperação A recuperação de um banco de dados em casos de falha é muito importante e garantir que dados não sejam corrompidos envolvem diretamente as propriedades de atomicidade e durabilidade, envolvendo mecanismos para garantir o retorno de um banco de dados ao seu estado anterior original em caso de falhas em transações. 156 As falhas, geralmente, podem estar associadas a problemas nas próprias transações, como dados incorretos com as especi�cações do banco ou consultas a dados inexistentes, assim como impedimentos do próprio banco de dados em função de paradas para manutenção, etc. As falhas também podem estar associadas a problemas de disco como defeitos ou capacidade esgotada, ou erros de sistema operacional que não permitem que possam afetar tanto hardware quanto o próprio banco de dados. No caso do armazenamento, especi�camente, é preciso estar atento às formas utilizadas que se resumem aos meios ditos voláteis como a memória RAM dos equipamentos da infraestrutura que mantém dados enquanto houver energia alimentando-os ou enquanto uma aplicação estiver no ar, sendo que os dados contidos neste tipo de memória são muito suscetíveis a serem perdidos. Outro tipo de memória dito não volátil se baseia em discos, como discos rígidos (HDs) que podem estar alocados, localmente, ou através da Internet em locais remotos, memórias do tipo �ash, como pendrives e cartões diversos, �tas magnéticas, etc. que podem guardar dados mesmo com a ausência de energia, mas que podem ser inseridos, alterados e excluídos, se desejado, sendo que ainda existe o risco de perda de dados por processos equivocados de manipulação destes dispositivos. Um terceiro tipo é chamado de estável ou permanente por permitir a inserção de dados, mas sua exclusão não é permitida pelo disco ser dito apenas de escrita uma única vez como ocorre em discos que são �sicamente marcados no processo de 157 gravação como CDs e DVDs comuns, mas é possível, por outros meios, se obter um meio próximo ao estável, mas ainda volátil. O meio mais utilizado é o de memória não volátil para armazenamento de banco de dados pela possibilidade de realização de todos os processos CRUD, essenciais para as atividades de um banco de dados. Uma forma de se obter um armazenamento seguro e menos volátil é por meio da manutenção de uma ou mais cópias do banco de dados em diferentes discos que podem estar num mesmo local, apenas para efeito de backup de segurança para eventuais falhas do banco de dados considerado principal, se houver esta classi�cação na infraestrutura, pois algumas infraestruturas de TI são totalmente replicadas para evitar desastres que comprometam mais do que apenas o meio de armazenamento do banco de dados. Um dos métodos de manutenção de cópias de segurança se baseia na tecnologia RAID de discos idênticos ligados, paralelamente, em máquinas de forma a replicar todo o seu conteúdo e serem capazes de manter as operações em caso de falha de um dos discos, por exemplo, resultando em um nível de segurança de dados bastante aceitável. Este processo pode ser expandido através da cópia dos dados em mais de uma máquina, podendo estas terem o mesmo mecanismo RAID de discos instalados, mas sendo estas cópias gerenciadas entre as máquinas através do sistema do banco de dados, pois a tecnologia em si é criada em nível de hardware da máquina. 158 Também é possível que máquinas dedicadas ao armazenamento estejam localizadas em pontos remotos para aumentar a resistência dos sistemas a desastres como quedas de luz, inundações em um dos locais e outros problemas diversos que possam inutilizar um ou mais dos locais de armazenamento temporário ou permanentemente. O fato de estarem localmente posicionados numa infraestrutura para gerenciamento de um banco de dados ou remotamente em locais próprios ou gerenciados por terceiros (outsourcing), muitas vezes, não altera o uso dos bancos de dados em nível de usuário, mas o processo de uso e gerenciamento é alterado em função dos bancos remotos necessitarem de conexões via Internet, por exemplo. Um acesso remoto pode ocorrer de forma restrita por meios de comunicação como redes VPN chamadas de túneis de comunicação ponto a ponto ou acessos comuns via web, além do uso de meios variados como rede de telefonia móvel, rádio, etc., permitem que banco de dados sejam acessados em locais distantes desde que se mantenha ativa a conexão. Em caso de queda de conexão, um banco remoto �ca isolado e inacessível, muitas vezes, gerando um chamado desastre que é facilmente contornado assim que a comunicação é restabelecida, mas isso pode gerar problemas na paralisação do acesso ao banco, que pode gerar perdas enormes em volume de transações perdidas ou paralisadas. Há casos de falha que podem resultar em um problema de atualização de banco de dados que deve ser gerenciado, como no caso de transações �nanceiras que falham durante o processo, e geram inconvenientes, como debitar de uma conta origem e não creditar na conta destino, dando a impressão de saque e não de transferência, ou não debitar da origem e creditar no destino, dando a impressão de um valor que surgiu do nada e que também é problema para o sistema. Quando falhas de transação assim ocorrem, ou é necessário que a transação seja novamente submetida para que seja efetivamente realizada ou seja descartada e não realizada, novamente, mas independentemente da opção, é preciso resolver a inconsistência do banco de dados. 159 Um método de veri�cação de inconsistência assim é o de recuperação através de rollback baseado em logs do sistema que representa um histórico de transações ocorridas e que pode indicar falhas a serem veri�cadas a partir de dados contidos nos logs como identi�cadores de transações e alterações de valores realizadas. O mais importante é o log ser capaz de armazenar o status de cada transação indicando falhas ocorridas, como base para validação do sistema, sobretudo, o que ocorreu com o banco de dados. Outro método utilizando o log é o de conter, historicamente, todas as transações no banco de dados, mas não realizar instantaneamente as operações mais arriscadas de inserção, atualização e exclusão de dados de forma que só sejam realizadas e consideradas con�rmadas quando for possível a realização segura destas com a possibilidade de con�rmação parcial das transações. As transações bancárias são um bom exemplo, pois, tradicionalmente, existem regras para que ocorram, umas de forma instantânea, praticamente como transferências entre contas do mesmo banco, que podem ser con�rmadas no momento da transação, e outras adiadas como outras que necessitem de con�rmação da possibilidade de realização como compensações e transações entre diferentes bancos. Interfere noprocesso das transações mecanismos de prioridades e outros para garantir a maior integridade das transações e menores riscos de falhas que resultem em problemas que podem necessitar de rollbacks em cascata que demandam tempo e prejudicam todas as demais transações. 160 Existe uma técnica de recuperação baseada na marcação de checkpoints durante as transações, de forma a gerar pontos de recuperação em caso de falhas, e na ocorrência de alguma, o checkpoint mais recente garante que um estado seguro da transação pode ser obtido no checkpoint e a partir dali a transação possa ser retomada. É importante de�nir corretamente os checkpoints, pois estes devem representar processos da transação que ocorreram com sucesso e que possam ser consideradas realizadas e con�rmadas com sucesso sem risco às propriedades ACID. O uso de checkpoints permite que o uso da recuperação baseada em log seja mais e�ciente pelo fato de não ser necessária uma busca completa no log, mas apenas pelos pontos de veri�cação da transação atual. Um exemplo simpli�cado é de que uma transação poderia realizar uma consulta, obter dados que seriam utilizados em uma atualização posterior e outra nova consulta de con�rmação, por exemplo, e um checkpoint seguro seria após a consulta ser con�rmada, pois como não altera dados no banco, assim como após a con�rmação da realização da atualização completa dos dados, antes da consulta de con�rmação. Caso haja falha na atualização, a mesma sendo realizada novamente pode não representar risco à integridade do banco, pois os mesmos dados já atualizados seriam novamente ajustados com os valores desejados, e os não realizados, seriam. Existem mais mecanismos e técnicas para recuperação em diferentes situações que são tratados por Silberschatz (2020) e que podem aprofundar os conhecimentos sobre como trabalhar a concorrência de transações e a recuperação em falhas, como a técnica de shadow paging que trabalha com espaços de memória paralelos que são integrados ao banco em caso de con�rmação das transações. 161 Arquiteturas de Banco de Dados Paralelos e Distribuídos 14 162 Todo banco de dados necessita estar associado a algum hardware e, inicialmente, uma máquina única continha um banco de dados e o sistema gerenciador do mesmo de forma local para que fosse acessado por um usuário de forma exclusiva. Mesmo neste caso simples, havia a necessidade de se oferecer recursos mínimos aceitáveis para que o banco de dados pudesse ser executado com um desempenho que fosse capaz de oferecer uma experiência positiva e con�ável ao usuário, além de, mesmo em uma situação mais simples de uso, garantir as propriedades ACID. Depois, com a evolução das redes locais, surgiu a ideia do servidor da rede que permitia o compartilhamento de arquivos, software e recursos de hardware com os demais equipamentos alocados na rede. Nessa época, surgiram também sistemas gerenciadores de banco de dados que eram instalados no servidor e através de protocolos de comunicação e sistemas distribuídos entre servidor e equipamentos clientes, permitiu que uma base de dados �casse alocada �sicamente no servidor e pudesse ser compartilhada entre os clientes, surgindo aí a necessidade de cuidados com �las de transações, concorrência e outros mecanismos próprios para este sistema de banco de dados. Os chamados sistemas cliente-servidor permitiram o trabalho colaborativo, a evolução do sistema de uso dos bancos de dados com o desenvolvimento de grandes sistemas empresariais baseados em transações em banco de dados e que criaram interfaces muito mais atrativas aos usuários. Esse movimento gerou duas rami�cações no desenvolvimento de sistemas baseados na web, podendo interagir com banco de dados. Uma destas rami�cações trata diretamente da interação entre usuário e sistema chamada de front end, e a outra, cuida dos processos relacionados ao que é solicitado por usuários e processos diretamente com o banco de dados chamada de back end. Num terceiro momento, a introdução da comunicação de longa distância, principalmente com a popularização da Internet ofereceu um novo patamar para o uso dos bancos de dados, permitindo que usuários em quaisquer cantos do planeta com acesso à Internet possam acessar determinado sistema ligado a um banco de dados para manipulá-lo diretamente ou realizar solicitações de transações através de sistemas web que acessem o banco de dados e tenham permissão para manipular seus dados, como ocorre no e-Commerce. 163 Sistemas Paralelos Em muitos casos, com a massi�cação da Internet, bancos de dados agregam enormes quantidades de dados, sendo algo impensável ser armazenado em um sistema isolado em um único equipamento de hardware por motivos diversos. Um mesmo equipamento pode não ter recursos de hardware su�cientes para processar a quantidade de dados existentes em seus dispositivos de armazenamento, isso se alguns Terabytes forem su�cientes para tal armazenamento, pois, por segurança, os discos rígidos podem utilizar a já citada tecnologia RAID para espelhamento de discos e, assim, reduzir a capacidade de armazenamento por restrições de projeto. 164 Por mais poderoso que seja o equipamento isolado, uma simples consulta pode levar muito tempo e gerar transtornos diversos com lentidão, fora o fato de todo o sistema depender do pleno funcionamento deste equipamento. Logo, subdividir a carga entre mais equipamentos é o mínimo a ser feito, e assim surgiu a ideia de se organizar racks com equipamentos que, juntos, oferecem melhores recursos de armazenamento, processamento e garantia das propriedades ACID essenciais para este tipo de aplicação. Os chamados data centers são uma alternativa excelente para lidar com sistemas pesados que lidam com grandes bases de dados, pois, normalmente, são dotados de equipamentos de alta tecnologia e performance tendo muito espaço de armazenamento espelhado e seguro, além de ter componentes de hardware ditos redundantes, ou seja, capazes de serem trocados mesmo com os equipamentos em funcionamento, como fontes de energia, discos, etc. Um data center, por ser todo espelhado, inclusive, mesmo que gerando altos custos de manutenção, para certas situações, este tipo de investimento passa de importante para obrigatório devido à natureza dos dados contida, ou de se tratar de uma prestadora de serviços de fornecimento de infraestrutura de TI (outsourcing). Normalmente, os data centers representam o estado da arte da TI, mas podem ser usados tanto em redes locais como em sistemas cliente-servidor, mas não é uma situação comum, salvo em casos em que seja necessário o isolamento da infraestrutura, por motivos de segurança, por exemplo. 165 Um data center por possuir tecnologia que permita o processamento paralelo real, diferente do que é feito pela divisão de fatias de tempo de processamento que simula processamento paralelo de transações. Em sistemas de processamento de paralelo real, existem processadores �sicamente separados que trabalham de forma conjunta para que processos possam ser executados simultaneamente, aumentando muito o throughput de uso da infraestrutura toda. Além do processamento, aumenta-se o acesso ao banco de dados que pode ser colocado em discos que possam também utilizar a tecnologia RAID ou outras para trabalharem paralelamente, aumentando muito a e�ciência de hardware e de processamento em geral. Sistemas do tipo cliente-servidor não necessariamente utilizam esta tecnologia, assim como podem ser estruturados data centers sem este recurso, mas, geralmente, é um investimento válido quando se prevê grande volume de dados e de transações. A forma como se utiliza este paralelismo real depende muito do ajuste do sistema operacional em disponibilizar este recurso disponível, mas que pode ser subutilizado, como quando se usa software baseado em arquiteturas de hardware 32 bits em equipamentos 64 bits, pois se reduz a capacidade de processamento do hardware para aquele software. 166 Sistemas operacionais e outros softwares podem ser encontrados em versõesde 32 e 64 bits, mas o que isto gera de diferença na prática? Basicamente, signi�ca a quantidade de bits que o processador de uma máquina consegue processar de uma só vez, permitindo números maiores armazenados em atributos, por exemplo, no caso de 64 bits. É possível encontrar no mercado hardware de base com preço acessível para uso de dois processadores simultâneos, por exemplo, permitindo que dois cálculos diferentes possam ser realizados ao mesmo tempo, ou uma transação em um banco de dados ocorra exatamente ao mesmo tempo em que se realiza um outro processo em outro processador, obtendo-se algo similar à duplicação da capacidade de processamento. Outra possibilidade é que para se liberar o bloqueio de uma transação, é possível que o processamento seja dividido entre processadores diferentes e um commit ou con�rmação da transação seja obtido mais rapidamente, da mesma forma que discos podem ser utilizados em tal harmonia que sejam capazes de armazenar parte de um conjunto de dados em um disco, parte em outro e, assim por diante, permitindo que dados sejam lidos, paralelamente, mas tudo isso necessita ser muito bem gerenciado pelo sistema operacional e demais sistemas envolvidos. Existe, inclusive, uma denominação para estes equipamentos que diz que um equipamento que possua alguns poucos processadores potentes em paralelo seja considerado uma máquina com granularidade grossa, mas no caso de equipamentos com grandes quantidades de processadores menos potentes são chamados de máquinas com granularidade �na. 167 https://go.eadstock.com.br/BB Este tipo de tecnologia afeta diretamente valores ligados à throughput e tempo de resposta em transações e processos, pois na primeira métrica, o paralelismo aumenta muito a quantidade de processos que podem ser realizados, simultaneamente, reduzindo de maneira inteligente, �las geradas por transações que sejam mais lentas e que poderiam atrasar toda uma �la de processos. Sobre o tempo de resposta, a espera tanto de realização de uma ação quanto no tempo de realização após início do processamento, pode ser afetada pelo paralelismo, pois com a divisão de transações entre processadores pode agilizar o processo, tanto quanto o fato citado da �la de processos andar mais rapidamente com os processos ocorrendo em paralelo. Segundo Silberschatz (2020), o uso da tecnologia que permite o paralelismo permite ganhos em pelo menos dois aspectos diretamente ligados ao uso deste mecanismo de hardware – o ganho de velocidade em função da redução de tempo para se realizar transações e o ganho em escala que ocorre em função do paralelismo permitir que transações maiores possam ser realizadas mais e�cientemente. Esses ganhos podem ser variados e também medidos de diferentes formas, dependendo do critério de avaliação como quantidade de recursos em paralelo e a proporção de ganho de velocidade obtido com esse paralelismo, podendo ser linear se for equivalente, ou sublinear se o ganho não for igual ao aumento de recursos por menor throughput. No caso da avaliação em escala, se uma transação leva determinado tempo para ser executada por completo, com o aumento de recursos em paralelo, caso um aumento equivalente da complexidade das transações possa mesmo assim manter o mesmo tempo de realização, pode-se dizer que existe um ganho linear em escala, mas caso o tempo aumente, é dito um ganho escalar sublinear. Existem outros critérios de avaliação de ganho com paralelismo, como o tamanho de um banco de dados e o aumento proporcional de transações solicitadas, ou um aumento das transações solicitadas gerando um consequente aumento do banco de dados. 168 Aspectos Arquiteturais Esses sistemas paralelos são obtidos através de tecnologias em hardware que permitem que discos, processadores e memória, principalmente, possam ser multiplicados em equipamentos, mas além disso, que possam dividir as tarefas de forma a serem realizadas paralela e simultaneamente. As maneiras como estes componentes podem ser conectados entre si, de diferentes formas, geram redes de componentes para operarem em paralelo, e a forma como é feita esta rede possui nomenclaturas similares às utilizadas nas tecnologias de redes de computadores. Podem ser conectados em uma estrutura de barramento com todos os componentes se comunicando por um meio único que interliga a todos, tendo como limitação o uso compartilhado deste meio de comunicação, limitando sua e�ciência à medida que aumenta a quantidade de componentes a serem interligados. Outro meio é a malha que interliga os componentes uns aos outros, diretamente, uns através dos outros fazendo com que não haja um meio único de comunicação compartilhado, dividindo a carga de comunicação entre processos e quanto maior a quantidade de componentes de mesmo tipo, maior o paralelismo e também a possibilidade de roteamento de processos. Além da forma como os componentes podem ser colocados, paralelamente, para execução de processos, existe também a forma como este compartilhamento pode ocorrer, pois as possibilidades de con�gurações de paralelismo são variadas e com isto, surgem diferentes possibilidades de uso dos componentes. Silberschatz (2020) cita que há casos em que a memória volátil (RAM) é compartilhada entre todos os processadores alocados em paralelo, assim como discos não voláteis, como discos rígidos, sendo este um recurso com alto desempenho e permite uma e�ciente comunicação, principalmente entre processadores. 169 Como existem limitações de projeto em função do uso de 32 ou 64 bits na arquitetura destes componentes, isso gera limitações de endereçamento e compartilhamento de recursos para esta quantidade de processadores e, em casos nos quais sejam utilizados números maiores em paralelo, esta solução de compartilhamento não se mostra funcional. Outro componente compartilhável, o disco que representa o responsável pelo armazenamento não volátil é algo bastante comum, pois bancos de dados e outros softwares e sistemas costumam �car armazenados em um único sistema de armazenamento, sendo este sistema um único disco, ou um conjunto de discos integrados em bancos muito grandes, mas desconsiderando cópias de segurança. As cópias de segurança são geradas automaticamente e não são locais de execução das transações em tempo real, não precisando necessariamente participar do processamento paralelo citado diretamente. Ignorando, então, o fato de existirem cópias em tempo real ou cópias de backup que acrescentariam bastante complexidade a esse contexto, não é muito sensato que houvesse um banco de dados para atender a cada dispositivo paralelo de processamento, por exemplo e, assim, acaba sendo muito comum a prática de uma única base de dados de origem a ser utilizada por todos os usuários, salvo em casos 170 em que o volume de transações possa ser tão grande que seja inviável do ponto de vista do desempenho de hardware e haja a necessidade de replicação do banco de dados para um grupo de usuários. Com essa técnica, é possível que clientes de uma �ntech como o Nubank, por exemplo, possa manter infra estruturas completas para cada determinado conjunto de clientes para garantir as propriedades ACID com maior segurança para cada um destes grupos de clientes. Pode haver casos nos quais os dispositivos não são compartilhados e cada equipamento possui todos os recursos necessários e acaba sendo mais independente dos demais equipamentos da infraestrutura, sendo que existe tráfego de dados entre os equipamentos, sempre que necessário. Esta tecnologia acaba permitindo boa escalabilidade (ou expansão da infraestrutura com base nesta tecnologia), mas existe um alto custo de comunicação entre equipamentos para a garantia de e�ciência em velocidade e con�abilidade da transmissão, além de alto volume de acesso a disco vindo de transações de outros equipamentos, gerando alto custo em desempenho das unidades de disco. Um último modelo trazido por Silberschatz (2020) mescla característica dos outros três modelos citados chamado hierárquico onde existemníveis de divisão da infraestrutura, sendo um primeiro nível mais alto formado por hardware com base no modelo dito nada compartilhado de subsistemas de hardware. Parte dos dispositivos forma uma unidade ligada ao restante da infraestrutura, mas dentro desta estrutura, a memória RAM poderia ser compartilhada única para cada conjunto de dispositivos nada compartilhados. 171 Os SGBDs são ferramentas com muitos recursos e um dos melhores, certamente, é a opção disponibilizada pela Oracle. O paralelismo é uma das tecnologias implementadas nesse SGBD muito popular no mercado. Sistemas Distribuídos A ideia geral de sistemas distribuídos se baseia no fato de um banco de dados estar armazenado em diferentes equipamentos que podem estar �sicamente próximos ou não, mas que con�guram algum tipo de acesso remoto entre os equipamentos. Os equipamentos são independentes em termos de hardware, podendo ser equipamentos de tipos diferentes e até com hardware e sistema operacional diferente, mas o meio e o protocolo usados para comunicação devem ser padronizados, como ocorre com o protocolo de comunicação TCP-IP utilizado pela Internet para conectar inúmeros tipos diferentes de equipamentos. Geralmente, até a representação grá�ca deste tipo de infraestrutura difere da anterior comentada para arquiteturas em paralelo, pois não se de�nem exatamente os meios de comunicação entre os equipamentos com linhas, mas usando uma nuvem em função de a comunicação ser mais difícil de precisar e identi�car, ainda mais à medida que a infraestrutura cresce muito, como no caso de sistemas de banco de dados que operam pela web. 172 https://go.eadstock.com.br/BC As transações locais são aquelas em que tanto a origem quanto o destino se encontram em uma mesma infraestrutura ou site, como se diz, em sistemas distribuídos, e transações globais têm sua origem em algum site diferente de onde devem ser efetivamente realizadas. Nesta arquitetura, partes do banco de dados mais especí�cas podem estar alocadas em um site e as demais partes em um ou mais outros sites, dependendo da complexidade e avaliação de pontos positivos e negativos desta distribuição do sistema em partes. Isto gera certa liberdade dos sites em gerenciar bancos de dados locais, podendo então a carga de transações ser também distribuída, pois transações locais geram baixo custo, ao passo que eventuais transações globais possuem maior custo, mas podendo-se obter ganho de desempenho com esta arquitetura. A disponibilidade é um aspecto positivo, pois em função da menor dependência entre os sites, existe um menor risco de uma falha em algum dos sites afetar toda a infraestrutura global, mas apenas equipamentos diretamente afetados. Um ponto de atenção na infraestrutura de um sistema distribuído é que independentemente do que ocorra na infraestrutura em termos de desastres, a mesma deve ser capaz de manter o funcionamento da infraestrutura com o restante não afetado pelo ocorrido. Para isto, equipamentos como computadores que gerenciam sozinhos pequenos sistemas ou componentes de um sistema maior precisam ter algum meio de retomar suas atividades com a existência de um outro computador igual ou similar contendo as mesmas funcionalidades que possa substituir o anterior fora de operação na infraestrutura, por exemplo. Mesmo grandes data centers podem ter infraestruturas completas de segurança reservas para serem ativadas em caso de necessidade, ou que funcionem paralelamente, podendo estar sempre em funcionamento, dividindo o trabalho de processamento dos processos, e tendo replicados sistemas e banco de dados. Importante que sistemas distribuídos sejam capazes de funcionar da forma mais transparente possível na visão dos usuários no caso de, mesmo tendo partes espalhadas por diversos locais �sicamente distintos, possam fornecer a impressão de que toda infraestrutura estaria alocada �sicamente onde se encontra o usuário. É claro que no caso da ocorrência de um desastre que impeça o usuário de acessar a infraestrutura como uma queda de luz que impeça o funcionamento de seu equipamento ou a interrupção do serviço de comunicação utilizado para conexão 173 com a infraestrutura, por exemplo, a mesma deve continuar operando normalmente para outros usuários. Existem pontos de atenção citados por Silberschatz (2020) como maiores custos associados ao desenvolvimento de soluções de software distribuído pela maior complexidade de operação, com maior possibilidade de ocorrência de bugs ou problemas na implementação e implantação de maior ou menor gravidade, e a possibilidade de throughput excessivo, não especi�camente relacionado às transações dos sistemas, mas pela garantia da comunicação entre os sites que compõem a infraestrutura distribuída. Para �nalizar, é importante frisar que os sistemas distribuídos são alocados em redes locais com toda sua infraestrutura ligada através de meios de comunicação de curta distância, como cabos e sinal de WI-FI, ao passo que redes remotas que possuem partes espalhadas por diferentes locais podem estar gradativamente mais distantes usando diferentes tecnologias de comunicação, como cabos, redes de telefonia móvel como 3G, 4G e 5G, sinais de rádio e conexões via satélite, por exemplo. 174 Banco de Dados Paralelos e Distribuídos 15 175 Além das infra estruturas contendo tecnologias que possam trabalhar em paralelo para aumento de desempenho e maior escalabilidade, existem conceitos mais especí�cos que tratam de banco de dados que possam ser implementados para trabalhar em paralelo e de forma distribuída, tendo sido este o motivo de uma introdução à ideia de como funcionam sistemas com estas tecnologias. Os sistemas de banco de dados paralelos representam uma alternativa custosa em termos de desenvolvimento que quase foi abandonada décadas atrás pela baixa necessidade de se desenvolver e manter algo tão complexo para um volume de dados e transações que acontecia na época, mas com a grande massi�cação da World Wide Web, os chamados e-Commerce, começaram a utilizar banco de dados que, gradativamente, precisavam ser capazes de suportar uma quantidade de dados e transações em crescimento acelerado. Com a popularização da web, o mundo conheceu uma imersão profunda neste novo meio de se informar, comprar e passar o tempo de forma que os dados contidos ali foram se tornando cada vez mais importantes e capazes de fornecer dados relevantes, além de simples cadastros e senhas de acesso para segurança das transações envolvendo valores ou dados mais sigilosos. Os sistemas básicos implantados em redes locais isoladas do restante do mundo começaram a não mais fazer sentido, pois os negócios começaram a �car interligados e trabalhar em conjunto em muitos casos agregando bens a serviços ou vice-versa. Os sistemas de banco de dados começaram a evoluir de forma a se tornar mecanismos de apoio à tomada de decisões. A Internet se tornou a base para a sociedade de uma forma tão intensa que já não se imagina mais um mundo sem uma tecnologia capaz de interligar praticamente tudo que existe para o ser humano que possa gerar dados digitalmente armazenáveis. Como grande parte das transações realizadas em banco de dados se resumem a consultas, isto se torna um fato bastante favorável a �m de que sejam implementados para serem paralelos, proporcionando grande escalabilidade, segundo Silberschatz (2020). Uma tendência iniciada na década de 1980 se manteve até os dias atuais, e favorece o paralelismo que foi a redução do tamanho dos equipamentos de computação que antes eram grandes mainframes e supercomputadores com tecnologias que não se preocupavam com tamanho, passando a ser desenvolvidos para serem posicionados em racks ou gabinetes. 176 Paralelismo de Disco para Banco de Dados O compartilhamento de disco é a forma mais comum de paralelismo e a mais utilizada, provavelmente, pois a necessidade de investimento para implantação e uso é menor e a manutenção de sistemas sendo executados com esta tecnologia também são menos propensosa bugs e custos de implementação que o paralelismo de processamento, por exemplo. Um meio de paralelismo de disco se chama particionamento horizontal em que as entidades são gravadas em tuplas que podem estar armazenadas em discos diferentes podendo este paralelismo ser implementado de diferentes formas. O particionamento do banco de dados entre diferentes discos pode ser feito com base em algoritmos que fazem a distribuição das entidades entre discos, como no caso do chamado rodízio, que tenta manter equilibrada a distribuição das entidades com base na alocação de cada nova entidade em um dos discos que compõem o conjunto usado no paralelismo, de forma sequencial, como de pessoas entrando em cadeiras de uma roda gigante. Na estratégia de hash, os próprios dados das entidades podem ser utilizados como critérios de escolha do disco a ser armazenada à entidade como um cálculo matemático realizado sobre um valor numérico de um dos atributos, sendo que a correta escolha do atributo e do cálculo determinarão se ocorrerá um equilíbrio na distribuição ou não. Outra forma de paralelismo se baseia em intervalos de valores contidos em algum dos atributos para a escolha do disco a ser utilizado no armazenamento, como a de�nição de intervalos de idades para a escolha do local de armazenamento. Esta estratégia pode ser interessante numa divisão das entidades de acordo com a capacidade e desempenho geral do disco e equipamento ao qual esteja ligado em infraestruturas onde os equipamentos podem ser diferentes. Como citado, exceto pelo mecanismo que fatia igualmente as entidades através de um rodízio equivalente de discos, os demais algoritmos podem gerar maiores acúmulos em um disco em relação a outro podendo ser classi�cados como distorções. 177 Uma das distorções ocorre quando certos atributos possuem valores que ocorrem muito mais vezes que outros, determinando que uma grande proporção das entidades seja armazenada em um disco, e poucas entidades nos demais, por exemplo. Existem mecanismos que podem ser agregados aos algoritmos de distribuição de entidades de forma a prever possíveis acúmulos exageradamente maiores que outros em unidades de armazenamento, utilizando avaliações prévias dos conteúdos dos atributos das entidades utilizados no processo de de�nição do armazenamento em paralelo. Com estas adaptações aos algoritmos de escolha de dados a serem armazenados em cada diferente opção de disco, estatisticamente é possível avaliar menores probabilidades de uma distribuição inadequada ocorrer, otimizando o uso da infraestrutura de armazenamento para uso do banco de dados. Um dos tipos de paralelismo em banco de dados se baseia no paralelismo de consultas e demais transações aproveitando recursos do paralelismo para aumentar o throughput de realização de processos simultâneos gerando, assim, a possibilidade de ganho escalar. Em sistemas com arquitetura de discos compartilhados ou com nada compartilhado, existem alguns mecanismos de controle que precisam ser gerenciados além das transações, gerando muita troca de mensagens e maior congestionamento, além de uma maior di�culdade de implementação. Outro tipo de paralelismo ocorre principalmente em casos nos quais consultas muito pesadas podem ser executadas, paralelamente, para que se obtenha ganho no tempo de execução da transação. Existe também um paralelismo relacionado às tuplas de entidades e relacionamentos que podem ser colocadas em paralelo em discos diferentes que trabalhem em paralelo para que se obtenham ganhos na realização de consultas, principalmente, porque nem todas as unidades de disco possuem mecanismos de alta velocidade, sendo ainda muito comuns as unidades de disco rígido magnético de baixa velocidade de acesso. Para controlar este mecanismo, existem algoritmos já citados para organizar a distribuição das tuplas pelos discos, mas existem também outros com a função de classi�car para controle desta divisão e para unir as tuplas de forma a compor novamente o banco completo, sempre que necessário, existindo variações e diferenças técnicas entre cada opção. 178 Banco de Dados Distribuídos Assim como em sistemas distribuídos que se localizam em diferentes sites (pontos físicos distintos), bancos de dados podem também trabalhar de forma distribuída, armazenando seus dados em estrutura fracionada, distribuída por sites. É fácil imaginar que o fato de haver este distanciamento entre partes do banco de dados deve gerar grande tráfego de dados pelos canais de comunicação e isto acaba gerando perda de rendimento do sistema, além de uma maior complexidade na organização e gerenciamento do banco de dados. Os sistemas de banco de dados podem conter em todos os seus sites SGBD e demais ferramentas e softwares iguais, e isto pode facilitar a comunicação havendo, inclusive, uma maior permissividade entre os sites no gerenciamento dos bancos de dados uns dos outros, pois mesmo estando dispersos, compõem um mesmo sistema. Outro sistema é composto por sites que não possuem infra estruturas de banco de dados iguais, podendo diferir no SGBD e demais softwares componentes, aumentando a complexidade da comunicação e gestão conjunta, ocasionando menor interação entre os sites, restringindo-se mais a consultas e transações limitadas. O armazenamento distribuído de um banco de dados pode ser feito em réplicas idênticas do banco todo armazenadas nos diferentes sites, ou o banco pode ser fracionado e ter suas partes armazenadas em diferentes sites. Existem vantagens no sistema de replicação do banco todo, pois em casos de falhas de um site, os demais possuem totais condições de oferecer suporte ao sistema, trazendo o banco de dados de volta quase que imediatamente, in�uenciando diretamente na disponibilidade dos dados. Como existe a replicação total dos dados, isso gera um tipo de paralelismo que permite transações rápidas que ocorrem dentro de si mesmo, pois existem quase 100% de chances do que uma transação se propõe a realizar poder ocorrer no site, sem a necessidade de acesso a outros que depois teriam o banco de dados atualizado do site onde ocorreu a transação, replicada para os demais sites. 179 Existe o problema de maior throughput aumentado em função das operações de manutenção das réplicas atualizadas o mais constantemente possível, e isso pode gerar atrasos nas transações, principalmente em infra estruturas com canais de comunicação não tão rápidos e e�cientes. No sistema de fragmentação do banco de dados, é importante estar ciente de que as partes espalhadas do banco de dados não estão organizadas nos diferentes sites apenas com frações do banco, mas também com diversos dados adicionais de controle para reintegração do banco, sempre que necessário, e mesmo que apenas temporariamente. Esta fragmentação pode ser feita de forma dita horizontal quando uma relação é particionada de forma que suas tuplas de dados representando as entidades do conjunto de entidades estejam todas armazenadas em algum dos sites, de forma que seja possível a mescla de todas as tuplas separadas para a formação da tabela completa, sempre que necessário. O algoritmo pode conseguir prever uma melhor distribuição das tuplas, de acordo com a quantidade de acesso de cada uma, por exemplo, minimizando o tempo de busca e de comunicação entre sites. Outra forma de fragmentação é dita vertical, pois ao invés de manter as tuplas íntegras e armazenadas em diferentes sites, atributos de tabelas é que são separados uns dos outros com todo o seu conjunto de dados. Isso permite uma personalização dos dados armazenados em cada site, de forma a oferecer maior sigilo em dados que seriam então separados de outros, mas mantendo mecanismos de controle para eventuais uniões dos atributos em transações. Independentemente de como o banco de dados é armazenado, seja fracionado ou não, os usuários não devem perceber esta organização arquitetural da infraestrutura, pois isso não deve afetar o funcionamento normal do sistema gerenciador e do banco de dados em si. Esta transparêncianão deve oferecer indícios ao usuário de que o banco de dados possa estar fracionado horizontal e nem verticalmente, e nem se existe uma replicação do banco, pois, aparentemente, todo o banco e sistemas estão sendo acessados localmente. As transações ocorrem tanto local quanto globalmente como já estudado, e no caso das transações globais, os sistemas distribuídos de banco de dados são a base de funcionamento e isto aumenta mais ainda a complexidade das transações que 180 precisam trabalhar dados que podem estar em diferentes sites, mas que, ao �nal, precisam garantir da mesma forma as propriedades ACID. Silberschatz (2020) cita que além de problemas comuns como falhas relacionadas a software e hardware envolvendo equipamentos e dispositivos utilizados diretamente no armazenamento dos dados, em banco de dados distribuídos, as falhas podem estar relacionadas a sites e comunicação, envolvendo aspectos diversos de infraestrutura. Tanto em caso de con�rmação de uma transação (commit) quanto de falha da transação (rollback), o processo é mais complexo em um banco de dados distribuído, pois dependendo do fracionamento utilizado, todos os fragmentos precisam concordar com o status da mesma transação, e isto precisa ser muito bem orquestrado de forma a haver, além de uma sincronia dos processos da transação, garantias do resultado �nal. Para isto, pode ser necessário que sejam realizadas as ações de uma transação em etapas, em que uma primeira etapa seria a do registro de log para operação de rollback, se necessário, e sinalização para todos os sites de solicitação de transação, aguardando resposta positiva ou negativa de todos. Em caso de aceite de todos os sites, o gerenciador de transação coordena a execução da mesma, e em caso de falha indicada por qualquer um dos sites que possuem dados ou estruturas a serem utilizados na transação, o status de toda a transação deve ser atualizado para abortar, atualizando também o log. Ao �nal de uma transação bem-sucedida, um commit é indicado, mas apenas após con�rmação de sucesso em todas as frações de todos os sites, mas em caso de falha em uma etapa dentro da execução da transação, é preciso avaliar a necessidade de realização de um rollback, como já comentado. Pode ocorrer também de atrasos ou falhas na comunicação e o gerenciador de transações nem receber resposta de algum site, con�gurando falha também por garantia, mesmo que em seguida uma resposta positiva do site chegue, pois é preciso garantir a integridade do banco mais do que a correta execução de uma transação atrasada. Pode ser implementada uma proposta alternativa em três fases que adiciona uma fase de controle do próprio gerenciador de transações em con�rmar as respostas dos sites e isso ativa mecanismos de veri�cação de status dos sites que con�rmaram resposta e escolhem um novo gerenciador de transações. 181 Há outros protocolos de processamento de transações citados por Silberschatz (2020) como o de mensagens persistentes entregues apenas uma vez, uso de relação especial de controle de envio de mensagens, ou um protocolo de uma relação especial de controle de mensagens recebidas em sites do banco distribuído. Existem mecanismos de controle de concorrência adaptados para bancos de dados distribuídos que necessitam de uma perfeita replicação do banco, mantendo as bases dos sites igualmente atualizadas para evitar impedimentos no funcionamento das transações. Protocolos de bloqueio como de gerenciamento a partir de um único site, distribuído entre mais de um site, protocolo de cópia primária que admite uma das réplicas do banco como principal, protocolo da maioria que necessita de garantia de envio de bloqueio a pelo menos metade dos sites, protocolo parcial que prioriza bloqueios compartilhados ao invés de bloqueios exclusivos, etc. Sendo a disponibilidade uma das propriedades mais importantes em um banco de dados, mesmo em banco de dados distribuídos, a disponibilidade máxima possível, dita alta disponibilidade que representa quase que um funcionamento ininterrupto garantido do banco de dados. Para isso ser possível em um sistema composto por diferentes sites são necessários recursos para detecção de falhas, boa replicação do banco ou uma perfeita fragmentação em termos de durabilidade dos dados, desde problemas simples como perdas de dados na comunicação, como desastres que tiram um ou mais sites do ar. A correta implementação de mecanismos para controle de falhas ou con�rmações de transações é importante, assim como a garantia de funcionalidade individual de cada site da melhor forma possível. 182 Conhecer mais sobre banco de dados distribuídos é algo importante para o aprimoramento nos estudos desta área fundamental para o mercado de trabalho. Neste material, segue um resumo com algumas ilustrações e exemplos para auxiliar nos estudos. 183 https://go.eadstock.com.br/BD Tópicos Avançados e Mineração e Análise de Dados 16 184 Sistemas de banco de dados são complexos softwares que lidam com um dos bens mais valiosos do mundo atual, e da forma como os dados estão sendo captados e tratados de forma a servirem de material para diversas �nalidades, surgem novas tecnologias, regularmente, com o intuito de oferecer meios de se organizar e gerenciar os dados da melhor forma. O desempenho de um banco de dados é algo que se busca aprimorar sempre, principalmente em sistemas que contenham grandes volumes de dados e que sirvam de base para constantes transações de consulta e outras ações que podem ou não demandar muito tempo para serem realizadas. O hardware em si sempre será um dos pontos mais importantes na avaliação de desempenho de banco de dados, pois o uso massivo de processamento e unidades de armazenamento faz com que o uso de dispositivos que não sejam os mais e�cientes pode tornar a experiência com um banco de dados bastante desagradável, tanto do ponto de vista do gerenciador que leva muito tempo para retornos de transações quanto de usuários, que cada vez têm menos tempo e paciência para aguardar processamentos demorados. Para se avaliar desempenho, é preciso estabelecer critérios de avaliação a partir de métricas adequadas e valores de referência con�áveis, pois a simples avaliação intuitiva de uma infraestrutura ou de uma SGBD podem não representar algo con�ável para que se pense em tomar medidas relacionadas a novos investimentos ou solicitações de melhorias e correções no sistema que funciona sobre um banco de dados. Descobrir pontos de perda de desempenho em um sistema é algo que pode demandar tempo e recursos de pessoal e tempo, mas mesmo algum ganho aparentemente pouco signi�cativo pode representar valores altos em realizações de mais negócios numa mesma fatia de tempo. Os problemas podem estar relacionados à codi�cação de software do sistema, pouco otimizado e consumindo recursos de processamento desnecessário, mas a avaliação do que é desnecessário passou por mudanças de tempos para cá, pois um item que à medida que é reforçado gera perda de desempenho em qualquer sistema é a segurança. Mas a segurança é um dos pilares dos bons sistemas de banco de dados no mundo atual da Internet, pois a comunicação pela web se baseia em um protocolo muito e�ciente, mas já bem conhecido. Por ser uma rede pública, necessita que os mecanismos de segurança sejam bem implementados e até exagerados, muitas 185 vezes, para evitar invasões na infraestrutura com intuitos variados como corromper bancos, roubar dados de forma invisível, ou até o chamado sequestro de dados (ransomware). O uso de processamento paralelo é importante em desempenho, pois é comum que uma transação leve muito tempo aguardando uma entrada de dados manual, reduzindo o throughput do sistema, deixando recursos por muito tempo ociosos. Ajustes em um banco de dados podem ser realizados em nível de hardware com tecnologias variadas de disco, processamento e memória RAM, assim como con�gurações de rede e meios de comunicação. O próprio banco de dados, geralmente, possui ajustes que também podemrepresentar importantes aspectos em desempenho e segurança, através de ajustes de tempo e checkpoints de processos, por exemplo, além de aspectos relacionados à concorrência e recuperação de dados. Um terceiro nível em que a aplicação em si que afeta o SGBD envolve a de�nição de esquemas e transações, aplicando-se recursos do SGBD ou scripts em SQL ou XML, por exemplo. Índices e uma melhor organização das estruturas do banco de dados também são aspectos que contribuem com o desempenho do banco. A avaliação do desempenho pode servir de base para melhorias, como dito, e simulações de desempenho benchmarks são fundamentais na avaliação do conjunto da infraestrutura onde opera o banco de dados. O chamado TPC (Transaction Processing Performance Counci ou Conselho de Performance de Processamento de Transações) de�niu padrões para avaliação de desempenho em banco de dados. Aspectos como TPS (transações por segundo) ou de custo da TPS representam bons recursos para medição de desempenho de banco de dados. Bancos de dados relacionais, orientados a objetos ou não relacionais, são todas opções interessantes e podem ser mais bem estudadas de forma a se obter maior conhecimento e preparo para evolução nos estudos na área de desenvolvimento e projeto de software para o gerenciamento de banco de dados. 186 Mineração de Dados Durante muito tempo, banco de dados foram simples repositórios de dados nos quais transações ocorriam com o objetivo de mantê-lo atualizado tendo como objetivo maior o suporte a atividades reais gerenciadas por sistemas baseados nestes banco de dados. Com isso, os bancos de dados poderiam armazenar também log históricos e transações realizadas com o intuito de permitir que transações equivocadas pudessem ser desfeitas, mesmo depois de passado algum tempo, se necessário. O termo data warehouse surgiu com a tecnologia capaz de trabalhar com diferentes bases de dados de forma uni�cada sob um mesmo schema de dados para que se pudessem realizar análises estatísticas sobre os dados das bases em conjunto com o intuito de obtenção de padrões e informações antes inimaginadas e capazes de gerar novos conhecimentos acerca do que já existia nos sistemas. A chamada mineração de dados se baseia nesta ideia de pesquisas mais complexas em banco de dados com objetivos variados, como de obtenção de dados esperados ou na busca por novas informações antes desconhecidas e que podem ou não agregar valor aos negócios, por exemplo. A expansão contínua da Internet e da sua infraestrutura global favoreceu o crescente volume de dados que circulam pela mesma, sendo estes dados voltados ao público em geral ou não, mas independentemente da �nalidade dos dados que pela rede mundial circulam, o conjunto de toda esta inimaginável base de dados representa uma fonte fortemente explorável de informações. As tecnologias voltadas a esta atividade foram sendo desenvolvidas à medida que foi sendo percebido que, além de padrões estatísticos capazes de mostrar como se comportam os dados em determinado momento, poderia ser possível realizar previsões através de avaliações históricas relacionadas às transações realizadas nos bancos de dados, geração de probabilidades mais con�áveis através de modelos estatísticos formados com base no cruzamento de dados de diversas bases de forma antes difícil de serem obtidos. Assim, o termo sistema de processamento de transações mais utilizado para de�nir banco de dados foi sendo expandido para rami�cações mais especí�cas como o de sistema de apoio à decisão. 187 Sistemas que antes apenas aguardavam por requisições de transações puderam se tornar ferramentas em tempo real de análise de dados e fornecimento de informações sobre como os dados estavam se comportando e que avaliações se poderiam obter a partir destes resultados fornecidos por estes sistemas. Algumas informações básicas eram a base para análise de negócios como maiores vendas, cálculos de lucros obtidos em períodos históricos recentes ou mais distantes, e sazonalidade de um negócio, por exemplo. Com a evolução das análises e cruzamento de banco de dados, aos poucos foram sendo obtidas novas informações como tendências de consumo de clientes, comparativos com resultados de concorrentes que eram publicamente acessíveis, avaliação de produtos emergentes no mercado em relação aos que eram oferecidos pelo negócio, etc. Os sistemas de apoio à decisão não representam novos sistemas de armazenamento de dados, mas sistemas que se baseiam nos dados existentes e gerados pelos sistemas de processamento de transações, assim, sistemas que dependem de outros sistemas para suas atividades, sendo de baixo custo operacional e que aumentam o throughput da infraestrutura. Podem ser executados apenas em momentos de maior ociosidade como no período da noite, gerando compilados obtidos até determinados períodos anteriores ao da geração dos resultados consolidados. Os sistemas de apoio podem oferecer meios de se tomar decisões rápidas de produtos a serem ofertados a preços promocionais devido a aspectos como alta demanda no mercado é provável guerra de preços, produtos que baixaram seu giro e não necessitam mais da mesma proporção de reposição de tempos anteriores ou até não mais repor o produto e descartá-lo do portfólio. Empresas grandes com �liais espalhadas em diferentes cidades ou regiões do país podem realizar análises de como a logística pode ser favorecida pelas demandas de cada região com o intuito de otimizar entregas e manutenção de estoques ou centros de distribuição, pois muitas empresas adotam, nos dias atuais, sistemas de estocagem como just in time de estoque ajustado à demanda ou até de trabalho sem estoque algum, apenas intermediando a logística de um ponto a outro praticamente em alguns modelos de e-Commerce. 188 Baseado no sistema Toyota de gerenciamento, o modelo just-in-time permite que insumos e produtos estocáveis cheguem aos depósitos apenas no momento de serem utilizados, ou o mais próximo possível deste objetivo. A base para os sistemas, tanto de processamento de transações quanto de apoio à decisão, pode se fundamentar em scripts SQL para se obter os resultados esperados quanto às suas �nalidades básicas, mas existem alternativas que foram surgindo para atender a outras demandas de complexidade além das possibilidades do SQL ou muito difíceis de se atingir com SQL. O OLAP (Processamento Analítico Online) utiliza técnicas e ferramentas de análise de dados para auxiliar a condução de negócios a partir de uma especialização do gerenciamento de banco de dados na realização de consultas e geração de relatórios, deixando de lado o foco no gerenciamento das demais formas de transação de dados. Baseados no uso de dados processados para armazenamento em data warehouses, possuem uma estrutura de armazenamento de dados em cubo, tendo assim, mais dimensões de dados que as tradicionais tabelas com linhas (tuplas) e colunas (atributos). Esse tipo de estruturação mais complexo dos dados permite que novas consultas de alto desempenho sejam possíveis, pois as próprias estruturas podem ser organizadas de forma que num banco de dados relacional convencional, os mesmos resultados teriam que ser obtidos em etapas. 189 https://go.eadstock.com.br/BE As bases dos dados em sistemas desse tipo são medidas representativas de dados numéricos puros, e os dados gerados a partir das medidas chamadas de dimensões usadas diretamente nos sistemas de apoio à decisão, por exemplo. O armazenamento dito em cubo no modelo OLAP tem este nome apenas por permitir uma organização mais complexa dos dados, não necessariamente compondo este formato no sentido geométrico, mas na ideia de se poder trabalhar com mais de duas dimensões de dados, e daí a ideia de medidas e dimensões como terminologia. A ideia de medida é simples, pois agrega valores simples como em atributos de banco de dados relacionais, mas o termo dimensão se refere à forma como dados podem ser organizados e agrupados em níveis, por períodos de tempo, aspectos de subdivisãode grupos de dados, como cargos, localidades, situações, etc. A tecnologia OLAP trabalha com recursos capazes de lidar com grandes bases de dados com o intuito de gerar novos dados utilizados em sistemas de BI (Business Intelligence) que oferecem uma visão especializada dos negócios. Ferramentas como SAS ou S++ auxiliam no trabalho estatístico sobre os dados de forma bastante e�ciente, economizando tempo de implementação e garantia de resultados mais con�áveis pelo uso de ferramentas com e�ciência já comprovadas no mercado. 190 https://go.eadstock.com.br/BF O uso de um data warehouse torna possível a aplicação de ferramentas em dados originalmente armazenados em banco de dados distintos com schemas e estruturas diferentes que di�cilmente poderiam ser organizadas para uso em consultas por um comando SQL, por exemplo. As ferramentas conseguem realizar a chamada mineração de dados a partir de mecanismos avançados de combinação e busca de padrões em dados com o uso da estatística que possui muitos recursos para avaliação de dados que podem retornar informações resumidas e diretas para análise e tomada de decisões. É importante deixar claro que a área de mineração de dados não exclui o uso da linguagem SQL ou XML, mas agrega novas funcionalidades a estas trazidas por ferramentas ou novas implementações destas linguagens que possuem características voltadas à mineração de dados. A ideia das dimensões do modelo em cubo em OLAP pode ser de�nida por atributos que podem ser de�nidos como medidas no caso de dados que possam ser quanti�cados como quantidades em estoque ou vendidas, mas também, podem ser de�nidos como dimensões que representam outros atributos que servem como base para o agrupamento de medidas com base em cálculos como somas ou médias, por exemplo. Atributos como modelos, cores, cargos são típicos para uso na de�nição de dimensões, e atributos como quantidade em estoque ou vendida são atributos típicos para medidas, modelos bidimensionais podem até ser utilizados para organização dos dados até certo nível, mas a organização em cubo pode oferecer maior clareza dos dados incluídos. Um exemplo em que poderia se basear é na ideia geral de venda de carros, na qual atributos como quantidade vendida, nitidamente podem gerar medidas que podem ser agrupadas com base nos demais atributos, representando dimensões para análise. Neste caso, fabricante, modelo e cor podem ser usados como dimensões. 191 Imagem 55 MARCA MODELO COR ESTOQUE GM ONIX PRETO 3 FIAT ARGO PRATA 2 VW GOL BRANCO 3 FIAT ARGO VERMELHO 1 VW FOX BRANCO 4 GM ONIX PRATA 6 MARCA MODELO COR ESTOQUE FIAT ARGO ALL 3 GM ONIX ALL 9 VW FOX BRANCO 4 VW GOL BRANCO 3 192 Fonte: O autor. MARCA MODELO COR ESTOQUE FIAT ARGO ALL 3 GM ONIX ALL 9 VW ALL ALL 7 É possível utilizar agregação de medidas sob determinadas dimensões de forma a se obter informações resumidas e mais pertinentes, em determinados casos pode- se usar o valor all como representante de valor geral para todos os valores de um determinado atributo relacionado aos demais indicados na tabela. Na imagem 55, observa-se a representação da primeira tabela completa de exemplo que pode ser condensada em outra, menos agrupando-se dados contidos em medidas sob o critério de distinção de marcas e modelos, mas não de cores, obtendo como um possível resultado, a segunda tabela. Depois, na terceira tabela da imagem 55, é usada mais uma dimensão para receber o valor all e condensar ainda mais o resultado da consulta, tendo então como resultado �nal do exemplo, os totais de carros por marca, independente de modelos ou cores. Existem tipos de dados compostos que podem ser decompostos, hierarquicamente, como datas em dia, mês e ano ou data e hora, sendo que a data pode ser decomposta em dia, mês e ano. Geralmente, países, estados e cidades também possuem hierarquia, mas não são considerados um campo único. Os sistemas OLAP podem ser implementados como sistemas multidimensionais (MOLAP), relacionais (ROLAP) ou híbridos multidimensionais com armazenamento relacional (HOLAP) podendo ser implementados sob arquiteturas cliente-servidor, por exemplo, onde banco de dados e OLAPs �cam armazenados no servidor para serem acessados pelos clientes. 193 A forma como as implementações OLAP geram seus cubos de medidas e dimensões pode seguir mecanismos variados como somas ou médias em atributos que possam servir como medidas em algoritmos mais simples, mas existem também opções mais complexas que se baseiam em cálculos estatísticos mais elaborados como variância e desvio padrão. Em versões mais recentes da linguagem SQL, generalizações extras foram criadas como adicionais à cláusula group by, como cube que gera todas as possíveis combinações de atributos indicados na consulta, ou rollup que permite agregações em níveis hierárquicos. select c.nome_cliente, v.valor_venda from c as cliente, v as venda group by cube (c.nome_cliente, v.valor_venda); select c.nome_cliente, v.valor_venda from c as cliente, v as venda group by rollup (c.nome_cliente, v.valor_venda); No primeiro dos exemplos acima, obtém-se como resultado um cubo agrupado contendo as tuplas nome_cliente, valor_venda | nome_item | valor_venda, mostrando que as combinações possíveis de diferentes tuplas são formadas a partir dos atributos indicados no comando. No segundo exemplo, por ser indicada uma hierarquia, são exibidos apenas resultados que contenham o atributo principal em todos, e as possibilidades de combinação com os demais: nome_cliente, valor_venda | nome_item. Existem outros pontos adicionais que podem ser utilizados e que agregam recursos valiosos ao OLAP e que podem ser conhecidos em pesquisas nas referências bibliográ�cas citadas e outras boas fontes literárias ou sites com conteúdo de procedência também con�ável. 194 Conclusão O conhecimento acerca da área de banco de dados representa uma importante informação para a formação pessoal e demandas do mercado, e a base conceitual tratada na disciplina, agregada a estudos complementares e prática exaustiva do que é prático, certamente, irá contribuir com grandes chances de ingresso no mercado para novos, ou de melhoria de currículo e possibilidades de mudança ou crescimento perante sua situação atual. Mas isto depende, de agora em diante, mais do aluno do que dos materiais ou quaisquer professores, pois o primeiro passo foi dado e os demais virão dos pés do aluno e sem apoios para se segurar. O conhecimento pode ser aprofundado em diversas direções a partir do que foi estudado na disciplina, mas, geralmente, um passo inicial partiria do estudo e da prática da linguagem SQL e do uso do SGBD ligado a um servidor como visto nos estudos para o desenvolvimento de banco de dados de teste. Lembre-se de que o bom aprendizado passa por todas as etapas do processo de desenvolvimento, desde a concepção e modelagem, até a implementação e uso do banco criado, testando-o de forma exaustiva para que se possa chegar a um nível de con�abilidade de sua e�ciência. Produtos podem ser desenvolvidos de forma simples buscando apenas a prática, mas este pode já atender demandas de pequenos negócios, assim como podem servir de base para o desenvolvimento de soluções mais complexas. Posteriormente, é possível se aprofundar em áreas como de banco de dados distribuídos, segurança em banco de dados, mineração de dados que está muito forte no mercado e em franca expansão de uso. Assim, sempre é preciso ter em mente que mesmo com o término da disciplina seu aprendizado e evolução na área continua, mesmo que não existam outras disciplinas da mesma área em sua matriz curricular, e isso não é algo dito para banco de dados, mas para todas as disciplinas do curso. Todas possuem sua relevância e podem fornecer caminhos para um aprofundamento e espaço no mercado de trabalho, pois a área de TI é uma das que mais oferecem espaços para inserção e que carecem de bons pro�ssionais. Bons estudos! 195 Material Complementar Livro Sistema de Banco de Dados Autor: AbrahamSILBERSCHATZ, S. KORTH, Henry F., SUDARSHAN Editora: LTC Sinopse: Livro referência na elaboração do material, possui enorme abrangência conceitual e, certamente, é uma ótima aquisição para fazer parte de uma biblioteca básica de material de estudo para qualquer estudante de TI. Filme Jexi - Um Celular Sem Filtro Ano: 2019 Sinopse: Um jovem introvertido adquire um celular com uma inteligência arti�cial revolucionária que trabalha bem o conceito de banco de dados e mineração de dados de uma forma lúdica, �ctícia, mas muito interessante. Comentário: Filme bastante leve e divertido que ainda traz muito sobre o tema da Inteligência arti�cial. 196 Web O que é um Banco de Dados Material disponibilizado pela Oracle trazendo a base da ideia dos bancos de dados e algumas tecnologias e ideias associadas. 197 https://go.eadstock.com.br/BG Referências SILBERSCHATZ, A.; KORTH, H. F.; SUDARSHAN, S. Sistema de banco de dados. 7ª ed. Rio de Janeiro: LTC, 2020. MySQL 8.0 Reference Manual. https://dev.mysql.com/doc/refman/8.0/en/ ALVES, W. P. Banco de dados. 1ª ed. São Paulo: Érica, 2014. BARBIERI, C. Governança de dados: práticas, conceitos e novos caminhos. Rio de Janeiro: Alta Books, 2020. BARBOZA, F. F. M.; FREITAS, P. H. C. Modelagem e desenvolvimento de banco de dados. Porto Alegre: Sagah, 2018. CARDOSO, V.; CARDOSO, G. Sistemas de banco de dados: uma abordagem introdutória e aplicada. São Paulo: Saraiva, 2018. DATE, C. J. Introdução a sistemas de banco de dados. Rio de Janeiro: Elsevier, 2003. MACHADO, F. N. R. Banco de dados: projeto e implementação. 4ª ed. São Paulo: Érica, 2020. SETZER, V. W.; SILVA, F. S. C. Banco de dados: aprenda o que são, melhore seu conhecimento, construa os seus. 1ª ed. São Paulo: Blucher, 2005. 198 https://dev.mysql.com/doc/refman/8.0/en/