4D v16.3

Tipos de relações

Página Inicial

 
4D v16.3
Tipos de relações

Tipos de relações  


 

 

O tipo de relação mais comumente usado é a relação entre uma tabela Muitos e uma tabela Um, chamada relação Muitos para Um. Entretanto, também pode criar relações Muitos a Muitos e Um a Um. Todas as relações podem ser manuais ou automáticas.

As relações podem ser automáticas ou manuais.

Em uma relação automática, quando um registro em uma tabela relacionada se converte no registro atual, 4D seleciona o(s) registro(s) correspondentes. Estes registros especificados podem ser visualizados, impressos, modificados, ou utilizados para realizar pesquisas e ordenações. Não é necessário utilizar programação.

Em uma relação manual, você pode exercer controle sobre a carga em memória dos registros correspondentes por parte de 4D. Para exercer este controle é necessário utilizar métodos. Para maiores informações sobre a criação de métodos que controlem tabelas relacionadas, consulte o Manual de Linguagem 4D.
 

É possível utilizar uma relação manual se você deseja otimizar o rendimento de aplicações especificas que não necessitem carregar todos os registros correspondentes de uma vez. Por exemplo, se sua estrutura relaciona 3 ou mais tabelas, você poderia querer controlar quando carregar os registros relacionados em memória. É possível utilizar uma relação manual se você deseja relacionar duas tabelas com duas relações diferentes. Só pode existir uma relação automática entre duas tabelas, enquanto que o número de relações manuais entre duas tabelas não tem limite.

Ao criar uma relação entre duas tabelas, a tabela que contém a chave primária na relação é chamada de tabela Um e a tabela contendo a chave estrangeira na relação é chamada de tabela Muitos. As tabelas se denominam Um e Muitos porque em um registro da tabela Um está relacionado com muitos registros da tabela Muitos e muitos registros da tabela Muitos estão relacionados com um registro da tabela Um. Este tipo de relação é denominado relação Muitos para Um.

Em uma relação entre empregados e empresas, a tabela [EMPRESAS] é a tabela Um e a tabela [EMPREGADOS] é a tabela Muitos. O registro de uma empresa está relacionado com vários empregados (todos os empregados desta empresa) e vários empregados estão relacionados com uma empresa (a empresa para qual trabalham). Por exemplo, pode haver um registro correspondente a empresa Acme na tabela [EMPRESAS] e vários registros de pessoas empregadas por Acme na tabela [EMPREGADOS].

Quando um registro da tabela [EMPREGADOS] se converte no registro atual, 4D carrega o registro correspondente da tabela [EMPRESAS]. Se alguns campos foram incluídos a partir da tabela [EMPRESAS], os valores destes campos são publicados automaticamente.

A imagem a seguir mostra como o nome da empresa em um registro da tabela [EMPREGADOS] especifica um registro da tabela [EMPRESAS] de maneira que o registro da tabela [EMPREGADOS] pode exibir o endereço e o número telefônico da empresa.

Por outro lado, quando um registro da tabela [EMPRESAS] se converte no registro atual, 4D cria uma seleção de registros da tabela [EMPREGADOS] e os exibe no formulário. Como a relação especifica diversos registros na outra tabela, os nomes e cargos de muitos empregados podem ser exibidos. Somente registros atualmente exibidos no formulário estão carregados na memória.

A imagem a seguir mostra como o nome de uma empresa em um registro da tabela [EMPRESAS] especifica vários registros da tabela [EMPREGADOS] de maneira que o registro da tabela [EMPRESAS] possa mostrar uma lista de pessoas empregadas por esta empresa.

A diferença entre a tabela Um e a tabela Muitos é própria de cada relação. Uma tabela pode ser a tabela Um em uma relação e pode ser a tabela Muitos em outra relação. Uma tabela em uma relação só necessita ter uma chave primária, mas pode ter várias chaves estrangeiras.

Por exemplo, suponha que você decide enviar um pacote de mercadoria de amostra para todas as pessoas da tabela [EMPREGADOS]. Você adiciona uma tabela [Tarifa_Postal] que contém os códigos postais e a tarifa postal para cada código postal. O uso desta estrutura lhe permite imprimir as etiquetas para cada pessoa, incluindo o valor para enviar o pacote. A imagem abaixo mostra a tabela [Tarifa_Postal] adicionada à estrutura do banco de dados.



O campo Código_Postal da tabela [CODIGOS_POSTAIS] é a chave primária, assim que nesta relação, a tabela [Tarifa_Postal] é a tabela Um. O campo CodigoPostal na tabela [EMPRESAS] é a chave estrangeira para esta relação: neste caso, podem ter valores duplicados para empresas que estão em uma mesma área. A tabela [EMPRESAS] é então a tabela Muitos para a relação com a tabela [CODIGOS_POSTAIS].

Uma tabela é uma tabela Um ou Muitos dependendo da relação com a outra tabela. A tabela [EMPRESAS] é a tabela Muitos na relação com a tabela [CODIGOS_POSTAIS] e é a tabela Um na relação com a tabela [EMPREGADOS].

As relações Um a Um são utilizadas apenas em casos especiais, já que as tabelas relacionadas por esse tipo poderiam ter sido combinadas em uma só tabela.

Algumas das razões para utilizar relações Um a Um são:

  • Seu banco tem dados de tipo Texto, Imagem ou BLOB muito grandes. Estes campos poderiam fazer com que o banco de dados fique lento se são  carregados na memória quando um registro é convertido no registro atual. Ao colocar os textos, imagens, ou BLOBS em outra tabela, pode carregar na memória apenas os dados de que necessita, e dessa forma otimizar o funcionamento do banco.
  • Seu banco contém um número muito grande de campos e necessita dividir os campos em grupos lógicos. As tabelas separadas podem tornar o banco de dados mais rápido e fácil de usar.
  • Para limitar o acesso a certos campos. Utilizando tabelas separadas, pode atribuir diferentes privilégios de acesso para cada tabela.

Algumas vezes, é necessário relacionar muitos registros em uma tabela com muitos registros em outra tabela. Este tipo de relação é conhecida como relação Muitos para Muitos.

Um exemplo de uma relação Muitos para Muitos é um banco de dados que faz o acompanhamento das matrículas de estudantes. Imagine que este banco tem duas tabelas: [Estudantes] e [Matérias]. Um estudante pode se inscrever em várias matérias e uma matéria pode ter vários estudantes. Você deseja ver as matérias em que o estudante se matriculou e todos os estudantes matriculados em uma matéria.

Outros exemplos de relações Muitos para Muitos são:

  • [Fornecedores] e [Produtos]: cada fornecedor fornece diferentes produtos e cada produto pode ser fornecido por diferentes fornecedores.
  • [Empregados] e [Contas]: cada empregado trabalha em diferentes contas e cada conta pode ser utilizada por diferentes empregados.
  • [Filmes] e [Atores]: cada filme reúne diferentes atores e cada ator pode participar de diferentes filmes.


É possível utilizar 4D para criar automaticamente relações Muitos para Muitos. A chave é criar uma tabela intermediária relacionada a outras tabelas utilizando relações Muitos para Um. Logo é possível criar os formulários de entrada e saída para controlar o acompanhamento e visualização de dados.

Esta seção descreve o uso das relações automáticas para administrar uma relação Muitos para Muitos.

A imagem a seguir mostra o banco de dados de inscrições com três tabelas, [ESTUDANTES], [MATERIAS] e [MATRÍCULAS]. Esta seção utiliza a estrutura deste banco de dados para explicar como funcionam as relações Muitos para Muitos.



A tabela [ESTUDANTES] é uma tabela Um. Contém um registro por cada estudante, incluindo seu nome, sobrenome e média escolar. Seu Código de Estudante o o identifica de maneira única.

A tabela [MATÉRIAS] também é uma tabela Um. Contém um registro para cada matéria, incluindo o nome da matéria e o professor. O campo Código da Matéria identifica cada matéria de maneira única.

Uma tabela intermediária, a tabela [MATRÍCULA], é a tabela Muitos para as outras duas tabelas. Contém registros de vários estudantes e matérias. Os formulários desta tabela são utilizados para entrada e exibição de dados de outras duas tabelas.

O uso de três tabelas assegura que os dados sejam armazenados eficientemente. O registro completo de um estudante só é armazenado uma vez. Os registros que relacionam os estudantes e as classes são armazenados uma vez por cada inscrição. Toda a informação está disponível em qualquer combinação.

É utilizada uma tabela intermediária, neste exemplo a tabela [MATRICULAS], para introduzir e mostrar informação das outras duas tabelas. Cada registro introduzido na tabela [ESTUDANTE_MATERIA] está relacionado com as outras tabelas (ESTUDANTES e MATERIAS). Os registros da tabela [MATRICULAS] só contém as duas partes de informação que estabelece a relação: a identificação do estudante e o nome da matéria.

Este é um exemplo de um registro que está sendo introduzido na tabela [MATRICULAS]:


Este registro indica que o estudante José da Silva está inscrito na classe de programação avançada. Este registro combina informação da outras duas tabelas.

Um registro similar existe por cada matéria na qual o estudante haja feito inscrição. Na tabela [MATRICULAS] só estão armazenados os campos de identificação do estudante e o nome da matéria. Cada registro indica a inscrição de um estudante em particular a uma matéria específica.

Nota: Quando um registro da tabela [MATRICULAS] é carregado (como durante sua criação), é criado automaticamente uma seleção de registros nas tabelas relacionadas. A seleção está composta pelos registros de estudantes e matérias correspondentes. Ao abrir cada uma das outras tabelas, você constatará que só se mostra um registro. Para mostrar todos os registros, selecione Exibir todos no menu Pesquisas.

O formulário de entrada para este registro é mostrado a seguir. Note que contém campos das tabelas [ESTUDANTES] e [MATERIAS].

Os dados são introduzidos unicamente nos campos de identificação do estudante e da matéria. Quando se introduz a identificação de um estudante, 4D busca a informação do estudante na tabela relacionada [ESTUDANTES] e a exibe nos campos Sobrenome e Nome. Igualmente, quando se introduz a identificação da matéria, 4D busca a informação na tabela relacionada [MATERIAS] e a exibe no formulário de entrada.

É possível exibir informação destas três tabelas utilizando sub-formulários. No registro do estudante, é possível exibir todas as matérias nas quais está inscrito. É possível exibir todos os estudantes inscritos em uma classe particular a partir do registro da classe..

Para mostrar a lista de matérias no registro de um estudante, utilize um sub-formulário. Para maiores informações sobre a criação de sub-formulários, consulte a seção Criar e definir um subformulário.

O registro da imagem anterior está na tabela [ESTUDANTES]. É exibida a informação do estudante na parte superior, e o sub-formulário na parte inferior mostra a informação das matérias inscritas, trazida da tabela [MATRICULAS].

Note que o sub-formulário corresponde à tabela [MATRICULAS], não à tabela [MATERIAS]. A tabela [MATRICULAS] contém os registros que conectam os dados do estudante com os dados das matérias. Os sub-formulários contém o campo Nome da matéria [MATERIAS]. Devido à relação entre as tabelas [MATRICULAS] e [MATERIAS], 4D pode mostrar o nome da matéria automaticamente.

Este é um exemplo de um registro que exibe a lista de estudantes matriculados em uma classe:

Este é um registro da tabela [MATERIAS]. Exibe informação da matéria e a lista de estudantes inscritos. A informação dos estudantes também é trazida da tabela [MATRICULAS], que contém os registros que relacionam as classes com os estudantes inscritos nelas.

Nos exemplos anteriores de sub-formulários, você pode introduzir dados em todos os campos exibidos. Por exemplo, para introduzir o registro de um novo estudante, coloque o cursor no último registro do sub-formulário e pressione as teclas Ctrl + Shift + /: (Windows) ou Comando+ Shift + / (Mac OS) para criar um novo registro (você pode mudar o atalho em Propriedades do Banco de dados, consulte ). Quando introduzir o nome da matéria, o resto da informação é introduzido automaticamente no registro.

As relações estabelecidas em um banco de dados têm um papel muito importante no funcionamento do banco controlando o fluxo de dados entre as tabelas.

Se um registro com uma relação automática é carregado em um formulário de entrada, os registros da tabela relacionada correspondente serão selecionados. Se a relação seleciona somente um registro em uma tabela relacionada, esse registro será carregado a partir do disco. Se a relação faz referência a vários registros, uma nova seleção atual de registros será criada para esta tabela e será carregado o primeiro registro dessa seleção. O registro que é carregado se chama registro atual da tabela.

Nos exemplos deste capítulo, foram definidas relações entre não mais que três tabelas. Em realidade, com freqüência se definem relações entre várias tabelas e se ativa uma relação, 4D cria uma seleção de registro na tabela relacionada e carrega um registro. O registro carregado é convertido no registro atual para a tabela e se a tabela tem uma relação automática, 4D cria uma nova seleção na tabela seguinte da cadeia, e assim por diante.

Se as relações das tabelas não foram definidas cuidadosamente, o fluxo de informação entre as tabelas pode chegar a ser desordenado ou incorreto. Os casos a seguir ilustram estruturas relacionais as quais é necessário prestar muita atenção.

 

Uma relação circular é um conjunto de relações definidas de maneira que a transferência de dados forme um loop indefinidamente. A imagem a seguir lhe mostra uma relação circular na qual a tabela [EMPREGADOS] está relacionada a tabela [EMPRESAS], que por sua vez está relacionada a tabela [SEGURADORA], que volta a se relacionar com a tabela [EMPREGADOS].

 

Quando um registro da tabela [EMPREGADOS] é carregado, 4D carrega o registro correspondente da tabela [EMPRESAS]. Este registro é convertido no registro atual da tabela [EMPRESAS], o que implica a carga do registro relacionado da tabela [SEGURADORA]. 

Se as relações tivessem permissão para continuar, os registros relacionados com esta seguradora (todas as pessoas asseguradas pela empresa) seriam selecionadas na tabela [EMPREGADOS] e o primeiro registro dessa seleção se converteria no registro atual. Observe que este registro atual pode ser diferente ao registro atual que tinha inicialmente quando se iniciou a progressão. Neste caso, 4D não tem como saber qual o verdadeiro registro atual.

Quando 4D encontra este tipo de relações circulares, as relações entre as tabelas são detidas na última tabela na última tabela na cadeia. Neste caso, a relação entre as tabelas [SEGURADORA] e [EMPREGADOS] não é realizada.

Um conflito similar entre registros atuais ocorre se existe mais de um link a mesma tabela.

Como não é possível ter mais de um registro atual por vez, não é possível controlar uma relação automática na qual duas ou mais tabelas estão relacionadas com a mesma tabela.

A imagem a seguir mostra uma estrutura de banco de dados na qual uma tabela e sua sub-tabela estão relacionadas com a mesma tabela.

Quando um usuário está trabalhando com um registro da tabela [EMPREGADOS], o registro relacionado da tabela [SEGURO] é carregado e se converte no registro atual para esta tabela.

Entretanto, também existe uma relação entre a sub-tabela [BENEFICIARIOS] e a tabela [SEGURO]. Isto significa que outro registro relacionado é carregado na tabela [SEGURO] de acordo com o sub-registro atual da tabela [BENEFICIARIOS] (o primeiro registro da seleção atual). Se a empresa asseguradora dos beneficiários é diferente a de seus pais, esta estrutura relacional causará problemas. Neste caso, 4D não detém a execução das relações. Ambas as relações são executadas, mas não ao mesmo tempo.

Se você deseja utilizar uma estrutura deste tipo, deve utilizar relações manuais e controlar as relações utilizando os comandos descritos no Manual de linguagem de 4D.


Outro exemplo de uma estrutura relacional que não pode ser controlada com relações automáticas é a de uma estrutura na qual uma tabela tem mais de uma relação com outra tabela. Cada vez que um usuário modifique um dos campos relacionados na tabela 1, o registro atual da outra tabela Muitos vai ser alterado. Neste caso, você não pode saber que relação esta sendo ativada.

Como existe um registro atual em cada tabela, as relações não estão estabelecidas para todos os registros de uma seleção. Observemos por exemplo o banco de faturamento que é exibido a seguir:

Quando um registro da tabela [FATURAS] é utilizado, é criada uma seleção de registros na tabela [LINHA_FATURA] que contém todas as linhas para esta fatura. Só é carregado o registro da tabela [ITENS] correspondente ao primeiro registro da tabela [LINHA_FATURA]. A seleção atual da tabela [ITENS] não contém informação sobre todos os objetos da fatura, só sobre o primeiro objeto da fatura.

Entretanto, se você coloca a tabela [LINHA_FATURA] em um sub-formulário na tabela [FATURAS], 4D chama cada uma das linhas de faturamento e ativa a relação para cada uma delas.
 

 
PROPRIEDADES 

Produto: 4D
Tema: Criar uma estrutura de banco de dados

 
HISTÓRIA 

 
ARTICLE USAGE

Manual de Desenho 4D ( 4D v16)
Manual de Desenho 4D ( 4D v16.1)
Manual de Desenho 4D ( 4D v16.3)