Mais

Criação de uma tabela de várias linhas e colunas da tabela de atributos


Estou tentando criar um índice de ruas de uma cidade. Eu tenho uma tabela que contém todos os nomes de ruas e suas referências de grade. Estou tentando criar um índice de ruas usando isso. Acho que desligar os campos indesejados deixando apenas as três colunas principais de que preciso e, em seguida, produzir isso funcionaria. Em vez disso, isso cria uma mesa muito longa. Gostaria de dividir essa tabela em colunas para poder adicioná-la aos mapas de ruas. No final, preciso de um índice parecido com este.

Esse é o objetivo final. Se houver uma maneira de usar o python, também estou disposto a tentar isso. Isso agora é criado por polilinhas e um polígono branco no fundo e uma camada de anotação para o texto. Tudo feito à mão. Eu preciso automatizá-lo para que uma vez que uma nova entrada seja feita, o usuário não precise criar e inserir uma nova anotação e criar o tamanho correto de uma tabela.

Estou usando o ArcGIS 10.3 em um computador Windows 7. Deixe-me saber se alguma informação adicional for necessária.


Não acredito que haja alguma maneira de obter o layout que você está buscando com uma tabela nativa no ArcMap.

Existe uma abordagem alternativa que pode ser mais fácil de manter e que é usar o Excel.

  1. Crie sua tabela de 12 colunas conforme mostrado no exemplo acima usando o Excel.
  2. Salve este documento.
  3. Em Layout, insira um Objeto, certifique-se de estar criando a partir de um arquivo e que o Link esteja marcado

O passo 1 é realizado copiando a tabela original para o Excel e VOCÊ dividindo-a manualmente em 12 colunas (ou o que quiser). Você precisa dividi-la, pois, pelo que sei, não existe uma maneira automática de organizar a mesa como você deseja.

Como você o escolheu para ser um Link, qualquer adicional as edições no documento Excel serão refletidas na tabela inserida em seu Layout.


Eu criei um índice de ruas como o seu problema. Programas de AML da velha escola de volta ao dia (2000). Um mapa como um atlas rodoviário com o índice das ruas à direita. Isso ainda pode ser feito em GIS e Python. Eu recomendaria trabalhar nesta edição uma parte de cada vez. Você pode usar o Excel, mas como você está trabalhando em GIS seria melhor se você criar um arquivo geodatabase FGDB com todos os dados. Eu usaria apenas python para todo o processo, mas uma combinação de ArcMap e Python funcionará.

Primeiro, crie uma tabela com nomes de ruas exclusivos.

Em segundo lugar, adicione colunas conforme necessário. Esta tabela irá capturar todas as iterações. Exemplo: prefixo da rua, nome da rua, tipo de rua, sufixo da rua, nome da rua completo (N Main St, Main St N ...), Grids - g1, g2, g3, etc. (eu adicionaria 10 números de grade), contador para capturar quantas grades adicionadas a esse nome de rua exclusivo.

Terceiro, use a rua contra a grade FC, o que você faz é recortar e, em seguida, iterar por cada uma dessas ruas recortadas e adicionar o número da grade à tabela com uma instrução select.

Assim, suas ruas recortadas da grade, iterar em cada rua naquele subconjunto, selecionar o nome da rua exclusivo na tabela, calcular valores Você usaria a coluna do contador (stcntr + = 1) para calcular a coluna de grade correta.

Exemplo: N Main St, A, B, ,,,,,,,, 2 e todas as outras colunas que você adicionou. N Main St, Grid A, Grid B, com 2 iterações

Quarto, depois de todas as iterações, você passará pela tabela de nomes de ruas exclusivos para criar outra tabela.

Esta seria a tabela final e a mais difícil de configurar devido ao código específico. Exemplo, N Principal St GA-GE, GW, GX Exemplo, GA-GE (GA, GB, GC, GD, GE e depois GW e GX).

Você precisaria escrever código para classificar ou capturar A, B, C ... Depois de configurá-lo, o processo final é da tabela (dados brutos) para a tabela final.

A próxima etapa é adicionar o índice ao mapa. Usei a configuração de duas colunas e copie e cole. É um processo manual para mantê-lo atualizado e adicionei novas ruas mensalmente ou conforme necessário.


As instruções CREATE podem ser executadas com o método executeSql () de TableEnvironment. O método executeSql () retorna & lsquoOK & rsquo para uma operação CREATE bem-sucedida, caso contrário, lançará uma exceção.

Os exemplos a seguir mostram como executar uma instrução CREATE em TableEnvironment.

As instruções CREATE podem ser executadas com o método executeSql () de TableEnvironment. O método executeSql () retorna & lsquoOK & rsquo para uma operação CREATE bem-sucedida, caso contrário, lançará uma exceção.

Os exemplos a seguir mostram como executar uma instrução CREATE em TableEnvironment.

As instruções CREATE podem ser executadas com o método execute_sql () de TableEnvironment. O método execute_sql () retorna & lsquoOK & rsquo para uma operação CREATE bem-sucedida, caso contrário, lançará uma exceção.

Os exemplos a seguir mostram como executar uma instrução CREATE em TableEnvironment.

As instruções CREATE podem ser executadas em SQL CLI.

Os exemplos a seguir mostram como executar uma instrução CREATE no SQL CLI.


1 resposta 1

distinto é NÃO uma função. Sempre opera em tudo colunas do resultado.

A diferença entre selecionar distinto (foo), bar e selecionar distinto foo, bar é a mesma que a diferença entre selecionar (foo), bar e selecionar foo, bar. O parêntese é apenas "ruído".

Quando você escreve select (foo, bar), você está na verdade criando um tipo de registro anônimo no Postgres que resulta em uma única coluna com dois atributos - que não é o que você realmente deseja.

Como você está usando o Postgres, você pode usar o operador (proprietário) DISTINCT ON que - em contraste com o padrão DISTINCT - faz operar em um subconjunto das colunas.

Vocês ter para especificar um ORDER BY nesse caso para definir qual das linhas tomar se houver mais de uma com a mesma combinação de (campo1, campo2).

Se você quiser manter o ANSI SQL, precisará de uma função de janela para isso:

Para uma tabela grande, DISTINCT ON é provavelmente mais rápido do que a solução com a função de janela.


Usando JSON e PostgreSQL

Acho que você está tornando isso mais difícil do que o necessário e será mordido por isso mais tarde. Você não precisa do modelo de valor de atributo de entidade, a menos que você realmente precise do EAV.

Não há absolutamente nada de errado com esse esquema.

Agora você pode consultá-lo usando uma junção simples

E qualquer um dos operadores JSON funciona em uma cláusula where.

Como uma observação lateral, não coloque os urls no banco de dados. Eles mudam com o tempo. Simplesmente crie uma função que os leve.

como queiras. Se estiver usando PostgreSQL, você pode até usar hashids.

Também digno de nota especial, jsonb é armazenado como binário (portanto, o -'b ') e também pode ser indexado, ou SARG ou qualquer outra coisa que as crianças legais o chamam atualmente: CRIAR ÍNDICE NAS marcas USANDO gin (atributos)

A diferença aqui está na simplicidade da consulta.

Dê-me todas as roupas da marca 2

Dê-me todas as roupas que tenham o atributo: Tamanho

Que tal um diferente ..

Dê-me todas as roupas e atributos de qualquer roupa disponível em tamanho grande.

O que você está descrevendo é, pelo menos em parte, um catálogo de produtos. Você tem vários atributos comuns a todos os produtos. Eles pertencem a uma tabela bem normalizada.

Além disso, você tem uma série de atributos que são específicos da marca (e espero que possam ser específicos do produto). O que seu sistema precisa fazer com esses atributos específicos? Você tem uma lógica de negócios que depende do esquema desses atributos ou está apenas listando-os em uma série de pares "rótulo": "valor"?

Outras respostas estão sugerindo o uso do que é essencialmente uma abordagem CSV (seja JSON ou ARRAY ou outro) - essas abordagens renunciam ao tratamento regular do esquema relacional movendo o esquema dos metadados para os próprios dados.

Há um padrão de design portátil para isso que se ajusta muito bem aos bancos de dados relacionais. É EAV (entidade-atributo-valor). Tenho certeza que você já leu em muitos, muitos lugares que "EAV é o Mal" (e é). No entanto, há um aplicativo específico em que os problemas com o EAV não são importantes: os catálogos de atributos de produtos.

Todos os argumentos usuais contra o EAV não se aplicam a um catálogo de recursos do produto, uma vez que os valores dos recursos do produto geralmente são apenas regurgitados em uma lista ou o pior caso em uma tabela de comparação.

Usar um tipo de coluna JSON leva a sua capacidade de impor quaisquer restrições de dados do banco de dados e força-as na lógica do seu aplicativo. Além disso, usar uma tabela de atributos para cada marca tem as seguintes desvantagens:

  • Ele não escalará bem se você eventualmente tiver centenas de marcas (ou mais).
  • Se você alterar os atributos permitidos em uma marca, terá que alterar a definição de uma tabela em vez de apenas adicionar ou remover linhas em uma tabela de controle de campo de marca.
  • Você ainda pode acabar com tabelas pouco povoadas se a marca tiver muitos recursos potenciais, dos quais apenas um pequeno subconjunto é conhecido.

Não é especialmente difícil recuperar dados sobre um produto com recursos específicos da marca. É indiscutivelmente mais fácil criar um SQL dinâmico usando o modelo EAV do que usando o modelo de tabela por categoria. Na tabela por categoria, você precisa de reflexão (ou seu JSON) para descobrir quais são os nomes das colunas de recursos. Em seguida, você pode construir uma lista de itens para uma cláusula where. No modelo EAV, WHERE X e Y e Z tornam-se INNER JOIN X INNER JOIN Y INNER JOIN Z, então a consulta é um pouco mais complicada, mas a lógica para construir a consulta ainda é totalmente baseada em tabela e será mais do que escalável o suficiente se você tiver os índices apropriados construídos.

Existem muitos motivos para não usar o EAV como uma abordagem geral. Esses motivos não se aplicam a um catálogo de recursos de produto, portanto, não há nada de errado com o EAV nesta aplicação específica.

Com certeza, esta é uma resposta curta para um tópico complexo e controverso. Já respondi a perguntas semelhantes antes e entrei em mais detalhes sobre a aversão geral ao EAV. Por exemplo:

Eu diria que o EAV é usado com menos frequência ultimamente do que costumava ser, principalmente por boas razões. No entanto, acho que também não é bem compreendido.


Exemplos de PostgreSQL CREATE TABLE

Criaremos uma nova tabela chamada contas que possui as seguintes colunas:

  • user_id & # 8211 chave primária
  • nome de usuário & # 8211 único e não nulo
  • senha & # 8211 não nula
  • email & # 8211 único e não nulo
  • created_on & # 8211 not null
  • last_login & # 8211 null

O seguinte extrato cria a tabela de contas:

A instrução a seguir cria a tabela de funções que consiste em duas colunas: role_id e role_name:

A instrução a seguir cria a tabela account_roles que possui três colunas: user_id, role_id e grant_date.

A chave primária da tabela account_roles consiste em duas colunas: user_id e role_id, portanto, temos que definir a restrição de chave primária como uma restrição de tabela.

Como a coluna user_id faz referência à coluna user_id na tabela de contas, precisamos definir uma restrição de chave estrangeira para a coluna user_id:

A coluna role_id faz referência à coluna role_id na tabela de funções, também precisamos definir uma restrição de chave estrangeira para a coluna role_id.

O seguinte mostra a relação entre as tabelas accounts, roles e account_roles:


Retorno de chamada criado por linha

O exemplo a seguir mostra como uma função de retorno de chamada pode ser usada para formatar uma linha específica no momento do desenho. Para cada linha gerada para exibição, a função createdRow é chamada uma vez e apenas uma vez. É passado o nó de criação de linha que pode então ser modificado.

Neste caso, um exemplo trivial de tornar a coluna 'salário' azul e em negrito adicionando uma classe CSS à célula contêiner se o salário for maior que $ 150.000. Observe que columns.createdCell também pode ser usado para criar exatamente o mesmo efeito.

Nome Posição Escritório Era Data de início Salário
Tiger Nixon Arquiteto de Sistema Edimburgo 61 2011/04/25 $320,800
Garrett Winters Contador Tóquio 63 2011/07/25 $170,750
Ashton Cox Autor Técnico Júnior São Francisco 66 2009/01/12 $86,000
Cedric Kelly Desenvolvedor Javascript Sênior Edimburgo 22 2012/03/29 $433,060
Airi Satou Contador Tóquio 33 2008/11/28 $162,700
Brielle Williamson Especialista em integração Nova york 61 2012/12/02 $372,000
Herrod Chandler Assistente de vendas São Francisco 59 2012/08/06 $137,500
Rhona Davidson Especialista em integração Tóquio 55 2010/10/14 $327,900
Colleen Hurst Desenvolvedor Javascript São Francisco 39 2009/09/15 $205,500
Sonya Frost Engenheiro de software Edimburgo 23 2008/12/13 $103,600
Jena Gaines Gerente Londres 30 2008/12/19 $90,560
Quinn Flynn Líder de Suporte Edimburgo 22 2013/03/03 $342,000
Charde Marshall Diretor regional São Francisco 36 2008/10/16 $470,600
Haley Kennedy Designer de Marketing Sênior Londres 43 2012/12/18 $313,500
Tatyana Fitzpatrick Diretor regional Londres 19 2010/03/17 $385,750
Michael Silva Designer de Marketing Londres 66 2012/11/27 $198,500
Paul Byrd Diretor Financeiro (CFO) Nova york 64 2010/06/09 $725,000
Gloria Little Administrador de sistemas Nova york 59 2009/04/10 $237,500
Bradley Greer Engenheiro de software Londres 41 2012/10/13 $132,000
Dai Rios Líder de Pessoal Edimburgo 35 2012/09/26 $217,500
Jenette Caldwell Líder de Desenvolvimento Nova york 30 2011/09/03 $345,000
Yuri Berry Diretor de Marketing (CMO) Nova york 40 2009/06/25 $675,000
César Vance Suporte Pré-Venda Nova york 21 2011/12/12 $106,450
Doris Wilder Assistente de vendas Sydney 23 2010/09/20 $85,600
Angélica Ramos Chief Executive Officer (CEO) Londres 47 2009/10/09 $1,200,000
Gavin Joyce Desenvolvedor Edimburgo 42 2010/12/22 $92,575
Jennifer Chang Diretor regional Cingapura 28 2010/11/14 $357,650
Brenden Wagner Engenheiro de software São Francisco 28 2011/06/07 $206,850
Fiona Green Diretor de Operações (COO) São Francisco 48 2010/03/11 $850,000
Shou Itou Marketing Regional Tóquio 20 2011/08/14 $163,000
Michelle House Especialista em integração Sydney 37 2011/06/02 $95,400
Suki Burks Desenvolvedor Londres 53 2009/10/22 $114,500
Prescott Bartlett Autor Técnico Londres 27 2011/05/07 $145,000
Gavin Cortez Lider do Time São Francisco 22 2008/10/26 $235,500
Martena Mccray Suporte pós-venda Edimburgo 46 2011/03/09 $324,050
Mordomo da unidade Designer de Marketing São Francisco 47 2009/12/09 $85,675
Howard Hatfield Gerente São Francisco 51 2008/12/16 $164,500
Hope Fuentes secretário São Francisco 41 2010/02/12 $109,850
Vivian Harrell Controlador financeiro São Francisco 62 2009/02/14 $452,500
Timothy Mooney Gerente Londres 37 2008/12/11 $136,200
Jackson Bradshaw Diretor Nova york 65 2008/09/26 $645,750
Olivia Liang Engenheiro de suporte Cingapura 64 2011/02/03 $234,500
Bruno Nash Engenheiro de software Londres 38 2011/05/03 $163,500
Sakura Yamamoto Engenheiro de suporte Tóquio 37 2009/08/19 $139,575
Thor Walton Desenvolvedor Nova york 61 2013/08/11 $98,540
Finn Camacho Engenheiro de suporte São Francisco 47 2009/07/07 $87,500
Serge Baldwin Coordenador de Dados Cingapura 64 2012/04/09 $138,575
Zenaida Frank Engenheiro de software Nova york 63 2010/01/04 $125,250
Zorita Serrano Engenheiro de software São Francisco 56 2012/06/01 $115,000
Jennifer Acosta Desenvolvedor júnior de Javascript Edimburgo 43 2013/02/01 $75,650
Cara Stevens Assistente de vendas Nova york 46 2011/12/06 $145,600
Hermione Butler Diretor regional Londres 47 2011/03/21 $356,250
Lael Greer Administrador de sistemas Londres 21 2009/02/27 $103,500
Jonas Alexander Desenvolvedor São Francisco 30 2010/07/14 $86,500
Shad Decker Diretor regional Edimburgo 51 2008/11/13 $183,000
Michael Bruce Desenvolvedor Javascript Cingapura 29 2011/06/27 $183,000
Donna Snider Suporte ao cliente Nova york 27 2011/01/25 $112,000
Nome Posição Escritório Era Data de início Salário
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Script do lado do servidor
  • Comentários

O Javascript mostrado abaixo é usado para inicializar a tabela mostrada neste exemplo:

Além do código acima, os seguintes arquivos da biblioteca Javascript são carregados para uso neste exemplo:

O HTML mostrado abaixo é o elemento de tabela HTML bruto, antes de ser aprimorado por DataTables:

Este exemplo usa um pouco de CSS adicional além do que é carregado dos arquivos da biblioteca (abaixo), para exibir a tabela corretamente. O CSS adicional usado é mostrado abaixo:

Os seguintes arquivos de biblioteca CSS são carregados para uso neste exemplo para fornecer o estilo da tabela:

Esta tabela carrega dados por Ajax. Os dados mais recentes carregados são mostrados abaixo. Esses dados serão atualizados automaticamente à medida que quaisquer dados adicionais forem carregados.

O script usado para realizar o processamento do lado do servidor para esta tabela é mostrado abaixo. Observe que este é apenas um script de exemplo usando PHP. Os scripts de processamento do lado do servidor podem ser escritos em qualquer idioma, usando o protocolo descrito na documentação do DataTables.


Histogramas na fase de consulta

Existem várias maneiras de construir histogramas no Power BI Desktop, vamos começar com a mais simples e partir daí:

Histogramas mais simples - Determine qual consulta tem o campo no qual você deseja construir um histograma. Use a opção & quotReferência & quot para a consulta para criar uma nova consulta e nomeá-la como & quotHistograma Nome do campo & quot. Use a opção & quotGrupo por & quot na faixa & quotTransform & quot e selecione o agregado & quotcontar linhas & quot. Certifique-se de que o tipo de dados seja um número para a coluna agregada resultante. Em seguida, visualize esses dados na página de relatórios. Isso é rápido e fácil de construir, mas não funciona bem se você tiver muitos pontos de dados e não permitir a passagem de elementos visuais.

Definindo depósitos para construir um histograma - Determine qual consulta tem o campo no qual você deseja construir um histograma. Use a opção & quotReference & quot para a consulta para criar uma nova consulta e nomeie-a & quotFieldName & quot. Agora defina os baldes com uma regra. Use a opção Adicionar coluna personalizada na faixa Adicionar coluna e crie uma regra personalizada. Uma regra de intervalo simples pode ter a seguinte aparência:

Certifique-se de que o tipo de dados seja um número para a coluna agregada resultante. Agora você pode usar a técnica de agrupamento por descrito em Histograma mais simples para obter o histograma. Esta opção lida com mais pontos de dados, mas ainda não ajuda na escovação.

Definindo um histograma que suporta escovação - Escovação é quando os visuais são vinculados de forma que quando um usuário seleciona um ponto de dados em um visual, outros visuais na página do relatório realçam ou filtram os pontos de dados relacionados ao ponto de dados selecionado. Como estamos manipulando dados no momento da consulta, precisaremos criar um relacionamento entre as tabelas e garantir que sabemos qual item de detalhe está relacionado ao intervalo no histograma e vice-versa.

Inicie o processo usando a opção & quotReference & quot na consulta que contém o campo no qual deseja construir um histograma. Nomeie a nova consulta como & quotBuckets & quot. Para este exemplo, vamos chamar a consulta original de & quotDetalhes & quot. Em seguida, remova todas as colunas, exceto a coluna que você usará como o intervalo para o histograma. Agora use o recurso & quotRemover duplicatas & quot na consulta, está no menu do botão direito quando você seleciona a coluna, então os valores restantes são os valores únicos na coluna. Se você tiver números decimais, você pode primeiro usar a dica para definir baldes para construir um histograma para obter um conjunto gerenciável de baldes. Agora, verifique os dados mostrados na visualização da consulta. Se você vir valores em branco ou nulos, precisará corrigi-los antes de criar um relacionamento. Consulte & quotCriar um relacionamento se meus dados tiverem valores nulos ou em branco & quot. Usar essa abordagem pode ser problemático devido à necessidade de classificação. Para fazer com que os intervalos sejam classificados corretamente, consulte & quotClassificação de ordem: faça as categorias aparecerem na ordem que desejo & quot.

É útil pensar sobre a ordem de classificação antes de construir qualquer visual.

A próxima etapa do processo é definir um relacionamento entre as consultas & quotBuckets & quot e & quotDetails & quot na coluna buckets. No Power BI Desktop, clique em Gerenciar relacionamentos na fita. Crie uma relação em que Buckets esteja na tabela à esquerda e Details na tabela à direita e selecione o campo que você está usando para o histograma.

A última etapa é criar o histograma. Arraste o campo Bucket da tabela & quotBuckets & quot. Remova o campo padrão do gráfico de colunas resultante. Agora, na tabela & quotDetails & quot, arraste o campo do histograma para o mesmo visual. No poço de campo, altere o agregado padrão para Contagem. O resultado é o histograma.Se você criar outro visual como um mapa de árvore da tabela Detalhes, selecione um ponto de dados no mapa de árvore para ver o histograma realçado e mostrar o histograma do ponto de dados selecionado em relação à tendência de todo o conjunto de dados.


Uma introdução aos bancos de dados

O Celtic Inscribed Stones Project (CISP) é executado em conjunto entre o Departamento de História, UCL, e o Instituto de Arqueologia, UCL, sob a direção da Prof. Wendy Davies em colaboração com o Prof. James Graham-Campbell. O projeto atualmente (em 18 de outubro de 2000) emprega três funcionários em tempo integral (Dr. Kris Lockyear, Dr. Mark Handley e Dr. Paul Kershaw). A estrutura do banco de dados descrita neste manual foi construída pelo Dr. Kris Lockyear e pela ex-pesquisadora, Dra. Katherine Forsyth. Os primeiros três anos do Projeto foram financiados pelo HRB / HEFCE por meio de seu esquema de bolsa institucional.

O objetivo do CISP é realizar um estudo colaborativo e interdisciplinar das inscrições celtas medievais. Um de seus principais objetivos é a compilação de um banco de dados abrangente e confiável de todas as inscrições conhecidas da Grã-Bretanha, Irlanda e Bretanha. Ao reunir este material em um só lugar e torná-lo prontamente disponível, nosso objetivo é transformar o que é um recurso amplamente inexplorado em material utilizável.

Mais detalhes do Projeto estão disponíveis nas páginas do Projeto
(http://www.ucl.ac.uk/archaeology/cisp).

Este guia e manual tem como objetivo ser uma introdução geral ao banco de dados do CISP e um guia detalhado para a entrada de dados. O capítulo contém uma introdução aos bancos de dados, sistemas de gerenciamento de banco de dados e estruturas de dados (termos que são discutidos abaixo). Os capítulos subsequentes discutem o conteúdo do banco de dados CISP e fornecem uma tabela detalhada por tabela, campo por campo guia para o banco de dados, incluindo termos permitidos e definições de campos e entradas, e um breve guia para o aplicativo de entrada de dados CISP. Os apêndices fornecem um glossário de termos e listam as principais mudanças no banco de dados desde a primeira versão deste manual.

Esta seção discute vários conceitos de banco de dados e se destina principalmente àqueles que têm pouca ou nenhuma experiência com bancos de dados baseados em computador.

Um banco de dados é uma coleção estruturada de dados. Assim, índices de cartões, catálogos impressos de artefatos arqueológicos e listas telefônicas são todos exemplos de bancos de dados. Os bancos de dados podem ser armazenados em um computador e examinados por meio de um programa. Esses programas são freqüentemente chamados de `bancos de dados ', mas mais estritamente são sistemas de gerenciamento de banco de dados (DMS). Assim como um índice de cartão ou catálogo deve ser construído cuidadosamente para ser útil, o mesmo deve ser feito com um banco de dados em um computador. Da mesma forma, assim como há muitas maneiras de organizar um catálogo impresso, há muitas maneiras, ou modelos, pelos quais um banco de dados computadorizado pode ser organizado. Um dos modelos mais comuns e poderosos é o modelo `relacional '(discutido abaixo), e os programas que usam esse modelo são conhecidos como sistemas de gerenciamento de banco de dados relacional (RDMS).

Os bancos de dados baseados em computador são geralmente organizados em uma ou mais tabelas. Uma tabela armazena dados em um formato semelhante a uma tabela publicada e consiste em uma série de linhas e colunas. Para levar a analogia adiante, assim como uma tabela publicada terá um título no topo de cada coluna, cada coluna em uma tabela de banco de dados terá um nome, geralmente chamado de nome de campo. O termo campo é freqüentemente usado em vez de coluna. Cada linha em uma tabela representará um exemplo do tipo de objeto sobre o qual os dados foram coletados. A Tabela 1 (a) (p.) É um exemplo de uma tabela de um banco de dados de cidades inglesas. Cada linha, neste caso uma cidade, é uma entidade, e cada coluna representa um atributo dessa entidade. Portanto, nesta tabela, 'população' é um atributo de 'cidade'.

Uma vantagem das tabelas baseadas em computador é que elas podem ser apresentadas na tela em uma variedade de ordens, formatos ou, de acordo com certos critérios, todas as cidades em Hertfordshire ou todas as cidades com uma catedral.

Os bancos de dados geralmente se enquadram em uma de duas categorias amplas. O primeiro compreende um propósito específico, bancos de dados limitados. Na academia, eles geralmente contêm dados coletados para realizar um r & # 244le relativamente limitado apenas em um projeto específico. O banco de dados pode ter como objetivo fornecer ao pesquisador um determinado conjunto de dados, mas não tem nenhuma função ou r & # 244le particular na conclusão do projeto. Por exemplo, o banco de dados Coin Hoards of the Roman Republic (CHRR) de Lockyear incluía apenas os dados necessários para o projeto em mãos [LockyearLockyear1996, capítulo 5].

A segunda categoria compreende bancos de dados de recursos de uso geral. Um bom exemplo de banco de dados de recursos são os registros de monumentos e sítios arqueológicos de condados (SMRs) ou registros de monumentos nacionais (Hansen: 1993). Esses bancos de dados não são específicos para projetos, mas devem ser usados ​​por uma ampla variedade de usuários. Os bancos de dados de recursos geralmente tentam ser abrangentes dentro de seu `domínio de discurso ', são mantidos e atualizados e são disponibilizados para as partes interessadas. Como esses bancos de dados tentam ser abrangentes a fim de acomodar inquéritos e pesquisas imprevistas, eles incluem uma ampla variedade de dados que, por sua vez, requerem uma 'estrutura de dados' complexa, ou forma de armazenar as informações.

O banco de dados CISP pretende ser um banco de dados de recursos e, como resultado, tem uma estrutura de dados complexa (discutida abaixo). Essa estrutura, entretanto, oferece grande poder e flexibilidade tanto para a recuperação quanto para o manuseio dos dados, mas também para a futura expansão do banco de dados para incluir outras informações e materiais.

  • É uma perda de tempo inserir os mesmos dados repetidamente.
  • Aumenta as possibilidades de erro. Na Tabela 1 (b), a população de Hertfordshire foi digitada incorretamente na terceira linha.
  • Erros de entrada criarão erros na recuperação de dados, que provavelmente serão menos visíveis / previsíveis em consultas complexas.
  • É um desperdício de espaço em disco - isso pode ser uma consideração importante com grandes bancos de dados.
  • Isso pode tornar algumas consultas no banco de dados mais lentas.
  • As atualizações ou correções devem ser aplicadas a várias linhas.
[Uma tabela de cidades inglesas]
Cidade condado população cidade do condado? catedral?
Welwyn Garden City Hertfordshire 40,570 não não
St. Albans Hertfordshire 123,800 não sim
Hertford Hertfordshire 2,023 sim não
Durham Durham 29,490 sim sim
[Uma mesa mal projetada]
Cidade condado população cidade do condado? catedral? população do condado tamanho do condado
Welwyn Garden City Hertfordshire 40,570 não não 937,300 631
St. Albans Hertfordshire 123,800 não sim 937,300 631
Hertford Hertfordshire 2,023 sim não 397,300 631
Durham Durham 29,490 sim sim 132,681 295
Essex 1,426,200 1,528
[Uma tabela de condados]
condado população tamanho (milhas quadradas)
Hertfordshire 937,300 631
Durham 132,681 295
Essex 1,426,200 1,528

Um segundo problema com a tabela pode ser visto na última linha. Temos informações sobre a população de Essex como um todo, mas nenhuma sobre qualquer cidade em particular. Para acomodar essas informações, tivemos que criar uma linha de dados com apenas informações parciais. Além desses problemas, uma estrutura de dados pobre pode levar à inflexibilidade no uso do banco de dados e, possivelmente, problemas na recuperação de dados na forma exigida. Exemplos de projetos de banco de dados deficientes são muito comuns.

Para resolver esses problemas, os dados devem ser divididos em várias tabelas. Para seguir o exemplo de cidades, poderíamos ter uma tabela de cidades conforme mostrado na Tabela 1 (a). Cada informação armazenada nesta tabela é um atributo de uma cidade. As informações sobre os condados são então armazenadas em uma segunda tabela separada de condados, conforme mostrado na Tabela 1 (c). Nesta tabela, cada item de informação é um atributo de um município. Esse processo de decomposição de dados em uma série de tabelas é chamado de normalização e é a primeira e mais importante etapa no projeto de um banco de dados relacional.

Normalização é o processo de identificar entidades e seus atributos e definir o relacionamento entre as entidades. Em nosso exemplo, temos duas entidades - cidades e condados, e registramos vários atributos (Tabelas 1 (a) e amp 1 (c)). Existem três tipos de relacionamento entre entidades: um para um, um para muitos e muitos para muitos. A Figura 1 mostra os diferentes tipos de relacionamento em uma forma esquemática que são discutidos em detalhes abaixo. Este tipo de diagrama é conhecido como diagrama de relacionamento de entidades.

Relações um-para-um

Um caso especial de relacionamento um para um é quando partes específicas de informações apenas existem, ou são aplicáveis ​​apenas, a algumas das entradas em uma tabela. Em nosso exemplo geográfico, podemos desejar registrar a extensão da linha costeira ou outros atributos que se relacionam apenas aos condados que fazem fronteira com o mar. Nestes casos, pode-se criar uma tabela separada para essas informações. Isso ajuda a economizar espaço em disco no computador, minimizar o tempo de entrada de dados e quebrar tabelas potencialmente grandes. Esse tipo de relação é mostrado na Figura 1 (b).

Relacionamentos um-para-muitos

Relacionamentos muitos para muitos

Este tipo de relacionamento requer o uso da terceira tabela. Isso cria efetivamente dois relacionamentos um-para-muitos. Essas tabelas intermediárias podem ser chamadas de tabelas de ligação. Essas tabelas geralmente contêm apenas duas colunas que atuam como um link entre as duas tabelas principais. Em nosso exemplo geográfico, a tabela de ligação conteria os nomes dos condados e apenas os nomes dos rios. Esta solução para modelar relacionamentos muitos para muitos é ilustrada na Figura 1 (e).

[Uma relação um-para-um apenas para algumas entidades]

[Um relacionamento muitos para muitos]

[Dividindo um relacionamento muitos para muitos em dois relacionamentos um para muitos]

Chaves primárias e estrangeiras

Cada linha em uma tabela em um banco de dados relacional deve ser exclusiva, não deve haver duas linhas idênticas. Uma ou mais colunas são, portanto, designadas como a chave primária (às vezes chamada de identificador exclusivo) para os itens contidos nela. Assim, na Tabela 1 (a) a coluna `cidade 'pode atuar como a chave primária, e na Tabela 1 (c) a coluna` condado' pode atuar como a chave primária dessa tabela. Este conceito tem sido usado em bancos de dados baseados em papel (publicados), cada pedra inscrita catalogada no Corpus Inscriptionum Insularum Insularum Celticarum Macalister: 1945, Macalister: 1949 de RAS Macalister, Macalister: 1949 tem um número de identificação único, assim como cada tesouro em Roman Republican Coin Hoards Crawford de Crawford: 1969: b.

Em nosso exemplo geográfico, entretanto, pode haver mais de uma cidade com o mesmo nome, Newcastle ou Newport, por exemplo. Neste caso, poderíamos designar as colunas `cidade 'e` condado' juntas como a chave primária.

As chaves estrangeiras são colunas em uma tabela que fornecem um link para outra tabela. Em nosso exemplo geográfico, a coluna de condado em nossa tabela de cidades fornece um link para a tabela de condados e, portanto, é um campo-chave nessa relação. É muito importante, portanto, garantir que as entradas em ambas as tabelas sejam idênticas, que ambas as tabelas usem o nome completo do condado (Hertfordshire) ou uma abreviatura (Herts), mas não uma mistura dos dois.

Há uma complexidade final que deve ser tratada. O que poderíamos fazer no caso de haver duas cidades com o mesmo nome no mesmo município? Embora em nosso exemplo seja improvável, em bancos de dados de outras informações isso poderia acontecer. Poderíamos usar uma combinação de nome, condado e população como chave primária para a tabela de cidades. Se tivéssemos uma tabela de lojas, teríamos que incluir o nome da cidade, município e a população para fornecer uma ligação entre as duas tabelas. Isso, no entanto, reintroduzirá o problema de redundância de dados. Um melhor curso de ação é atribuir um código único a cada cidade e usar esse código como o link para a tabela de lojas. O uso de códigos tem outras vantagens: pode ser bastante curto e, portanto, economizar tempo durante a entrada de dados e espaço em disco. Esses códigos podem ser atribuídos pelo usuário, WGC para Welwyn Garden City, ou podem ser um número sequencial criado automaticamente pelo programa.

Tipos de dados e definição

Os dados armazenados em tabelas podem ser classificados em tipos. Na Tabela 1 (a), a primeira coluna pode conter qualquer letra, número ou outro caractere (como A terceira coluna para população contém um número e é um tipo de dados numérico. As últimas duas colunas são "lógicas" e podem conter apenas sim ou não. Existem outros tipos de dados, como data ou mesmo imagens e sons.

O tipo de dados é importante, pois diferentes tipos de dados se comportam de maneiras diferentes. Um bom exemplo é a ordem de classificação de uma série de números. Se armazenarmos 1, 22, 3, 10, 2 e 15 em uma coluna numérica e pedirmos ao programa para ordenar as linhas da tabela nesta coluna, obteremos 1, 2, 3, 10, 15, 22 à medida que pode esperar. Se essa coluna fosse definida como um tipo de dados alfanumérico, o resultado seria 1, 10, 15, 2, 22, 3, um resultado bastante diferente! Diferentes DMSs têm diferentes maneiras de lidar com diferentes tipos de dados (veja abaixo).

Cada coluna de dados também deve ser definida. Isso pode ser bastante simples, 'a coluna do condado conterá o nome completo do condado'. Também temos que decidir o que significam as entradas, na tabela de condados temos uma coluna para área - temos que decidir se essa é a área em milhas quadradas ou quilômetros quadrados.

Podemos desejar restringir as entradas possíveis em uma coluna. Podemos fazer isso para evitar erros, podemos decidir que a população máxima permitida em uma cidade é 10.000.000, pois nenhuma cidade na Grã-Bretanha tem uma população maior do que isso. Também podemos restringir as entradas a uma lista limitada de termos. Se, por exemplo, tivéssemos 'tipo' como um atributo de cidade, poderíamos ter cidade mercado, cidade pequena, cidade de condado, vila, vila pequena, vila e assim por diante. Se algum termo fosse permitido, este atributo não seria muito útil para recuperar grupos de assentamentos de qualquer maneira significativa. Podemos, portanto, criar uma lista de termos permitidos que são precisamente definidos e que, portanto, permitiriam uma recuperação significativa de dados.

Tabelas de pesquisa

Na seção anterior, campos de dados restritos foram discutidos. Como, na prática, as entradas nos campos devem ser restringidas? O primeiro método é para que os termos permitidos sejam listados em um manual como este, e para que cada usuário seja disciplinado o suficiente apenas para usar esses termos e para verificar se eles usaram os corretos. Há vantagens, entretanto, em armazenar esses termos no computador junto com as tabelas principais de dados. Existem, portanto, dois métodos adicionais. A primeira é incluir as definições em um aplicativo de banco de dados (veja abaixo), ou na forma como a tabela é definida no DMS. Isso tem a desvantagem de que as informações dependem do software que está sendo usado e, se os dados forem transferidos (`portados ') para outro programa, essas informações serão perdidas. Também é difícil adicionar novos termos à lista. O segundo método alternativo é usar tabelas de consulta, das quais existem dois tipos, simples e hierárquicas.

As tabelas de consulta simples geralmente consistem em uma ou duas colunas. Em um exemplo de uma coluna, a lista de termos permitidos é armazenada na tabela em um exemplo de duas colunas a primeira coluna armazena o termo permitido, geralmente na forma de um código, e a segunda coluna armazena a definição desse termo ou código. Um bom exemplo de tabelas de consulta simples são as tabelas POSIT1, POSIT2 e POSIT3 discutidas na página.

As tabelas de consulta hierárquica são muito semelhantes, pois uma coluna contém uma série de termos ou códigos exclusivos. As colunas restantes contêm as definições desse código, mas em diferentes níveis de detalhe. Usando nosso exemplo geográfico, podemos desejar classificar os rios. A tabela de consulta conteria uma coluna de códigos. Outra coluna poderia conter alguma classificação ampla, como 'rio principal', 'rio menor' e 'riacho'. Uma terceira coluna poderia então subdividir a classificação, os rios principais poderiam ser divididos em 'marés' e 'não-marés', e uma quarta coluna poderia dividir 'maré' em 'estuarino' e 'não-estuarino'. A tabela SITETYPE discutida na seção 10.6 é um bom exemplo de uma tabela de consulta hierárquica.

As tabelas de consulta hierárquica têm uma função dupla - restringir as entradas em uma segunda tabela (às vezes chamada de tabela pai) e fornecer um mecanismo pelo qual consultas complexas podem ser simplificadas. Ambos os tipos de tabela de consulta podem ser usados ​​para criar saída impressa do banco de dados que seja mais facilmente compreendida, substituindo uma série de códigos possivelmente obscuros por pedaços de texto mais descritivos.

Os capítulos a seguir examinam o conteúdo e a estrutura do banco de dados CISP em geral e, a seguir, fornecem um guia de definição de dados para todas as tabelas e campos.


Manipulação de Tabela de Dados no Mathematica

Sou um estatístico que busca uma maneira eficiente de selecionar linhas ou colunas de uma tabela de dados em Mathematica. Deixe-me colocar a questão em 2 partes com uma tabela de dados no estilo SQL:

Que, quando formatado como uma grade, é mais ou menos assim:

Parte 1: Como os dados no cabeçalho da tabela, por exemplo "ID", podem ser definidos como o nome da lista para essa coluna? Idealmente, o resultado permitiria que você faça o seguinte:

Seria necessário escrever uma função para dissecar a linha do cabeçalho e, em seguida, alinhar os nomes dos cabeçalhos como o nome de uma lista que corresponde ao cabeçalho apropriado? Embora alguém possa perguntar 'Por que não se referir a tudo como uma posição e evitar totalmente a dor de cabeça da renomeação?' é extremamente complicado ao trabalhar com dezenas ou centenas de colunas / variáveis ​​usar uma posição sem sentido para fazer referência a uma variável.

Parte 2: Como uma linha individual ou subconjunto de linhas pode ser retornado de uma tabela? Basicamente, estou procurando o equivalente à cláusula "WHERE" no SQL ou a função "subconjunto" no R.

Por exemplo, na coluna "ID", posso querer recuperar todas as linhas em que "ID" == "Alpha". Eu tenho que criar um método que itera sobre a lista de "ID", armazene a posição na lista onde o valor do elemento é igual a "Alpha" e, em seguida, concatenar uma lista que contém o valor naquela posição para todos os outras listas?

Tenho certeza de que poderia escrever as funções que menciono, mas parece injusto que o Mathematica negligencie uma tarefa de manipulação de dados tão rudimentar. Eu entendo que existe também o pacote DataManipulation que permite consultas SQL, mas eu tenho que acreditar (espero?) Que existe uma maneira nativa do Mathematica que é mais rápida.

Obrigado por me agradar! E minhas desculpas antecipadamente a todos os aficionados do Mathematica que podem ver isso como uma questão corrupta por tentar programar em outro idioma enquanto está no Mathematica!


5 6 bancos de dados

Quando um conjunto de dados se torna muito grande, ou mesmo apenas muito complexo em sua estrutura, a solução de armazenamento final é um banco de dados.

O termo & # 8220 banco de dados & # 8221 pode ser usado geralmente para descrever qualquer coleção de informações. Nesta seção, o termo & # 8220database & # 8221 significa um banco de dados relacional, que é uma coleção de dados organizada de uma maneira particular.

O mecanismo real de armazenamento físico para um banco de dados - se formatos binários ou formatos de texto são usados, e se um arquivo ou vários arquivos são usados ​​- não nos preocupa. Nos preocuparemos apenas com a organização conceitual de alto nível dos dados e contaremos com um software para decidir a melhor forma de armazenar as informações em arquivos.

O software que trata da representação dos dados na memória do computador, e nos permite trabalhar em nível conceitual, é denominado sistema de gerenciamento de banco de dados (SGBD), ou no nosso caso, mais especificamente, sistema de gerenciamento de banco de dados relacional (RDBMS).

Os principais benefícios dos bancos de dados para armazenamento de dados decorrem do fato de os bancos de dados possuírem uma estrutura formal. Passaremos grande parte desta seção descrevendo e discutindo como os bancos de dados são projetados, para que possamos apreciar os benefícios de armazenar dados em um banco de dados e sabermos o suficiente para poder trabalhar com os dados que foram armazenados em um banco de dados.

Não estamos preocupados com os formatos de arquivo usados ​​para armazenar um banco de dados. Em vez disso, lidaremos com os componentes conceituais usados ​​para armazenar dados em um banco de dados.

Um banco de dados relacional consiste em um conjunto de tabelas, onde uma tabela é conceitualmente como um arquivo de texto simples ou uma planilha: um conjunto de valores organizados em linhas e colunas. A diferença é que geralmente há várias tabelas em um único banco de dados e as tabelas em um banco de dados têm uma estrutura muito mais formal do que um arquivo de texto simples ou uma planilha.

Para demonstrar os conceitos e a terminologia dos bancos de dados, trabalharemos com um exemplo simples de armazenamento de informações sobre livros. Todo o conjunto de informações é mostrado na Figura 5.18, mas consideraremos apenas subconjuntos específicos de informações do livro em vários estágios ao longo desta seção, a fim de demonstrar idéias diferentes sobre bancos de dados.

Figura 5.18: Informações sobre um conjunto de livros, incluindo o ISBN e o título do livro, o autor do livro e o gênero do autor, a editora do livro e o país de origem da editora.

Abaixo, é mostrado um exemplo simples de uma tabela de banco de dados que contém informações sobre alguns dos livros em nosso conjunto de dados. Essa tabela tem três colunas - o ISBN do livro, o título do livro e o autor do livro - e quatro linhas, com cada linha representando um livro.

Cada tabela em um banco de dados possui um nome exclusivo e cada coluna dentro de uma tabela possui um nome exclusivo dentro dessa tabela.

Cada coluna em uma tabela de banco de dados também possui um tipo de dados associado a ela, portanto, todos os valores em uma única coluna são o mesmo tipo de dados. No exemplo do banco de dados do livro, todos os valores em todas as três colunas são valores de texto ou caractere. O ISBN é armazenado como texto, não como um inteiro, porque é uma sequência de 10 dígitos (em oposição a um valor decimal). Por exemplo, se armazenássemos o ISBN como um inteiro, perderíamos o 0 à esquerda.

Cada tabela em um banco de dados possui uma chave primária. A chave primária deve ser única para cada linha de uma tabela. Na tabela do livro, o ISBN fornece uma chave primária perfeita porque cada livro possui um ISBN diferente.

É possível criar uma chave primária combinando os valores de duas ou mais colunas. Isso é chamado de chave primária composta. Uma tabela pode ter apenas uma chave primária, mas a chave primária pode ser composta por mais de uma coluna. Veremos alguns exemplos de chaves primárias compostas posteriormente neste capítulo.

Um banco de dados contendo informações sobre livros também pode conter informações sobre editoras de livros. A seguir, mostramos outra tabela no mesmo banco de dados contendo informações sobre as editoras.

Nesta tabela, os valores na coluna ID são todos inteiros. Todas as outras colunas contêm texto. A chave primária nesta tabela é a coluna ID.

As tabelas no mesmo banco de dados podem ser relacionadas entre si usando chaves estrangeiras. Estas são colunas em uma tabela que especificam um valor da chave primária em outra tabela. Por exemplo, podemos relacionar cada livro na book_table a um editor na publisher_table adicionando uma chave estrangeira à book_table. Essa chave estrangeira consiste em uma coluna, pub, que contém o ID do editor apropriado. A book_table agora se parece com isto:

Observe que dois dos livros na book_table têm o mesmo editor, com um valor pub de 1. Isso corresponde ao editor com um valor de ID de 1 em publisher_table, que é o editor chamado Mallinson Rendel.

Observe também que uma coluna de chave estrangeira em uma tabela não precisa ter o mesmo nome da coluna de chave primária à qual se refere em outra tabela. A coluna de chave estrangeira em book_table é chamada pub, mas se refere à coluna de chave primária em publisher_table chamada ID.

Os exemplos de tabelas de banco de dados na seção anterior mostraram o conteúdo de cada tabela de banco de dados. Na próxima seção, sobre Design de banco de dados, será mais importante descrever o design, ou estrutura, de uma tabela de banco de dados - o esquema da tabela. Para este propósito, o conteúdo de cada linha não é importante, em vez disso, estamos mais interessados ​​em quantas tabelas existem e quais colunas são usadas para compor essas tabelas.

Podemos descrever um design de banco de dados simplesmente em termos de nomes de tabelas, nomes de colunas, quais colunas são chaves primárias e quais colunas são chaves estrangeiras.

A notação que usaremos é uma descrição de texto simples, com chaves primárias e chaves estrangeiras indicadas entre colchetes. A descrição de uma chave estrangeira inclui o nome da tabela e o nome da coluna à qual a chave estrangeira se refere. Por exemplo, estes são o esquema para publisher_table e book_table no banco de dados de livros:

O diagrama abaixo mostra uma maneira de visualizar esse design. Cada & # 8220box & # 8221 neste diagrama representa uma tabela no banco de dados, com o nome da tabela como o título da caixa. Os outros nomes em cada caixa são os nomes das colunas dentro da tabela se o nome estiver em negrito, então essa coluna faz parte da chave primária da tabela e se o nome estiver em itálico, então essa coluna é uma chave estrangeira. As setas são usadas para mostrar o link entre uma chave estrangeira em uma tabela e a chave primária em outra tabela.

O publisher_table tem três colunas e a coluna chamada ID é a chave primária da tabela.

O book_table tem quatro colunas. Nesta tabela, a chave primária é a coluna ISBN e a coluna pub é uma chave estrangeira que se refere à coluna ID na publisher_table.

5 6 3 Projeto de banco de dados

Como vimos com documentos XML na Seção 5.5.2, os bancos de dados nos permitem armazenar informações de várias maneiras, o que significa que há decisões de design a serem feitas. Nesta seção, discutiremos brevemente alguns dos problemas relacionados ao design do banco de dados.

O projeto de um banco de dados se resume a três coisas: quantas tabelas são necessárias, quais informações vão em cada tabela e como as tabelas estão vinculadas entre si. O restante desta seção fornece algumas regras e diretrizes para determinar uma solução para cada uma dessas etapas.

Esta seção não fornece uma discussão exaustiva nem uma discussão completamente rigorosa sobre o design do banco de dados. A importância desta seção é fornecer uma introdução básica a algumas idéias úteis e maneiras de pensar sobre os dados. Uma compreensão básica dessas questões também é necessária para que possamos trabalhar com dados que foram armazenados em um banco de dados.

Uma maneira de abordar o design de banco de dados é pensar em termos de entidades, seus atributos e os relacionamentos entre eles.

Uma entidade é mais facilmente pensada como uma pessoa, lugar ou objeto físico (por exemplo, um livro), um evento ou um conceito. Um atributo é uma informação sobre a entidade. Por exemplo, o título, autor e ISBN são todos atributos de uma entidade de livro.

Em termos de um conjunto de dados de pesquisa, cada variável no conjunto de dados corresponde a um atributo. A tarefa de projetar um banco de dados para armazenar o conjunto de dados se resume em atribuir cada variável a uma entidade particular.

Tendo decidido sobre um conjunto de entidades e seus atributos, um design de banco de dados consiste em uma tabela separada para cada entidade e uma coluna separada dentro de cada tabela para cada atributo da entidade correspondente.

Em vez de armazenar um conjunto de dados como uma grande tabela de informações, essa regra sugere que devemos usar várias tabelas, com informações sobre diferentes entidades em tabelas separadas. No exemplo do banco de dados de livros, há informações sobre pelo menos duas entidades, livros e editoras, portanto, temos uma tabela separada para cada uma delas.

Essas ideias de entidades e atributos são as mesmas que foram discutidas para o design XML na Seção 5.5.2, apenas com terminologia diferente.

Um relacionamento é uma associação entre entidades. Por exemplo, uma editora publica livros e um livro é publicado por uma editora. Os relacionamentos são representados em um banco de dados por pares de chave estrangeira-chave primária, mas os detalhes dependem da cardinalidade do relacionamento - se o relacionamento é um para um, muitos para um ou muitos para muitos.

Por exemplo, um livro é publicado por exatamente uma editora, mas uma editora publica muitos livros, então a relação entre os livros e as editoras é de muitos para um.

Esse tipo de relacionamento pode ser representado colocando uma chave estrangeira na tabela de livros (o lado & # 8220 muitos & # 8221) que se refere à chave primária na tabela para editores (o lado & # 8220one & # 8221). Este é o design que já vimos, na página, onde o book_table tem uma chave estrangeira, pub, que se refere à chave primária, ID, na publisher_table.

Os relacionamentos um para um podem ser tratados da mesma forma que os relacionamentos muitos para um (não importa qual tabela obtém a chave estrangeira), mas os relacionamentos muitos para muitos são mais complexos.

Em nosso exemplo de banco de dados de livros, podemos identificar outro tipo de entidade: autores.

Para acomodar as informações sobre os autores no banco de dados, deve haver outra tabela para informações sobre os autores. No exemplo abaixo, a tabela contém apenas o nome do autor, mas outras informações, como idade e nacionalidade do autor, podem ser adicionadas.

Qual é a relação entre livros e autores? Um autor pode escrever vários livros e um livro pode ter mais de um autor, portanto, este é um exemplo de relacionamento muitos para muitos.

Um relacionamento muitos para muitos só pode ser representado pela criação de uma nova tabela no banco de dados.

Por exemplo, podemos criar uma tabela, chamada book_author_table, que contém a relação entre autores e livros. Esta tabela contém uma chave estrangeira que se refere à tabela do autor e uma chave estrangeira que se refere à tabela do livro. A representação de entidades de livro, entidades de autor e o relacionamento entre elas agora consiste em três tabelas, conforme mostrado abaixo.

O design do banco de dados do livro, com informações do autor incluídas, é mostrado no diagrama abaixo.

O conteúdo dessas tabelas para vários livros é mostrado abaixo. A tabela de autores apenas lista os autores sobre os quais temos informações:

A book_table apenas lista os livros que estão no banco de dados:

O book_author_table contém a associação entre livros e autores:

Observe que o autor 2 (Lynley Dodd) escreveu mais de um livro e o livro 0908606273 (Meu gato gosta de se esconder em caixas) tem mais de um autor.

5 6 3 3 Projetando para integridade de dados

Outra razão para criar uma tabela em um banco de dados é o propósito de restringir o conjunto de valores possíveis para um atributo. Por exemplo, se a tabela de autores registra o gênero do autor, pode ser útil ter uma tabela separada que contenha os possíveis valores de gênero. A coluna na tabela de autor torna-se então uma chave estrangeira referente à tabela de gênero e, como uma chave estrangeira deve corresponder ao valor da chave primária correspondente, temos uma verificação da validade dos valores de gênero na tabela de autor.

A tabela de autor e a tabela de gênero reformuladas são descritas abaixo.

A gender_table contém apenas o conjunto de valores de gênero possíveis, conforme mostrado abaixo.

O projeto final do banco de dados do livro, que consiste em cinco tabelas, é mostrado no diagrama abaixo.

Outra maneira de abordar o design do banco de dados é escolher tabelas e colunas dentro das tabelas com base no fato de elas atenderem a um conjunto de regras chamado formulários normais.

Esse processo, mais formal, de design de banco de dados é chamado de normalização.

Existem várias formas normais, mas mencionaremos apenas as três primeiras, porque elas cobrirão as situações mais simples.

A definição adequada de normalização depende de conceitos de banco de dados relacional mais avançados que estão além do escopo deste livro, portanto, as descrições abaixo são apenas para dar uma ideia de como o processo funciona.

Primeira forma normal
A primeira forma normal requer que as colunas em uma tabela sejam atômicas, não deve haver colunas duplicadas e cada tabela deve ter uma chave primária.

A primeira parte desta regra diz que uma coluna em uma tabela de banco de dados deve conter apenas um único valor. Como exemplo, considere o seguinte design possível para uma mesa para armazenar informações sobre livros. Há uma coluna para o título do livro e outra coluna para todos os autores do livro.

Duas linhas desta tabela são mostradas abaixo.

A primeira coluna desta tabela é aceitável porque contém apenas uma informação: o título do livro. No entanto, a segunda coluna não é atômica porque contém uma lista de autores para cada livro. O livro da segunda linha possui dois autores registrados na coluna de autores. Isso viola a primeira forma normal.

A segunda parte da regra diz que uma tabela não pode ter duas colunas contendo as mesmas informações. Por exemplo, o possível redesenho a seguir da tabela do livro fornece uma solução para o problema anterior, tendo uma coluna separada para cada autor do livro.

Duas linhas desta tabela são mostradas abaixo.

Isso resolve o problema das colunas atômicas porque cada coluna contém apenas o nome de um autor. No entanto, a tabela possui duas colunas duplicadas: autor1 e autor2. Essas duas colunas registram as mesmas informações, nomes de autores, portanto, esse design também viola a primeira forma normal.

Um possível redesenho que satisfaça o requisito de que cada coluna seja atômica e não duplicada é mostrado abaixo. Agora temos apenas uma coluna para o título do livro e uma coluna para os nomes dos autores.

O conteúdo desta tabela é mostrado abaixo. Observe que o segundo livro agora ocupa duas linhas porque tem dois autores.

A parte final da primeira regra da forma normal diz que deve haver uma coluna na tabela que tem um valor único em cada linha (ou deve ser possível combinar várias colunas para obter um valor único para cada linha). Em outras palavras, toda tabela deve ter uma chave primária.

Podemos encontrar uma chave primária na tabela acima?

Nem a coluna do título nem a coluna do autor por si só servem como chave primária porque alguns valores se repetem em cada uma dessas colunas.

Poderíamos combinar as duas colunas para criar uma chave primária composta. No entanto, também é importante pensar não apenas nos dados que estão atualmente em uma tabela, mas também nos valores possíveis que podem ser inseridos na tabela no futuro (ou mesmo apenas em teoria). Nesse caso, é possível que um livro seja publicado em formato de capa dura e brochura, ambos com o mesmo título e autor, portanto, embora uma chave primária composta funcione para as três linhas mostradas abaixo, não é necessariamente uma escolha inteligente.

Conforme descrito anteriormente, para o caso de informações sobre livros, um ótimo candidato para chave primária é o ISBN do livro, porque é garantido que ele seja exclusivo para um livro específico. Se adicionarmos uma coluna ISBN à tabela, podemos finalmente satisfazer a primeira forma normal, embora ainda tenha que ser uma chave primária composta envolvendo a combinação de ISBN e autor.

O conteúdo desta tabela é mostrado abaixo.

Esta não é uma solução ideal para armazenar essas informações, mas pelo menos satisfaz a primeira forma normal. A consideração da segunda e da terceira forma normal ajudará a melhorar o design.

Segunda forma normal
A segunda forma normal requer que uma tabela deve estar na primeira forma normal e todas as colunas da tabela devem estar relacionadas com a chave primária inteira.

Essa regra formaliza a ideia de que deve haver uma tabela para cada entidade do conjunto de dados.

Como um exemplo básico, considere a seguinte tabela que contém informações sobre autores e editores. A chave primária desta tabela é o ID do autor. Em outras palavras, cada linha desta tabela diz respeito apenas a um único autor.

Duas linhas desta tabela são mostradas abaixo.

A coluna de nome desta tabela está relacionada à chave primária (o ID) este é o nome do autor. No entanto, a coluna do editor não está relacionada à chave primária. Este é o editor de um livro. Em outras palavras, as informações sobre editoras pertencem a uma tabela sobre editoras (ou possivelmente uma tabela sobre livros), não a uma tabela sobre autores.

Como um exemplo mais sutil, considere a tabela que terminamos no final da primeira forma normal.

A chave primária para esta tabela é uma combinação de ISBN e autor (cada linha da tabela contém informações sobre um autor de um livro).

A coluna do título está relacionada ao ISBN, este é o título do livro. No entanto, a coluna do título não está relacionada ao autor - este não é o título do autor!

A tabela deve ser dividida em duas tabelas, uma com as informações sobre os livros e outra com as informações sobre os autores. Abaixo, são mostradas as informações relacionadas ao livro separadas em sua própria tabela.

É importante lembrar que cada uma das novas tabelas que criamos para satisfazer a segunda forma normal também deve satisfazer a primeira forma normal. Nesse caso, seria aconselhável adicionar uma coluna de ID para atuar como chave primária para a tabela de autores, conforme mostrado a seguir, pois é perfeitamente possível que dois autores distintos possam compartilhar o mesmo nome.

Como este exemplo deixa claro, depois de dividir uma tabela em duas ou mais partes, é muito importante vincular as partes adicionando uma ou mais chaves estrangeiras, com base nas relações entre as tabelas. Nesse caso, a relação é de muitos para muitos, portanto, a solução requer uma terceira tabela para fornecer um link entre livros e autores.

Terceira forma normal
A terceira forma normal requer que uma tabela deve estar na segunda forma normal e todas as colunas da tabela devem estar relacionadas apenas à chave primária (não umas às outras).

Essa regra enfatiza ainda mais a ideia de que deve haver uma tabela separada para cada entidade no conjunto de dados. Por exemplo, considere a seguinte tabela para armazenar informações sobre livros.

A chave primária desta tabela é o ISBN, que identifica exclusivamente um livro. A coluna do título está relacionada ao livro este é o título do livro. Cada linha desta tabela é cerca de um livro.

A coluna da editora também está relacionada ao livro - esta é a editora do livro. No entanto, a coluna do país não está diretamente relacionada ao livro - este é o país da editora. Isso obviamente é informação sobre o livro - é o país da editora do livro - mas a relação é indireta, através da editora.

Existe uma heurística simples que facilita a localização desse tipo de problema em uma tabela de banco de dados. Observe que as informações nas colunas do editor e do país são idênticas para os livros publicados por Mallinson Rendel. Quando duas ou mais colunas repetem a mesma informação indefinidamente, é um sinal claro de que a segunda ou a terceira forma normal não está sendo atendida.

Nesse caso, a análise da tabela sugere que deve haver uma tabela separada para informações sobre a editora.

A aplicação das regras de normalização geralmente resulta na criação de várias tabelas em um banco de dados.A discussão anterior sobre relacionamentos deve ser consultada para certificar-se de que quaisquer novas tabelas sejam vinculadas a pelo menos uma outra tabela no banco de dados usando um par de chave primária e chave estrangeira.

O resultado da normalização é um banco de dados bem organizado que deve ser fácil de manter. No entanto, a normalização pode produzir um banco de dados lento em termos de acesso aos dados (porque os dados de muitas tabelas precisam ser recombinados).

A desnormalização é o processo de violar deliberadamente as formas normais, normalmente para produzir um banco de dados que possa ser acessado mais rapidamente.

Um banco de dados bem projetado, especialmente aquele que satisfaz a terceira forma normal, terá a característica de que cada informação é armazenada apenas uma vez. Menos repetição de valores de dados significa que um banco de dados bem projetado geralmente exigirá menos memória do que armazenar um conjunto de dados inteiro em um formato de tabela única ingênuo. Menos repetição também significa que um banco de dados bem projetado é mais fácil de manter e atualizar, porque se uma alteração precisa ser feita, ela só precisa ser feita em um local. Além disso, há menos chance de erros se infiltrarem no conjunto de dados. Se houver várias cópias de informações, é possível que as cópias discordem, mas com apenas uma cópia não pode haver divergências.

Essas idéias são uma expressão do princípio DRY da Seção 2.7. Um banco de dados bem projetado é a personificação definitiva do princípio DRY para armazenamento de dados.

5 6 5 Estudo de caso: The Data Expo (continuação)

O conjunto de dados da Data Expo consiste em sete variáveis ​​atmosféricas registradas em 576 locais por 72 pontos no tempo (a cada mês por 6 anos), mais dados de elevação para cada local (consulte a Seção 5.2.8).

Os dados foram originalmente armazenados como 505 arquivos de texto simples, onde cada arquivo contém os dados de uma variável para um mês. A Figura 5.19 mostra as primeiras linhas de um dos arquivos de texto simples.

Conforme discutimos anteriormente neste capítulo, esse formato simples torna os dados muito acessíveis. No entanto, este é um exemplo em que um formato de texto simples é bastante ineficiente, porque muitos valores são repetidos. Por exemplo, as informações de longitude e latitude para cada local no conjunto de dados são armazenadas em cada arquivo, o que significa que essas informações são repetidas mais de 500 vezes! Isso não só ocupa mais espaço de armazenamento do que o necessário, mas também viola o princípio DRY, com todas as consequências negativas que daí decorrem.

Figura 5.19: Um dos arquivos de texto simples do formato original do conjunto de dados Data Expo, que contém dados para uma variável para um mês. O arquivo contém informações sobre latitude e longitude que são repetidas em todos os outros arquivos de texto simples no formato original (para cada variável e para cada mês no total, mais de 500 vezes).

Nesta seção, consideraremos como o conjunto de dados do Data Expo pode ser armazenado como um banco de dados relacional.

Para começar, consideraremos o problema de uma perspectiva de entidades e atributos. Que entidades existem no conjunto de dados? Nesse caso, as diferentes entidades que estão sendo medidas são relativamente fáceis de identificar. Existem medições na atmosfera, e as medições são feitas em diferentes locais e em diferentes momentos. Temos informações sobre cada ponto no tempo (ou seja, uma data), temos informações sobre cada local (longitude e latitude e altitude) e temos várias medições da atmosfera. Isso sugere que devemos ter três tabelas: uma para medidas atmosféricas, uma para locais e uma para pontos no tempo.

Também é útil examinar o conjunto de dados de uma perspectiva de normalização. Para isso, começaremos com todas as informações em uma única tabela (apenas 7 linhas mostradas):

Em termos da primeira forma normal, todas as colunas são atômicas e não há colunas duplicadas, e podemos, com um pouco de esforço, encontrar uma chave primária (composta): precisamos de uma combinação de data, lon (longitude) e lat ( latitude) para obter um valor único para todas as linhas.

Passando para a segunda forma normal, a coluna elv (elevação) falha imediatamente. A elevação em um determinado local está claramente relacionada à longitude e latitude do local, mas tem muito pouco a ver com a data. Precisamos de uma nova tabela para armazenar os dados de longitude, latitude e elevação.

O novo design da tabela e as três primeiras linhas de dados são mostrados abaixo.

Esta tabela de & # 8220local & # 8221 está na terceira forma normal. Ele tem uma chave primária (uma combinação de longitude e latitude), e a coluna elv se relaciona diretamente a toda a chave primária.

Voltando à tabela original, as colunas restantes de medições atmosféricas estão todas relacionadas à chave primária - os dados nessas colunas representam uma observação em um local específico em um ponto de tempo específico.

No entanto, agora temos duas tabelas em vez de apenas uma, portanto, devemos ter certeza de que as tabelas estão vinculadas entre si e, para fazer isso, precisamos determinar as relações entre as tabelas.

Temos duas tabelas, uma representando as medições atmosféricas, em vários locais e horários, e outra representando informações sobre os locais. Qual é a relação entre essas tabelas? Cada local (cada linha da tabela de local) corresponde a várias medições, mas cada medição individual (cada linha da tabela de medição) corresponde a apenas um local, então a relação é de muitos para um.

Isso significa que a tabela de medidas deve ter uma chave estrangeira que faça referência à chave primária na tabela de localização. O design pode ser expresso assim:

Ambas as tabelas possuem chaves primárias compostas. A measure_table também tem uma chave estrangeira composta, para se referir à chave primária composta na location_table. Finalmente, as colunas longitude e latitude têm funções tanto na chave primária quanto na chave estrangeira de measure_table.

Um possível ajuste ao design do banco de dados é considerar uma chave substituta de auto-incremento - uma coluna que corresponde apenas ao número da linha na tabela - como a chave primária para a tabela de localização, porque a chave primária natural é muito grande e pesado. Isso leva a um design final que pode ser expresso como a seguir.

Outro ajuste seria dividir a coluna de data em uma tabela separada. Isso é parcialmente motivado pela ideia de integridade de dados, uma tabela separada para datas garantiria que todas as datas em measure_table sejam datas válidas. Além disso, se a tabela de datas usa uma coluna de ID de incremento automático, a coluna de data em measure_table pode se tornar apenas um número inteiro simples, em vez de um valor de data extenso. Finalmente, a tabela de informações de data pode ter as informações de ano e mês divididas em colunas separadas, o que pode tornar mais útil trabalhar com as informações de data.

O design final do banco de dados do Data Expo é mostrado abaixo.

Como uma verificação final, devemos confirmar se todas essas tabelas satisfazem a terceira forma normal.

Cada tabela tem uma chave primária, todas as colunas são atômicas e não há colunas duplicadas, portanto, a primeira forma normal é satisfeita. Todas as colunas em cada tabela correspondem à chave primária da tabela - em particular, cada medição em measure_table corresponde a uma combinação particular de data e local - portanto, a segunda forma normal também é satisfeita. A maioria das tabelas também satisfaz a terceira forma normal porque as colunas geralmente se relacionam apenas à chave primária na tabela. No entanto, pode-se argumentar que, na tabela_data, as colunas de mês e ano estão relacionadas à coluna de data, bem como à chave primária da tabela. Esta é uma boa demonstração de uma possível justificativa para a desnormalização - dividimos essas colunas porque prevemos que serão úteis para fazer perguntas ao banco de dados no futuro. As idéias de normalização devem ser usadas como guias para obter um design de banco de dados sensato, mas outras considerações também podem entrar em jogo.

As seções anteriores demonstraram que os bancos de dados são muito mais complexos do que a maioria das outras opções de armazenamento de dados neste capítulo. Nesta seção, veremos o que podemos ganhar usando um banco de dados para armazenar um conjunto de dados e quais são os custos em comparação com outros formatos de armazenamento.

O modelo de dados relativamente formal de bancos de dados relacionais e os processos relativamente complexos que entram no projeto de uma estrutura de banco de dados apropriada valem a pena porque a estrutura resultante impõe restrições aos dados em um banco de dados, o que significa que há verificações sobre a precisão e consistência de dados que são armazenados em um banco de dados. Em outras palavras, os bancos de dados garantem melhor integridade dos dados.

Por exemplo, a estrutura do banco de dados garante que todos os valores em uma única coluna de uma tabela sejam do mesmo tipo de dados (por exemplo, são todos números). É possível, ao configurar um banco de dados, impor restrições bastante específicas sobre quais valores podem aparecer em uma determinada coluna de uma tabela. A Seção 8.3 fornece algumas informações sobre este tópico da criação de conjuntos de dados.

Outra característica estrutural importante dos bancos de dados é a existência de chaves estrangeiras e chaves primárias. O software de banco de dados aplicará a regra de que uma chave primária deve ser exclusiva para cada linha em uma tabela e aplicará a regra de que o valor de uma chave estrangeira deve se referir a um valor de chave primária existente.

Os bancos de dados tendem a ser usados ​​para grandes conjuntos de dados porque, para a maioria dos DBMS, não há limite para o tamanho de um banco de dados. No entanto, mesmo quando um conjunto de dados não é enorme, há vantagens em usar um banco de dados porque a organização dos dados pode melhorar a precisão e a eficiência. Em particular, os bancos de dados permitem que os dados sejam organizados de várias maneiras para que, por exemplo, dados com uma estrutura hierárquica possam ser armazenados de forma eficiente e natural.

Os bancos de dados também são vantajosos porque a maioria dos DBMS fornece recursos avançados que estão muito além do que é fornecido pelo software que é usado para trabalhar com dados em outros formatos (por exemplo, editores de texto e programas de planilha). Esses recursos incluem a capacidade de permitir que várias pessoas acessem e até mesmo modifiquem os dados de uma vez e segurança avançada para controlar quem tem acesso aos dados e quem pode modificá-los.

O primeiro custo a considerar é monetário. Os sistemas de banco de dados comerciais oferecidos pela Oracle e pela Microsoft podem ser muito caros, embora existam opções de código-fonte aberto (consulte a Seção 5.6.9) para aliviar essa carga específica. No entanto, também há o custo de adquirir ou contratar o conhecimento necessário para criar, manter e interagir com os dados armazenados em um banco de dados.

Outra desvantagem de usar um banco de dados como formato de armazenamento é que os dados só podem ser acessados ​​usando uma parte específica do software DBMS.

Finalmente, toda a sofisticação e flexibilidade que um banco de dados oferece podem simplesmente não ser necessárias para pequenos conjuntos de dados ou para conjuntos de dados que possuem uma estrutura simples. Por exemplo, um formato binário como o netCDF é muito adequado para um conjunto de dados geográficos onde as observações são feitas em uma grade regular de locais e em um conjunto fixo de pontos de tempo e superará uma solução de banco de dados de uso geral.

O investimento necessário para criar e manter um banco de dados significa que nem sempre será uma escolha adequada.

5 6 7 Flashback: design de banco de dados e design XML

Na Seção 5.5.2, discutimos algumas idéias básicas para decidir como representar um conjunto de dados em um formato XML.

As idéias de design de banco de dados que discutimos na Seção 5.6.3 - entidades, atributos, relacionamentos e normalização - são muito semelhantes às idéias de design XML, embora um pouco mais formais.

Essa semelhança surge do fato de que estamos tentando resolver essencialmente o mesmo problema em ambos os casos, e isso pode ser refletido em uma correspondência simples entre designs de banco de dados e designs XML para o mesmo conjunto de dados.

Como orientação aproximada, uma tabela de banco de dados pode corresponder a um conjunto de elementos XML do mesmo tipo. Cada linha da tabela corresponderá a um único elemento XML, com cada coluna de valores registrada como um atributo separado dentro do elemento. As advertências sobre quando os atributos não podem ser usados ​​ainda se aplicam (consulte a página).

Relacionamentos simples um para um ou muitos para um podem ser representados em XML aninhando vários elementos (os muitos) dentro de outro elemento (o um). Relacionamentos mais complexos não podem ser resolvidos por aninhamento, mas os atributos correspondentes a chaves primárias e chaves estrangeiras podem ser usados ​​para emular relacionamentos entre entidades por meio de elementos XML que não estão aninhados.

5 6 8 Estudo de caso: The Data Expo (continuação)

O conjunto de dados Data Expo consiste em várias medições atmosféricas feitas em muitos locais diferentes e em vários pontos de tempo. Um projeto de banco de dados que desenvolvemos para armazenar esses dados consistia em três tabelas: uma para os dados de localização, uma para os dados de tempo e uma para as medições atmosféricas (consulte a Seção 5.6.5). O esquema do banco de dados é reproduzido a seguir para fácil referência.

Podemos traduzir esse design de banco de dados em um design de documento XML de forma muito simples, criando um conjunto de elementos para cada tabela, com atributos para cada coluna de dados. Por exemplo, o fato de haver uma tabela para informações de localização implica que devemos ter elementos de localização, com um atributo para cada coluna na tabela do banco de dados. Os dados para os primeiros locais são representados assim em uma tabela de banco de dados:

Os mesmos dados podem ser representados em XML assim:

Como um análogo das chaves primárias no design do banco de dados, o DTD para este design XML pode especificar id como um atributo de ID (consulte a Seção 6.2.2).

Um elemento XML para a primeira linha de date_table pode ter a seguinte aparência (novamente com id como um atributo de ID no DTD):

Como há um relacionamento muitos para muitos entre locais e datas, não faria sentido aninhar os elementos XML correspondentes. Em vez disso, os elementos XML que correspondem às linhas da measure_table podem incluir atributos que se referem ao local relevante e aos elementos de data. O código a seguir mostra um exemplo da aparência de um elemento XML de medida.

Para impor a integridade dos dados dos atributos data e local, o DTD para esse design XML especificaria esses atributos como IDREF (consulte a Seção 6.2.2).

5 6 9 Software de banco de dados

Cada produto de software de banco de dados diferente tem seu próprio formato para armazenar as tabelas de banco de dados em disco, o que significa que os dados armazenados em um banco de dados só podem ser acessados ​​por meio de um software específico.

Isso significa que, se recebermos dados armazenados em um formato de banco de dados específico, seremos forçados a usar o software correspondente. Algo que ameniza um pouco esse problema é a existência de uma linguagem padrão para consulta de bancos de dados. Encontraremos essa linguagem, SQL, no Capítulo 7.

Se estivermos na posição de armazenar informações em um banco de dados, há uma série de sistemas de gerenciamento de banco de dados de código aberto completos para você escolher. PostgreSQL 5. 6 e MySQL 5. 7 são opções muito populares, embora exijam algum investimento em recursos e experiência para configurar, porque têm componentes de software de cliente e servidor separados. SQLite 5. 8 é muito mais simples de configurar e usar, especialmente para um banco de dados que requer acesso apenas por uma única pessoa trabalhando em um único computador.

A Seção 7.2.14 fornece uma breve introdução ao SQLite.

Os principais sistemas de banco de dados proprietários incluem Oracle, Microsoft SQL Server e Microsoft Access. A interface de usuário padrão para esses produtos de software é baseada em menus e caixas de diálogo, portanto, eles estão além do escopo e dos interesses deste livro. No entanto, em todos eles, assim como nas interfaces padrão do software de banco de dados de código aberto, é possível escrever código de computador para acessar os dados. Escrever essas consultas de dados é o tópico do próximo capítulo.

Uma chave primária identifica exclusivamente cada linha de uma tabela. Uma chave primária é uma coluna em uma tabela com um valor diferente em cada linha.

Uma chave estrangeira relaciona uma tabela a outra em um banco de dados. Uma chave estrangeira é uma coluna em uma tabela que se refere aos valores na chave primária de outra tabela.

Um banco de dados deve ser projetado de forma que as informações sobre diferentes entidades residam em tabelas separadas.

A normalização é uma forma de produzir um bom design de banco de dados.

Os bancos de dados podem lidar com grandes conjuntos de dados e conjuntos de dados com uma estrutura complexa, mas os bancos de dados requerem um software específico e um certo nível de especialização.

/>
Este trabalho está licenciado sob uma Licença Creative Commons Atribuição-Não-Comercial-Compartilhamento pela mesma Licença 3.0 da Nova Zelândia.