Modelo Relacional#

Objetivo: Introduzir os conceitos fundamentais do modelo relacional, a base dos bancos de dados relacionais (RDBMS), e como eles organizam e armazenam dados.

No modelo relacional, o banco de dados é apresentado como uma coleção de relações ou tabela de valores. Na tabela, cada registro possui uma estrutura linear. Para se trabalhar com o modelo relacional, é importante conhecer as terminologias e conceitos empregados: relação se refere à tabela; tupla, representa uma linha ou registro na relação; atributo corresponde a uma coluna ou cabeçalho da tabela. A Figura a seguir representa uma tabela com dados utilizada no modelo relacional com um conjunto de cinco tuplas, na horizontal. As tuplas também são referidas pelo termo “registro”, enquanto os atributos, por “colunas”.

Modelo relacional

Modelo relacional

No modelo relacional é utilizado o esquema relacional de banco de dados, que é responsável por descrever uma relação normalmente nomeada no esquema como R. Essa relação possui o grau, que é o número de atributos desse esquema. De forma geral, o esquema relacional pode ser descrito da seguinte forma: \( R (A_{1}, (A_2,(A_3,...,(N_n))))\)
Uma relação de grau seis, que armazena dados sobre alunos em uma escola, poderia ter seu esquema escrito como: ALUNO (Nome, CPF,Telefone_residencial, Endereco, Idade, Media).
Uma relação r do esquema de relação R é indicada por r(R) e representa o conjunto de n tuplas: \(r={(t_1,(t_2,(t_3,...,(t_n))))} \)
Cada n tupla corresponde a uma lista ordenada de n valores: \( t = {(\nu_1,(\nu_2,(\nu_3,...,(\nu_n))))} \)
Em que cada valor é um elemento do domínio do atributo ou um valor especial NULL. Na Figura anterior pode-se observar uma relação ALUNO que corresponde ao esquema ALUNO. São apresentados os atributos e tuplas de uma relação ALUNO, com os dados relativos aos registros de alunos. Observe que quando um campo não possui dados, é indicado com o valor NULL. Os esquemas são fundamentais para a descrição das relações que compõem um SGBD.
Em um banco de dados relacional, um esquema pode ser entendido como a estrutura fundamental que define a organização e o design do banco de dados. Mais especificamente, um esquema descreve:

  1. A organização das tabelas:
    • Incluindo os nomes das tabelas.
    • As colunas (atributos) que cada tabela contém.
    • Os tipos de dados dessas colunas (por exemplo, inteiro, texto, data).
  2. Os relacionamentos entre as tabelas:
    • Como as tabelas estão conectadas umas às outras, tipicamente através de chaves primárias e estrangeiras.
  3. As restrições de integridade:
    • As regras que garantem a consistência e a precisão dos dados, como quais colunas não podem conter valores nulos ou quais valores são permitidos em uma determinada coluna.

Álgebra Relacional#

A álgebra relacional pode ser definida como um conjunto de operações, utilizando linguagem de consulta procedural, tendo como entrada uma ou duas relações (tabelas), produzindo como resultado uma nova relação. Suas operações estão relacionadas à seleção, projeção, junção, união, diferença, interseção, produto cartesiano, divisão e atribuição. Operações como seleção e projeção são classificadas como primárias ou unitárias, ao passo que operações como junção e produto cartesiano, como binárias. Vamos conhecer um pouco as características dessas operações?

Seleção#

A operação seleção tem como função a seleção tuplas (linhas ou registros), que atendam a uma determinada condição (predicado). É classificada como uma operação unária, já que opera sobre um único conjunto de dados. Sua sintaxe é composta da letra grega maiúscula sigma, denotando seleção, seguida da condição em subscrito e do argumento da relação em parênteses. Exemplo de seleção: \(\sigma_{predicado}(tabela) \)
Assim, para se selecionar a tupla referente ao aluno que tenha o código de matrícula igual a 001, escrevemos:\(\sigma_{codigo=001}(tabela) \)
Se o conteúdo da tabela “Aluno” contiver os seguintes registros, um resultado será visualizado:

código

nome

sexo

nascimento

001

Jose Luiz

M

01/05/1990

O quadro anterior ilustra um registro com o código (predicado) igual a 001. Isso permite que a consulta (seleção) seja executada com sucesso. Pode-se adicionar a seleção filtros por meio de operadores lógicos como e (and, ^) , ou (v , or) e o não lógico (not, ⌐). Esses operadores validam a comparação lógica com resultados sempre verdadeiros ou falsos. Adicionam-se, ao predicado de seleção, símbolos de comparação lógica como igualdade (=), diferente (!=), maior (>), menor( <), maior ou igual (>=) e menor ou igual(<=). Esses símbolos compararam dois objetos num predicado de seleção e, como resultado, tem-se verdadeiro ou falso. São exemplos de seleção usando esses operadores: σcodigo=001 ^ sexo = f (tabela) e σcodigo=001 ^ ano >= 1990 (tabela).

Projeção#

Trata-se de uma operação unária de relação vertical e tem como função a produção de um subconjunto com apenas os atributos (colunas ou campos) escolhidos na condição especi�cada. Sua sintaxe é composta da letra grega maiúscula pi (π), denotando projeção, seguida da lista de atributos em subscrito e o argumento da relação em parênteses. Por exemplo: π atributo (tabela). Para selecionar da tabela anterior (“Aluno”) apenas as colunas código e nome, escreve-se π código, aluno (tabela), seja, uma tabela seria representada por dois campos (código, nome).

Junção#

Trata-se de uma operação binária que tem como função a união de duas relações que possuem um atributo em comum. Sua sintaxe é composta do símbolo de junção, seguido da relação e dos atributos de igualdade em subscrito. Por exemplo: tabela1 atributo=atributo tabela2. Sendo assim, quando se deseja saber uma relação dos dados dos alunos que efetuaram pagamento de um determinado curso, escreve-se: pagamento aluno=codigo aluno. Nesse exemplo de junção, o resultado será composto de nome de alunos (não repetidos), e os registros serão somente aqueles que constam na tabela pagamento.

União#

Trata-se de uma operação binária que tem como função criar uma relação a partir de duas outras. Sua sintaxe é composta da relação 1 seguida do símbolo de união e da relação 2. Por exemplo: tabela1 U tabela2. Para saber os dados resultantes da união de alunos de duas escolas, escreve-se: aluno1 U aluno2. A tabela resultante será composta somente dos registros que estejam presentes como conteúdo das tabelas “Aluno1” e “Aluno2”. A união também pode ser feita a partir do resultado de duas projeções, para retornar o nome dos alunos das duas tabelas. Por exemplo: πnome (aluno1) U πnome (aluno2).

Interseção#

Trata-se de uma operação binária que tem como função criar uma relação a partir de duas outras relações, estabelecendo uma intersecção das duas, em que na relação gerada serão apresentados apenas os dados pertencentes às duas condições preestabelecidas. A sintaxe é composta da relação 1, seguida do símbolo de intersecção e da relação 2. Por exemplo: tabela1 tabela 2.

Diferença#

Trata-se de uma operação binária que tem como função criar uma relação a partir de duas outras relações. Na relação gerada, serão apresentados apenas os dados que não são comuns às duas relações. Sua sintaxe é composta da relação 1, seguida do símbolo de diferença, e da relação 2. Por exemplo: tabela1 -tabela2. Sendo assim, para saber os dados resultantes da diferençaentre as tabelas de “Alunos” das escolas, escreve-se: aluno1 – aluno2.

Produto Cartesiano#

Trata-se de uma operação binária que tem como função criar uma relação a partir de duas outras relações. Na relação gerada, serão apresentadas todas as combinações possíveis entre os elementos das relações. Sua sintaxe é composta da relação 1, seguida do símbolo de produto cartesiano, e da relação 2. Por exemplo: tabela 1 x tabela 2. Produto cartesiano trata-se de uma operação dispendiosa, uma vez que o número de registro da primeira tabela é multiplicado pelo número de registros da segunda.

Renomeação#

Trata-se de uma operação unária que tem como função de�nir o nome de uma tabela em um determinado contexto. Sua sintaxe é composta da letra grega maiúscula (rho), denotando renomeação, seguida do novo nome e do argumento da relação, em parênteses. Por exemplo: p tabela. Sendo assim, para renomear a tabela aluno para estudante, escreve-se: p estudante (aluno). Todas as operações da álgebra relacional podem ser executadas por meio da Linguagem SQL, assunto do nosso próximo tópico.

Linguagem SQL#

A linguagem SQL (Structured Query Language) foi desenvolvida pela IBM na década de 1970, tornando-se um padrão para os bancos de dados relacionais e ISO. Por meio dessa linguagem, é possível a de�nição de metadados e manipulação dos dados em um SGBD, servindo de interface entre o usuário e o SGBD.
Na linguagem SQL, são utilizados os conceitos de tabela, coluna e linha como representação dos conceitos já estudados de relação, atributo e tupla.

O comando mais utilizado para consultas num banco de dados pela linguagem SQL é o comando SELECT FROM. Podem-se fazer consultas em tabelas, especificando os campos desejados e as condições para a pesquisa, bem como a ordem em que o resultado deve ser apresentado (MEDEIROS, 2013). Esse comando possui a seguinte sintaxe: SELECT campos FROM tabela WHERE condição. Sendo assim, para mostrar todos os registros da tabela aluno, escrevemos: SELECT * FROM aluno. O símbolo de (*) representa todos os campos da tabela. Esse comando select apresenta diversas variações de consultas, pois a string SQL dependerá da regra que deseja ser aplicada ao banco de dados. O Quadro 1.6 apresenta algumas variações do comando select.

Comando

Explicação

SELECT * FROM aluno WHERE codigo=”001”;

Seleciona somente o registro com código igual a 001.

SELECT nome, nascimento FROM aluno;

Seleciona os campos nome e nascimento da tabela aluno.

SELECT nome, nascimento FROM aluno order by nome;

Seleciona nome, nascimento da tabela aluno ordenado por nome.

SELECT * FROM pedido WHERE numero < 3 AND valor > 1500;

Seleciona todos os registros da tabela, pedindo que tenha número menor do que 3 e valor maior do que 1500.

Nota-se que algumas das sintaxes SQL apresentaram a palavra reservada WHERE. Essa palavra é um filtro para o comando SELECT. Comandos lógicos e de comparação lógica podem ser adicionados aos filtros para uma especificação de registo.

Otimização#

Índices#

Na otimização de uma consulta, o uso de índice é fundamental. Índices melhoram o desempenho da consulta, garantem que determinados dados chaves não sejam duplicados, permitem acesso a dados ordenados sem custo de executar uma ordenação e busca dados específicos com melhor desempenho. O uso de índice pelos gerenciadores de banco de dados se assemelha ao uso de índice num livro. O objetivo é o de otimizar o tempo de acesso aos registros (tuplas, linhas) de uma tabela, por meio de ponteiros criados para os dados armazenados em colunas específicas. Porém, índices não são úteis para inserção, o processo torna-se mais lento, aumenta o consumo de espaço em disco e a necessidade de manutenção interna no banco de dados. Um índice pode ser composto de um ou mais campos. Quando formado por apenas um único campo é tido como simples, e quando formado pela combinação de dois ou mais campos, é considerado um tipo de índice composto.

Tipos de indices

tipos de indices de banco de dados

Um índice, no banco de dados, é um campo que serve para otimização da tabela. Por meio do uso de índices, a operação de consultar uma tabela para localizar um registro torna-se mais rápida, porque os índices criam ponteiros para dados armazenados em colunas específicas. O princípio de índice remissivo num livro – que, por meio da localização de um tópico no índice localiza-se a página onde está a informação – é usado no banco de dados quando um tabela possui índices. Índice, em banco de dados, pode ser simples ou composto e criado pelo comando CREATE INDEX. Um índice simples faz referência a somente uma única coluna; já um índice composto faz referência a duas ou mais colunas. Os campos de indexação se referem aos campos utilizados na composição do índice de uma tabela. Os índices são armazenados em uma tabela própria, que contém apenas o valor do campo de indexação e um ponteiro que faz a ligação com o registro correspondente da tabela. Os índices são atualizados automaticamente, toda vez que há alguma alteração no banco de dados.

Chaves#

As chaves são utilizadas para a identificação de um registro e para o estabelecimento de ligações entre linhas de tabelas e podem ser dos tipos primária, alternativa ou estrangeira. Essas ligações entre tabelas são chamadas relacionamento. Esses relacionamentos, por sua vez, garantem uma integridade de dados referenciais. Chaves podem ser consideradas restrições dentro da tabela. Chave primária: trata-se de um identificador único, não duplicado, não nulo, indexado e que distingue uma linha de outras em uma tabela. Exemplos: código, CPF, e-mail.

  • A chave primária, numa tabela de banco de dados, serve como um índice interno. Essa chave tem de ser indexada, não nula e não repetida. Uma chave primária é usada nos relacionamentos entre entidades para garantir uma referência de dados ou integridade referencial. Uma integridade referencial, no banco de dados, é a garantia de que o dado existe. Exemplo: nenhum produto é cadastrado sem antes se cadastrar o fornecedor desse produto. Assim, há uma garantia de que todos os produtos têm origem de um ou mais fornecedores, desde que exista um relacionamento entre a tabela produto e tabela fornecedor. Uma chave primária pode ser simples, um único campo (coluna), ou composta, diversos campos (colunas). A chave primária é criada pelo termo primary key, relacionado a um campo da tabela, exemplo, primary key (cpf). Na criação da tabela ou na alteração de uma estrutura de tabela.

  • Chave alternativa (candidata): trata-se do uso de colunas alternativas que podem ser usadas para a identificação de um registro ou sua distinção em uma tabela. Nesse caso, mais de uma coluna, ou combinações de colunas podem ser utilizadas para distinguir uma linha das demais. Exemplo: suponha uma tabela composta dos campos id, nome e CPF, sendo que id é chave primária. Nesse caso, CPF é uma chave alternativa. Chaves alternativas só são expressas na teoria.

Uma chave candidata ou alternativa é a que tem as mesmas características de uma chave primária, ou seja, um campo que pode ser indexado, não nulo e não repetido, porém não está sendo usada como chave primária. Uma chave candidata tem apenas valor teórico, pois, na prática, não é usada e nem possui qualquer valor como índice, porque não é chave primária. Exemplos de campos que podem ser chave candidata: cpf, e-mail , código.

  • Chave estrangeira: trata-se de uma coluna que estabelece uma relação com as linhas de outra tabela. Ou seja, nessa coluna, é armazenado o valor da chave primária de uma tabela na qual se deseja fazer uma ligação.

Transação#

Trata-se de um conjunto de procedimentos que são executados em um SGBD, cuja integridade está relacionada a quatro propriedades, conhecidas como ACID: Atomicidade, Consistência, Isolamento e Durabilidade. Essas propriedades são descritas por Elmasri e Navathe (2011) da seguinte forma:

  • atomicidade: está relacionada ao fato de que todas as ações que compõem uma unidade de trabalho da transação devem ser concluídas com sucesso, para que a transação possa ser efetivada. Se uma eventual falha ocorrer durante o processo, toda a transação deve ser desfeita, o que é conhecido como rollback . Por outro lado, quando todas as ações são executadas com sucesso, a transação pode então ser efetivada, o que é chamado commit . Esses comandos fazem parte da categoria de comandos de transação de dados (DTL).

  • consistência: diz respeito às regras e restrições que são de�nidas no banco de dados. Todos os relacionamentos por chave estrangeira e validação de campos devem ser obedecidos, para que a transação possa ser efetivada.

  • isolamento: as transações devem ocorrer de forma independente e nenhuma transação deve operar no mesmo sistema, pois interfere no funcionamento da transação corrente, nem mesmo visualizar os resultados parciais das operações de uma transação em andamento.

  • durabilidade: todas as alterações efetuadas em um banco de dados como resultados de uma transação são permanentes e devem persistir no banco de dados, não sendo passíveis de falha de hardware . As transações estão relacionadas à integridade das informações que são manipuladas em um SGBD. Embora não seja visível para o usuário, internamente, uma série de comandos e mecanismos de controle é executada para a garantia dessa integridade. Entretanto, trata-se de um processo custoso em termos de tempo e processamento, o que demanda maior capacidade de hardware .

Comandos de Manipulação de Dados#

A linguagem SQL é uma poderosa ferramenta para manipulação de banco de dados. As instruções DML (Data Manipulation Language) se referem ao grupo de comandos dentro da linguagem SQL responsáveis pelos processos de recuperação, inclusão, exclusão e alteração de dados em um sistema gerenciador de banco de dados. Essas operações são chamadas, popularmente, CRUD. A letra R faz referência à consulta. Alguns dos comandos relacionados às transações em banco de dados são: INSERT, UPDATE e DELETE.

Inserção de registros#

Para a inserção de registros em uma tabela, utiliza-se o comando INSERT, que tem a seguinte sintaxe: INSERT INTO nome_tabela (lista-de-campos) VALUES (lista-de-dados). Para inserir um novo registro numa tabela de nome alunos, escreve-se: INSERT INTO aluno(codigo, nome, sexo, nascimento) VALUES (“004”, ”Roberta”, ”F”, 10/04/1995).

Alteração de registros#

Para a alteração de registros em uma tabela, utiliza-se o comando UPDATE, que tem a seguinte sintaxe: UPDATE nome_tabela SET CAMPO = “novo-valor” WHERE condição. Para alterar o nome do aluno de código de matrícula número 001 de José para Manoel, na tabela de chamada de alunos, escreve-se: UPDATE aluno SET NOME = “Manoel” WHERE CODIGO=”001”.

Exclusão de registros#

Para a exclusão de registros em uma tabela, utiliza-se o comando DELETE, que tem a seguinte sintaxe: DELETE FROM nome_tabela WHERE condição. Para excluir o registro do aluno de código de matrícula número 02 na tabelade alunos, escreve-se: DELETE FROM aluno WHERE CODIGO=”002”. Em todos os comandos INSERT, DELETE E UPDATE, a operação é unilateral, ou seja, escrita ou manipulação diretamente no banco. Essas operações não possuem retorno de informação do banco. O gerenciador somente sinaliza que a operação foi bem-sucedida ou não. Ao contrário de um operação DQL (Data Query Language) ou operação de consultas com select . Essa operação sempre retornará um conjunto de informações chamado recordset (PUGA;FRANÇA; GOYA, 2014). Aprendemos sobre as transações em um SGBD, agora, nosso estudo prossegue com outro tópico importante: o controle de concorrência.