Menu de vídeos

2. Conceitos básicos sobre banco de dados

Esta aula faz parte de um curso em acervo. * O suporte não é garantido para cursos em acervo

Conceitos básicos sobre banco de dados

Um banco de dados é uma coleção de tabelas inter-relacionadas, onde cada tabela armazena dados específicos. Banco de dados funciona como um contêiner de objetos, onde além de armazenar as tabelas e seus dados, pode conter índices e outros objetos para ajudar no gerenciamento dos dados.

Tabelas

O principal objeto de um banco de dados relacional é a tabela (Table). Um banco de dados pode conter diversas tabelas armazenadas, onde essas tabelas podem se relacionar entre si, contendo a habilidade de relacionar informações entre diferentes tabelas. Uma tabela é uma matriz de duas dimensões contendo colunas e linhas (Figura 2.1).

 

 

image001b.gif

 Figura 2.1. Tabela em um banco de dados relacional

Cada tabela do banco de dados é formada por linhas e colunas, onde cada coluna diz respeito a um campo da tabela e cada linha a um registro.

Colunas

Uma tabela pode ter uma ou mais colunas (Columns). Em um modelo relacional cada coluna é chamada de atributo. Em um banco de dados, uma coluna pode ser chamada também de campo (Field). Cada coluna pode armazenar um tipo diferente de dados. Normalmente a partir do nome dado a coluna, podemos identificar o tipo de dados armazenados nela. Como cada coluna pode armazenar um tipo diferente de informação, ela pode ser definida como um determinado tipo (Type).

Em um banco de dados relacional, uma coluna pode ser criada com diversos tipos diferentes, como texto, número, data, hora etc. Ao definir uma coluna como do tipo data (Date), por exemplo, os valores a serem armazenados nessa coluna serão validados para serem salvos sempre com o formato de uma data. Os dados contidos em cada coluna de um banco de dados relacional precisam ser consistentes de acordo com o tipo definido a cada coluna.

Em cada “célula” de uma coluna é permitida apenas uma instância de um determinado valor, por exemplo, você não pode criar uma tabela Cliente com uma coluna Telefone e armazenar mais do que um número de telefone para cada cliente dentro dessa coluna. Alguns usuários resolvem esse “problema” criando várias colunas para armazenar os telefones de cada cliente. Veremos nesse capítulo ainda, que esse tipo de solução gera vários outros problemas.

Em um banco de dados relacional o melhor caminho é criar uma nova tabela para armazenar os telefones de cada cliente cadastrado na tabela Cliente e fazer uma ligação entre as duas tabelas, criando um relacionamento do tipo um-para-muitos, isso é, um cliente pode ter vários telefones.

Linhas

Uma tabela pode conter várias linhas, onde cada linha representa um registro dessa tabela. Cada linha de uma tabela de um banco de dados relacional representa a instância dos dados de cada coluna trazendo os valores armazenados em cada atributo da tabela.

Em uma tabela de Clientes, por exemplo, uma linha traz diversas informações sobre um cliente específico e somente um Cliente. Em uma tabela de um modelo seqüencial linhas duplicadas não são permitidas, isso é, duas linhas trazendo as mesmas informações em todas as colunas da tabela.

Nota: A ordem física das colunas ou linhas é irrelevante no que diz respeito ao acesso aos dados. Em um banco de dados de dados relacional, você pode acessar qualquer linha ou coluna na ordem que quiser, independente da forma como estão armazenadas dentro do banco.

 Para manter a integridade das informações salvas nas tabelas de um banco de dados, são utilizados diversos Constraints diferentes, como Primary Key, Foreign Key, Check, Index e Unique. 

Chave Primária

Uma chave primária descreve a identificação única de cada registro dentro de uma tabela do banco de dados. Para que possamos garantir que cada linha de uma tabela contenha informações únicas, sem duplicidade, utilizamos as chaves primárias (Primary Key). Em uma tabela relacional uma ou mais colunas devem ser usadas para identificar unicamente cada linha.

Essa(s) coluna(s) é conhecida como Primary Key. Para que essa coluna possa identificar unicamente cada linha da tabela, ela precisa sempre ser preenchida, isso é, essa coluna é requerida (obrigatória). Caso uma tabela possua mais do que uma coluna definida como chave primária, então todas essas colunas são de preenchimento obrigatório formando o que chamamos de chave primária composta.

Principais características de uma chave primária:

·         Uma chave primária nunca pode ser nula, isso é, sempre precisa ter uma valor armazenado;

·         Uma chave primária pode ser simples (uma coluna) ou composta (duas ou mais colunas);

·         Uma chave primária pode ser de qualquer tipo, como numérico, data, texto, etc;

·         Chaves primárias protegem contra o armazenamento de valores duplicados dentro da tabela;

·         Uma chave primária identifica unicamente cada registro (linha) de uma tabela relacional;

·         Chaves primárias automaticamente são definidas como índices.

Em um banco de dados relacional, teoricamente todas as suas tabelas precisam ter uma chave primária definida para manter a integridade das informações armazenadas dentro delas. Caso uma informação duplicada tente ser inserida em uma tabela que possua chave primária definida um erro de violação de chave é gerada pelo banco de dados e a informação não é armazenada na tabela.

Veja um exemplo de definição de chave primária na Figura 2.2.

 image003.jpg

Figura 2.2. Tabela de clientes contendo o campo Codigo definido como chave primária (Primary Key).

Repare na Figura 2.2 que a tabela de Clientes possui um campo chamado Codigo para identificar unicamente cada linha (registro) da tabela. Esse campo é o que chamamos de Primary Key.

Nota: Normalmente não utilizamos símbolos especiais na definição do nome das colunas das tabelas de um banco de dados relacional, como acentos, cedilhas e espaços, apesar de alguns sistemas de banco de dados do mercado permitir, como o Microsoft Access, por exemplo.

Um detalhe interessante a ser comentado nesse ponto, são os valores armazenados no campo Telefone na Figura 2.2. Repare que em cada registro o número do telefone é armazenado em um formato diferente. E recomendado que o valor seja formatado e validado antes de ser armazenado no campo da tabela para que possa ser recuperado sempre no mesmo formato facilitando assim sua leitura e uso.

Chave estrangeira

Uma chave estrangeira nada mais é que uma chave primária de uma tabela colocada em outra tabela do banco de dados, onde as duas chaves são relacionadas, para que os dados das duas tabelas possam ser recuperados, trazendo informações consistentes. A melhor forma de definir e explicar o uso de chaves estrangeiras (Foreign Key) é através de um exemplo prático. Nesse exemplo precisaremos armazenar informações sobre Notas Fiscais geradas por uma determinada empresa.

Em uma Nota Fiscal normalmente temos o cabeçalho trazendo informações gerais da nota, os itens e no rodapé os totais dos produtos ou serviços especificados nos itens. Em um modelo de dados relacional normalizado, devemos criar duas tabelas para armazenar essas informações, uma tabela NotaFiscal para armazenar as informações do cabeçalho da nota e uma tabela ItensNF para armazenar os itens de cada Nota Fiscal.

Nota: Podemos utilizar a própria tabela NotaFiscal para salvar as informações do rodapé da nota, ou calcular os totais e quantidades do rodapé a partir da tabela ItensNF na hora de buscar as informações.

Tanto a tabela NotaFiscal como a ItensNF deveram possuir uma chave primária para identificar cada Nota Fiscal e cada item unicamente dentro de cada tabela. Você deve estar se perguntando, mais como saber quais itens cadastrados na tabela ItensNF dizem respeito a qual Nota Fiscal cadastrada na tabela NotaFiscal?

É nesse ponto que entra o conceito de chave estrangeira. Para que possamos identificar os itens de cada Nota Fiscal devemos “replicar” os valores da chave primária da tabela NotaFiscal dentro da tabela ItensNF para que possamos relacioná-las através desses valores e buscar assim as informações. Veja o modelo de dados na Figura 2.3:

 

image005.jpg

Figura 2.3. Tabelas NotaFiscal e ItensNF utilizando Primary Key e Foreign Key para integridade das informações

Na Figura 2.3 temos o campo NumNF na tabela NotaFiscal definida como chave primária e na tabela ItensNF as colunas ItemNF e NumNF definidas como chave primária composta. No caso do campo NumNF da tabela ItensNF, além de ser uma chave primária ela também está definida como uma chave estrangeira da tabela NotaFiscal, onde nesse campo são armazenados os valores contidos no campo NumNF da tabela NotaFiscal.

Para trazer todas as informações referente a uma determinada Nota Fiscal e seus respectivos itens basta utilizar os valores armazenados nos campos NumNF de cada tabela. Por exemplo, para trazer as informações da Nota Fiscal de número 2, basta filtrar a tabela NotaFiscal trazendo a linha que contém o valor “2” em seu campo NumNF e na tabela ItensNF filtrar todas as linhas que contiverem o valor “2” em sua coluna NumNF, campo o qual está definido como chave estrangeira (Foreign Key) da tabela NotaFiscal.

Neste exemplo podemos dizer que possuímos um relacionamento do tipo mestre/detalhe, isso é, temos registros em uma tabela Mestre (NotaFiscal) que possui registros relacionados em uma tabela de detalhes (ItensNF).

Nota: O campo CodCliente da tabela NotaFiscal pode ser, ou melhor, precisa ser uma chave estrangeira da tabela Clientes para que os valores armazenados nessa coluna estejam também presentes na coluna Codigo (chave primária) da tabela Clientes.

Integridade Referencial

O conceito de chaves primárias e chaves estrangeiras são importantíssimos para a definição de um banco de dados relacional. O relacionamento entre as chaves primárias e as chaves estrangeiras são o que mantêm a integridade e consistência dos dados armazenados dentro das tabelas do banco de dados.

Uma chave primária (Primary Key) é uma ou mais colunas que garante que cada registro de uma tabela é único e seu valor nunca é vazio. Cada tabela pode ter somente uma chave primária que pode ser composta por mais de uma coluna. Normalmente, definimos as colunas chaves no momento em que criamos a tabela no banco de dados.

Nota: Você pode definir outras colunas da tabela que não são chave primária como únicas e não nulas, usando constraints como Unique e Not Null.

Uma chave estrangeira (Foreign Key) é uma ou mais colunas que fazem referência a uma chave primária de outra tabela. Essa referência garante que os valores que são armazenados nas colunas definidas como chave estrangeira, estaram presentes nas colunas definidas como chave primária da outra tabela relacionada.

Em outras palavras, em um banco de dados relacional, quando um valor é inserido em uma coluna de chave estrangeira ela é verifica se existe na coluna de chave primária a qual está relacionada, isso é o que mantêm a integridade referencial entre os dados armazenados nas duas tabelas. Existem diversas informações onde a integridade referencial é muito importante. Por exemplo:

·         Quando uma linha de uma tabela é apagada e essa contém uma chave primária que está relacionada à outra tabela, o que acontece com os registros relacionados que estão armazenados nessatabela? Como existe uma relação entre as informações armazenadas nas duas tabelas, o banco de dados não permitirá que o registro que contém a chave primária seja apagado. Um exemplo clássico seria a do exemplo da Nota Fiscal que fizemos a pouco, onde não podemos ter itens cadastrados na tabela ItensNF sem ter uma Nota Fiscal cadastrada na tabela NotaFiscal. Caso não definíssemos uma chave estrangeira para a tabela ItensNF, ao apagar as Notas Fiscais da tabela NotaFiscal, a tabela ItensNF não seria verificada para saber se aquela nota possui ou não itens relacionados a ela. Assim, seus itens ficariam “órfãos”, isso é, sem um registro pai na tabela relacionada. Você deve estar se perguntando, então para eu poder apagar uma nota fiscal em um banco de dados com integridade referencial eu preciso primeiro apagar todos os registros relacionados a ela para depois poder apagá-la? Para essas situações os bancos de dados relacionais trazem o suporte a integridade referencial em cascata, onde você pode definir sua integridade do tipo “deleção em cascata”. Dessa maneira, quando o registro da tabela mestre for apagada, automaticamente, os registros relacionados da tabela detalhe serão apagados mantendo assim a integridade das informações;

·         E quando o valor de uma coluna definida como chave primária é alterado, o que acontece com os registros relacionados com aquele valor? Nesse caso, podemos utilizar a integridade referencial com a opção de atualização em cascata, onde o banco de dados fará a atualização automática dos registros relacionados a chave primária alterada;

·         Outra situação, é a tentativa de inserção de um novo registro em uma tabela que contêm coluna definida como chave primária, onde o valor inserido não existe na coluna de chave primária relacionada. Nessa situação, o banco de dados gera um erro de integridade referencial apontando que o valor inserido na chave estrangeira não existe na chave primária relacionada.

Índices

Toda chave primária que definimos dentro de uma tabela automaticamente torna-se um índice dessa tabela. Um índice é um mecanismo usado para acelerar a busca e recuperação de dados dentro de tabelas de um banco de dados. Como usamos índices para facilitar a busca de páginas de uma revista ou livro, um banco de dados utiliza índices para fornecer um apontamento lógico para uma localização física de uma linha dentro de uma tabela do banco.

Normalmente, pesquisas realizadas em cima de índices são muito rápidas, visto que esses são muito pequenos e possuem apenas um ponteiro para localização de linhas de dados dentro da tabela. Existem muitas situações que justificam a criação e utilização de índices dentro de banco de dados.

O principal motivo, é sem dúvida alguma o ganho de performance nas pesquisas dos dados armazenados nas tabelas relacionadas. Não devemos, porém criar índices para colunas que fazem parte da integridade referencial, como chaves primárias e chaves estrangeiras, e em colunas que raramente fazem parte de pesquisas para busca de informações. Outro ponto importante é não criar índice para colunas que trazem um valor restrito e muito pequeno como, por exemplo, campo sexo, que trás apenas os valores masculino ou feminino.

Nota: Falaremos mais sobre índices no Capítulo 7 desse módulo.

Tanto o banco de dados InterBase quanto o Firebird possuem as Constraints e características explicadas nesse capítulo, onde estaremos aplicando na prática durante os exemplos do curso.


Avalie o curso
Ficou com alguma dúvida?