Regras para o desenho de tabelas | Parte 3

Depois de vermos a importância das chaves primárias, na terceira parte das regras para o desenho de tabelas vamos ver como elas se relacionam entre si. É essa associação entre os dados armazenados em duas ou mais tabelas que dá forma a uma base de dados relacional. Um grupo de tabelas isoladas, como que ilhas - sem vista entre si - num vasto oceano, não passa de uma tulha de dados com pouco ou nenhum interesse para os processos de tomada de decisão.

Como se faz então essa associação entre tabelas?

Essa conexão faz-se através do que se designa como chave estrangeira, que consiste numa ou mais colunas de uma tabela que são provenientes de outra tabela, conhecida como tabela-pai ou tabela de origem. São essas colunas em comum que permitem relacionar os dados entre si. Uma chave estrangeira diz-se simples quando consiste numa única coluna, e composta quando é formada por duas ou mais colunas.

No esquema Cinema retratado na Figura 1 a tabela Actores do Filme tem duas chaves estrangeiras:
  • a coluna Filme proveniente da tabela Filme e da coluna Título do Filme, em notação técnica seria Filme.Título do Filme, i.e., nome_da_tabela.nome_da_coluna;
  • e a coluna Actor com origem na coluna Nome do Actor da tabela Actor.


Figura 1: Esquema Cinema.

Então a tabela Actores do Filme tem duas chaves estrangeiras (simples). Por sua vez o conjunto destas duas colunas constitui a chave primária da tabela, ou seja, são os valores simultâneos nas duas colunas os únicos que asseguram a regra da integridade da tabela. Caso se escolhesse, e.g., a coluna Filme como chave primária então haveria apenas a hipótese de cada actor durante toda a sua vida artística participar numa única película. Por outro lado, e considerando o último exemplo, sendo as chaves primárias das tabelas Actores do Filme e Filme as mesmas então isso implicaria que seriam uma e a mesma tabela.

Regras para o desenho de tabelas | Parte 2

É muito comum que, no momento de declarar a chave primária de uma tabela, não haja a mínima preocupação com a compreensão do seu contexto no âmbito do processo de negócio, e seja atribuída uma chave primária com valor abstracto e com o formato numérico. Veja-se o exemplo da tabela Género da Figura 1 em que se utiliza o campo GéneroID como chave primária e.g., o género "Comédia" tem o código "11". 


Figura 1: Tabela Género com uma chave primária abstracta "GéneroID".

Mas na realidade no sistema real não existe nenhuma classificação numérica para os géneros dos filmes. No mundo do cinema as comédias não têm um código "11". Em todas as situações em que num sistema não existam códigos identificadores verdadeiros/reais então o mesmo tem que acontecer nas bases de dados que os modelam. Assim, a tabela Género correctamente desenhada, terá apenas uma coluna a qual será obviamente igualmente chave primária (Figura 2).


Figura 2:  Tabela Género num formato normalizado.

Os sistemas não são todos iguais e há alguns em que existem conjuntos de entidades em que os seus elementos se diferenciam por códigos, ou seja, por valores numéricos ou alfa numéricos, que são reconhecidos por todos os participantes do sistema, Por exemplo, os alunos têm números, aos contribuintes são-lhes atribuídos números de identificação fiscal, ou cada viatura automóvel tem a sua própria matrícula.

MySQL | Denominações CASE SENSITIVE

A variável lower_case_table_names condiciona a forma como o servidor de MySQL armazena e gera os nomes dos objectos da base de dados, comparando os nomes entre si e com os comandos produzidos pelos utilizadores.

Por defeito, e.g., em Windows e de modo a assegurar uma melhor interoperabilidade entre bases de dados instaladas em diferentes computadores e sistemas operativos, o valor dessa variável é "1", o que significa que todos os nomes são guardados em letra minúscula.

Para optimizar a gestão, utilização e desenho de interfaces é aconselhável que as denominações dos objectos, por exemplo tabelas e colunas, de uma base de dados sejam definidos como case sensitive. Desse modo quando se geram, e.g., mapas impressos ou ecrãs deixa de ser necessária a tarefa repetitiva de alterar as letras iniciais das denominações para letra maiúscula. Por exemplo: "número de aluno" para "Número de Aluno". Pode parecer um pormenor mas em centenas de ecrãs serão largas dezenas de horas de programação que serão poupadas.

Ao optar pelo valor "0" os nomes são guardados e comparados na forma como foram escritos; caso a variável assuma o valor "1" as denominações são armazenadas em letra minúscula e as comparações não dependem das letras serem maiúsculas ou minúsculas; se o valor for "2" os nomes são guardados como foram escritos, mas são sempre comparados em letra minúscula.

Como se altera este parâmetro?

O método mais simples e expedito é utilizar o ficheiro de configuração "my.ini" que o servidor lê cada vez que é inicializado. Basta alterar a variável lower_case_table_names para o valor pretendido (caso a variável não esteja presente então deve ser adicionada ao fim do referido ficheiro). Finalmente, é ainda necessário re-inicializar o servidor de MySQL. Em Windows, e numa instalação padrão, esse ficheiro está localizado em "C:\ProgramData\MySQL\MySQL Server X\my.ini"; em que X deve ser substituído, caso a caso, pelo número da versão de MySQL.


__________________________________________________
Nota: Em MacOS a variável tem o valor pré-definido de "2", e em Unix é de "Ø".