+ All Categories
Home > Documents > DataBaseBasico

DataBaseBasico

Date post: 10-Jul-2015
Category:
Upload: smpot
View: 35 times
Download: 0 times
Share this document with a friend
Popular Tags:

of 38

Transcript
  • 5/10/2018 DataBaseBasico

    1/38

    ! .

    I'CAPI'T'ULOConceitos Basicos de Bencos

    de Dados Rela.cionais

    Entendendo a estrutura de um banco de dados Consultando bancos de dados relaclonals Objetos de bancos de dados: tabelas, rndlces, visoes Chaves prlmarlae e estrangelras Relaclonamentos NormallzaQio de bancos de dados Integrldade de bancos de dados

  • 5/10/2018 DataBaseBasico

    2/38

    28 Dominando a Programar;ao de Banco de Dados com Visual Basic 6.0 Cap. 2

    S voce sabe 0 que e urn banco de dados e ja projetou bancos de dados simples com 0Access,pode pular este capitulo e ir para 0Capitulo 3, que compreende as ferramentas que vern com 0Visual Basic (e outros produtos do Visual Studio). Se voce nao desenvolveu nenhuma prograrnacaode banco de dados com 0Visual Basic, recomendamos que estude este capitulo. Antes de analisar asferramentas do VB e importante aprender sobre os principios basicos do projeto de banco de dadose familiarizar-se com os termos basicos utilizado ate 0final do livro: tabelas, indices, relaeionamentos,chaves primaries e estrangeiras, integridade referendal e diversas outras coisas.

    Este capitulo compreende os prindpios de bancos de dados e explica a natureza dos bancos dedados relacionais, por que usamos uma metodologia espedfica para projeta-los e outros topicosrelacionados, incluindo a normalizacao de bancos de dados. Uma parte importante deste capitulo ea discussao sobre a estrutura dos bancos de dados de exemplo Northwind e Pubs, bern como 0bancode dados Biblio. 0 Northwind acompanha 0Visual Basic (a versao Jet do banco de dados) e 0SQLServer, enquanto 0Pubs acompanha somente 0SQL Server. 0 Biblio e urn banco de dados Jet de exemploque acompanha 0Visual Basic, e 0converteremos para 0SQL Server a fim de utiliza-lo nos exemplosdos proximos capitulos dentro do Access e do SQL Server.NOTA Para facilitar a leitura deste capitulo, nao me aterei as especificidades das ferramentasque acompanham 0 SQLServer ou 0Access; ha uma grande quantidade de Informacaosobre como criar e editar bancos de dados com ferramentas do Visual Basic no pr6ximocapitulo. Contudo, se voce esta familiarizado com esses produtos, use as ferramentasque voce conhece para analisar os bancos de dados dos exemplos discutidos neste capitulo.

    Por que analisar a estrutura de urn banco de dados existente em vez de criar urn novo a partirdo zero? Porque e muito mais facil en tender a estrutura de urn banco de dados, espeeialmente urnbanco de dados construido por pessoas que projetaram 0mecanisme dos dados. Dessa forma, essesbancos de dados sao usados nos exemplos dos proximos capitulos para que voce tenha certeza deque entende suas estruturas.Este capitulo apresenta conceitos de bancos de dados relaeionais, e 0objetivo nao e ensinar comoprojetar bancos de dados corporativos. Na verdade, voce nao preeisa saber projetar bancos de dadosantes de comecar a program a-los. Muito pelo contrario, sua experlencia com prograrnacao de bancosde dados e que ajudara voce a obter solidos conhecimentos de ban cos de dados, seus requerimentose limitacoes. Entao, voce achara muito facil projetar urn grande banco de dad os e ate mesmo tornar-se urn especialista em MER (modelagem entidade/relacionamento) e ganhar mais dinheiro tambemlFundamentos do Projeto de Bancos de DadosEm principio, projetar bancos de dados e simples. Mais do que qualquer outra coisa, isso requer bornsenso. Os bancos de dados sao importantes para resolver problemas praticos apresentados no dia-a-dia das corporacoes: arrnazenar e recuperar dados. Problemas praticos requerem solucoes praticas,e os bancos de dados nao tern por base a maternatica ou outros conceitos abstratos.

    Ao projetar urn banco de dados, ha varies pontos importantes que voce deve ter em mente.Primeiro, quaisquer erros no projeto de urn banco de dados aparecerao mais tarde quando voce ten tarextrair dados dele. Se seus dados nao forem bern organizados no banco de dad os, voce nao saberaextrair os dados desejados (ou tera de extrair varias informacoes indesejaveis com dados uteis).

    Outro aspecto importante dos bancos de dados e a integridade. Mesmo 0melhor projeto de bancode dados pode estar inadequado se seus dados estivem invalidos. Se voce nao fizer algo para manter

  • 5/10/2018 DataBaseBasico

    3/38

    Cap. 2 Conceitos Basicos de Bancos de Dados Relacionais 29

    a integridade e a consistencia de seu banco de dados, pode ser que nunca consiga localizar os dad os.l - (Por exernplo, se voce permitir aos usuaries de urn banco de dados alterar 0 nome de uma empresa,lomo recuperara as notas fiscais emitidas para a mesma empresa se seu nome foi alterado?Obviamente, voce nao pode contar com os usuaries para manter a integridade do banco de dad os.

    Urn sistema gerendador de bancos de dados (S~BD) moderno fornece mecanismos internos para ajuda-- * 10nessa tarefa. Tanto 0Access quanto 0SQL Server, por exemplo, garantem a integridade referendalentre tabelas. Se urn diente possui urn ou mais pedidos, 0SGBD nao permitira que voce remova 0c1iente do banco de dad os. Se esse diente for removido, os pedidos correspondentes nao farao referendaa urn cliente valido. Mais it frente neste capitulo, vera como incorporar regras para manter a integridadedo banco de dados.

    Como observara a seguir, 0projeto de urn banco de dados deve ser levado muito a serio, Muitosproblemas em aplicativos de banco de dados podem ser resultantes do projeto. Pergunte a qualquerconsultor que tenha pass ado por uma empresa para analisar projetos de outra pessoa e eJe Jhe diraquantos projetos de bancos de dados ruins estao sendo usados por ai. 0 que aborrece nessa situacaoe 0fato de que os programadores constroem programas questionaveis (para nao dizer coisa pior) emfuncao de projetos inefidentes de bancos de dados. Nem e necessario dizer, e claro, que urn projetopobre de banco de dados nao pode ser otimizado. As consultas serao desnecessariamente lentas e,em muitos casos, desnecessariamente complexas.

    I.J

    ,o Que E um Banco de Dados?Urn banco de dados e urn daqueles objetos muito dificeis de definir, mesmo que todos saibam 0quee. Aqui esta uma definicao simples, que mesmo as pessoas sem experiencia anterior em programacaoentenderao. Urn b anco d e d ado e e urn objeto para armazenar informacoes complexas e estruturadas.omesmo e verdadeiro para urn arquivo ou ate mesmo para arquivo de sistema no seu disco rigido.o que torna urn banco de dados iinico e 0fato de que ele e projetado para facilitar a recuperacao dedados. 0 objetivo de urn banco de dados nfio e apenas armazenar inforrnacoes, mas recupera-lasrapidamente. Em outras palavras, voce precisa estruturar seu banco de dados para que ele possa serconsultado de forma rapida e eficiente.Bancos de Dados RelacionaisOs bancos de dados que nos interessam sao os relacionais , porque eles tern por base relacionamentosentre seus dados. Os dados sao armazenados em tabelas, e tabelas con tern dad os relacionados ouent idades , como pessoas, produtos, pedidos etc. A ideia e manter as tabelas pequenas e gerenciaveis,pois entidades separadas sao man tid as em suas proprias tabelas. Se voce comecar misturando dientese notas fiscais, produtos e seus fornecedores, ou livros, editoras e autores na mesma tabela, terminaraduplicando informacoes - uma situa~ao altamente indesejavel. Se ha uma regra que deve estar semprecom urn projetista de banco de dados e urn programador e: nao duplique informacoes,

    Claro que as entidades nao sao independentes umas das outras. Por exemplo, os pedidos saode c1ientes especificos, entao as linhas da tabela Customers precisam estar ligadas as linhas da tabelaOrders, que armazenam os pedidos dos c1ientes. A Figura 2.1 mostra urn segmento de uma tabelacom clientes (acima, it esquerda) e as linhas de uma tabela com os pedidos que correspondem a urndos c1ientes (abaixo, it direita). As conexoes entre as linhas das duas tabelas representam re lac ionamentos .Os bancos de dados que nos interessam sao chamados de relacionais porque tern por base seusrelacionamentos. Eu poderia discutir outras estruturas de bancos de dados menos eficientes, mas estenao e urn livro sobre a historia de bancos de dados. as principais bancos de dados modernos saorelacionais.

  • 5/10/2018 DataBaseBasico

    4/38

    30 Dominando a Programacao de Banco de Dados com Visual Basic 6.0 Cap. 2

    FIGURA 2.1Vinculando clientes epedidos comrelacionamentos.s..na_ C"der~,Gif_CIf~, . . . , . , " " " "AST' [Wnn("orco:b:l"o A m " ' " " . . . . . . . . . . . .- [tmlKrdeI . " " " ' - . . . . . . . . . ._.fAMIA fTd4A1.,Job.pjll AtI4Crv: ~~,rt~AWIl4rtFT= t1~!.A".U!t~_ ~A.tt.3sSA t~51~ A((OUtwq~

    '(

  • 5/10/2018 DataBaseBasico

    5/38

    Cap. 2 Conceitos Basicos de Bancos de Oados Relacionais 31

    principal. De qualquer forma, para desenvolver aplicativos de bancos de dados, voce deve entendersua estrutura e nao se intimidar com seu tamanho.NOTA Alern do banco de dados corporativo, muitas empresas rnantem pequenos bancos de

    dados com dados especificos para um departamento ou mesmo para um projeto. A teoriadiz que voce precisa armazenar todos os dados de sua empresa em um mesmo bancode dados, mas estou para ver a corporacao que nao usa varies bancos de dados. Cedoou tarde voce sera chamado para desenvolver um pequeno aplicativo de banco de dadose devera projetar um banco de dados simples.

    Explorando 0Banco de Dados NorthwindAntes de examinarmos os objetos de um banco de dados em detalhes, daremos uma olhada na estruturado banco de dados de exemplo que vern com 0Visual Basic, 0Northwind. Durante 0processo, vocedesenvolvera bons conhecimentos sobre como os bancos de dados relacionais sao estruturados econsiderara as discussoes sobre os objetos de um banco de dados faceis de acompanhar.NOTA o banco de dados Northwind que vem com 0Visual Basic e um banco de dados Jet. 0SQLServer vem com sua pr6pria versao nativa do mesmo banco de dados. Voce podeusar tanto 0Access quanto 0Enterprise Manager do SQLServer para examinar a estruturadesse banco de dad os. 'o banco de dados Northwind armazena informacoes de vendas: os clientes e os produtos da

    Northwind Corporation e pedidos de produtos efetuados por cada cliente com os respectivos precos,descontos, locais de entrega etc. Uma primeira tentativa para gravar todas essas inforrnacoes seria ainsercao de longas Iinhas com cada elemento de informacao sobre cada item pedido (e comprado),seu pre~o, a quanti dade pedida, 0 cliente que fez 0 pedido, 0 funcionario que efetuou a venda, ondeo pedido foi entregue etc.Com um computador excepcionalmente poderoso, voce provavelmente podera recuperar todo tipode informacao desse banco de dados. Nao preciso descrever por que esse t.>squema e ineficiente. 5e 0ruimero do telefone do c1iente muda, voce tera de percorrer esse tonga arquivo e substituir todas asinstancias do ruimero antigo pelo novo. Certamente, a recuperacao da informacao desse banco de dadosnao e nada eficiente; voce tera de escrever codigos para percorrer uma enorme tabela, desde 0 inicioate 0 fim, apenas para localizar algumas Iinhas. Em vez disso, poderemos dividir a inforrnacao quequeremos armazenar no banco de dados em tabelas separadas. Comecarernos com as tabelas queconstituem 0banco de dados Northwind e depois daremos uma olhada nos relacionamentos entreastabelas.As Tabelas do Banco de Dados Northwind\0primeiro passo no projeto de banco de dados e dividir a informacao que voce quer armazenar em* 1 pequenas unidades, as tabelas, e estabelecer relacionamentos entre elas. Para fazer isso, identifiquexa s entidades que voce quer armazenar (produtos, clientes etc) e erie uma tabela para cada entidade.Uma tabela e uma grade: cada Iinha corresponde a um item diferente, mas todos os itens possuem amesma estrutura. A estrutura de uma tabela e determinada por suas colunas e cada coluna representa1. N.R.T.:Caso 0SQLServer fomecido no CD que acompanha este livro instale 0banco de dados NorthwindCSem vez do Northwind, voce pode usar esta versao para 05 exemplos do livro, alterando 0 nome do bancode dados de Northwind para NorthwindCS, onde for necessdrio, no codigo-fonte e nas conexoes de dados,ou usar 0banco de dados Northwind tambem existente no CD. Para instala-lo, repita 0mesmo procedimentodescrito na pagina 59 sobre a instalacao do banco de dados Pubs

  • 5/10/2018 DataBaseBasico

    6/38

    32 Dominando a Programa~ao de Banco de Dados com Visual Basic 6.0 Cap. 2

    urn atributo da entidade armazenada na tabela. Uma tabela que armazena produtos possui uma colunapara 0nome do produto, outra para 0pre;odo produto e assim por diante. Cada produto e armazenadoem uma linha diferente. Como os produtos sao adicionados ou removidos da tabela, 0mimero delinhas altera, mas 0mimero de colunas permanece 0 mesmo: elas determinam a informacao quearmazenamos sobre cada produto. Voce pode adicionar e remover colunas da tabela mesmo depoisde ter entrado com dados nela.Tabela Products A tabela Products armazena informacoes sobre produtos vendidos pela NorthwindCorporation. Essas informacoes incluem 0 nome do produto, embalagem, pre;o e outros camposrelevantes. Alem disso, cada produto na tabela e identificado por uma tinica ID, como mostra a Figura2.2. Nomes de produtos sao faceis de lembrar, mas muito dificeis de digitar em urn forrnulario. Alemdisso, 0nome de urn produto pode ser alterado. Desde que as linhas da tabela Products sao referenciadaspor notas fiscais (a tabela Order Details, que sera discutida rnais tarde), cada nome de produto alteradoacarretaria urn ntimero de alteracoes na tabela Order Details. A ID que identifica cada produto naoprecisa mudar; ele e urn valor numerico que nao carrega informacao significativa sobre 0produto.Assim, usando urn valor numerico tinico para identificar cada produto, voce pode alterar 0nome semafetar quaisquer outras tabelas.FIGURA 2.2Cadalinha na tabelaProducts manterninforrnac;ao sobre urnproduto especifico.

    1 !JG1 E lE 9 ' [C~~1m~;- ;d: ; , I lTf-!Q-' i 'TM,-q ~o: I-~~------ _ . _,. -- -- ,---!~- -- - - - - -- I'_~- :I-1 ChaI I I 10 bo x es x 20 bag: 18 :l9 0 10 01=2 C h o n c ; J I I 24120:_ 19 17 40 z s 01-3 AIl iseed Syr'4' I 2 12 S>;O rrI b < > t t l o s 10 13 70 z s 01-4 t, 2 2 36bo:'M 21.3'.; 0 0 0 I1-6 G r on c tn o ', ll oy oc ri > ef ry S p rC 4 d 3 2 12 eo: jot, 0.6ZS 120 0 z s 01-7 Lndo e c o ' , Or~ C.1ed Po.". 3 7 121 t J l l I < 9 s . 0.75 15 0 10 0i ! - - 8 Nort tMoods Cru 6 8 ,ZI~bo, 6 24 0 5 0l-f- 14 Tofu 6 7 ill00 9 1 l I < 9 s , Z 3 . Z S 3'.; 0 0 015 Genen Shovyu 6 2 Z4ZSOrrl_ IS,S 39 0 5 0 .= JI - . - r- I /.

    As colunas SupplierID e CategoryID contem valores inteiros que apontam para linhas de duasoutras tabelas, as tabelas Suppliers e Categories, respectivamente. Essas duas tabelas contern informacoessobre os fornecedores da Northwind Corporation e varias categorias de produtos.NOTA A informacao do fornecedor nao pode ser armazenada na tabela Products. porque 0nome e 0 enderec;o do fornecedor poderiam ser repetidos em varies produtos.

    TabeJa Suppliers Cada produto no banco de dados da Northwind tern urn fornecedor. Uma vezque 0mesmo fornecedor pode oferecer rnais de urn produto, a informacao do fornecedor e armazenadaem uma tabela diferente, e urn campo comum, 0campo SupplierlD, e usado para ligar cada produtoa seu fornecedor. Por exemplo, os produtos Mishi Kobe Niku e Ikura sao adquiridos do mesmofornecedor, Tokyo Traders. Seus campos SuppliersID apontam para a mesma linha na tabela Suppliers,como mostrado na Figura 2.3.Tabela Categories AMm de possuir urn fornecedor, cada produto pertence a uma categoria. Ascategorias nao sao armazenadas com os nomes dos produtos, mas em uma tabela separada, a tabelaCategories, cuja estrutura e mostrada na Figura 2.4. Novamente, cada categoria e identificada porurn valor numerico e tern urn nome (os campos CategoryID e CategoryName, respectivamente).Complementando, a tabela Categories possui mais duas colunas: Description, que contern texto, e Picture,que armazena uma imagem.

  • 5/10/2018 DataBaseBasico

    7/38

    Cap. 2 Conceitos Basicos de Bancos de Oados Relacionais 33

    A tabela Products (volte a Figura 2.2) possui uma coluna CategoryID que liga cada produto asua categoria. Armazenando as categorias em uma tabela separada, voce nao precisa digitar 0nomeda categoria (ou sua imagem) em cada produto. 0 campo CategoryID da tabela Products aponta paraa categoria do produto, e voce pode localizar cada categoria de produto muito rapidamente na tabelaCategories.

    Ocampo CategoryID na tabela Categories e a chave primaria porque ele identifiea cad a linhada tabela. Cada categoria possui urn iinico CategoryID, que pode ser repetido muitas vezes na tabelaProducts. 0 campo CategoryID na tabela Products e uma chave estrangeira.FIGURA 2.3Vinculando produtos a CM I 10 box" )I 20 bo ! q 18 'J9Chong 2

  • 5/10/2018 DataBaseBasico

    8/38

    34 Oominando a Programa~ao de Banco de Oados com Visual Basic 6.0 Cap. 2

    e depois localiza todas as linhas na tabela Products com 0campo CategoryID que coincidem com aID selecionada. 0 relacionarnento entre as duas tabelas vincula cada linha da primeira tabela comuma ou mais linhas da segunda tabela, e voce vera em breve como os relacionarnentos sao definidos.

    ( -N-O..,........T--A----A-o-p-e-r-a-~a---d-e-c-o-in-c-id-e-n-c-ia-d-e-li-n-h-a-se-m-d-u-a-s-(-o-u-m-a-is-)ta-b-e-Ia-s-c-o-m-b-a-s-e-e-m-su-a-s-c-h-a-vprimarias e estrangeiras e chamada de jun~ao (join). Juncoes sao operacoes muito basicasna manipula~ao de tabelas e serao discutidas em detalhes no Capitulo 4.Tabela Customers A tabela Customers, mostrada na Figura 2.5, armazena informacoes sobre osclientes da empresa. Antes de aceitarmos urn pedido, devemos criar uma nova linha na tabela Customerscom os dados do c1iente (nome, nurnero de telefone, endereco etc.), se ainda nao existir. Cada linhana tabela Customers representa urn c1iente diferente que e identificado pelo campo CustomerID. Estecampo possui urn valor iinico para cada linha e e semelhante ao campo ProductlD da tabela Products.No entanto, 0campo CustomerID e uma string de cinco caracteres e nao urn mirnero inteiro.FIGURA 2.S ecr.t.odf..""., CofIWt1llleA tabela Customers. o . O < h e r 'b I . ( ~essen s_~ Order~rt l."Du monde erobe< ~Lobr" " , e-E o s te r n COMe< t .. .. ArnDevon ~~

    Erns t Hondd Poland Mendo ! ~~FomAo AlQUJbo !do AI", Cruz M4 r~ "t n g A , S lS t o n tF IS S A F . c. ita I nte r. Sa !c t . c h a s S.A . D le90 Roe ! Ac c oo n tn g ManaQorF o Ie < OOUm . o nd e s M4rtr", Pone. A'W a n t ~ A ? e n tFoII

  • 5/10/2018 DataBaseBasico

    9/38

    Cap. 2 Conceitos Basicos de Bancos de Dados Relacionais 35

    A tabela Orders e vinculada a tabela Customers por meio do campo CustomerID. Coincidindolinhas com valores identicos de campos CustomerID nas duas tabelas, podemos relacionar urn dientea seus pedidos.Tabela Order Details Voce provavelmente notou que a tabela Orders do banco de dados Northwindnao armazena detalhe algum sobre os itens pedidos. Essa informacao e armazenada na tabela OrderDetails (veja a Figura 2.7). Cada pedido e compos to por urn ou mais itens e cada item tern urn preco,uma quantidade e urn desconto. Alem desses campos, a tabela Order Details contem a coluna OrderID,que possui 0 ruimero do pedido ao qual a linha de detalhe pertence. Em outras palavras, os detalhesde todas as notas fiscaisestao lancados nessa tabela e organizados de acordo com 0pedido a que pertencem.

    FIGURA 2.7A tabela Order Details.

    11.2"7 7.6 161" 18.6 10 021 10 0.171 17.2 40 0.152 5.6 8 0 _J6< 1 10 10 02 15.2 7 0231 10 zs 0.232 ZS.6 6 0.251 '2.' 48 0.2 17.6 18 0.123 72 < \0a R9 ~36 15.2 2037 20.8 2872 27.0 ZS 0 .:J--'------...-..~-----r----f-----~

    Os detalhes naO estao armazenados com 0cabecalho do pedido porque as tabelas Orders e OrderDetails armazenam entidades diferentes. 0 cabecalho do pedido que contern informacoes sobre 0clienteque fez 0pedido, a data do pedido etc. e bern diferente da informacao que voce deve armazenar paracada item pedido. Tente fazer urn projeto diferente que armazena todas as informacoes relacionadasao pedido em uma unica tabela e percebera que acabou duplicando informacao, A Figura 2.8 mostracomo tres tabelas no banco de dados Northwind - Customers, Orders e Order Details - sao ligadasumas as outras.

    FIGURA 2.8Vinculando clientes apedidos e pedidos a seusdetalhes.

    ,C,_OAACO Dr~ DdMi:Ksm S'nOtticl> Order AOrnstrI'.tOlo o . . o o : > N OutrJOl'ldcCt'Cier . l4nno t.ltJrln! Owne r

    ~ EM t e t" I 'I C ome c tl o n A m " " " " "5 0 1 0 < _

    NS H ErnstHardd . o W o d _ So I o< __fAMlA f .. ,. ,. . .. _ A r I4CrUZ H.wUtr.gAsscstnfl'~ FJSSAfabr ico Wet '. 5 .a lchch~ S ,A , I > c9 > P . .. ""' ...."9 __FOUG F*s_- ..... t..,AMCO As~ant SRs Aoer tFUO Fol.ochfUti M.w I4L .Qrs~ Owne r"'Alit. Frri.enverwd PetCf "..un ....-'9__Ffl_ Ff.:t"'a res t l J . . l 'ObOn (. ....,Sdnct . . . ., _ - -'A16 Fr$"lChSp,A P4ObAw:rtJ s - " " ' . . . . . . . . . . .1- " " " " < 0 l I l l = - 1_ 1_ 10.._1_1= 2 IS: so 02I~ CO O C 1= S t7 ss 0_1102

  • 5/10/2018 DataBaseBasico

    10/38

    36 Oominando a Programa~ao de Banco de Oados com Visual Basic 6.0 Cap. 2Explicarei por que 0 total do pedido nao aparece em tabela alguma: para calcular 0total de urn

    pedido, voce deve multiplicar a quantidade pelo pre~o, levando em consideracao 0 desconto. Se 0total do pedido fosse armazenado na tabela Orders, voce estaria duplicando informacao. Em outraspalavras, voce poderia recuperar a mesma informacao de duas tabelas diferentes, e nao ha garantiade que os valores seriam sempre os mesmos.Tabela Employees Esta tabela mantem informacao de funcionarios. Aparentemente, os funcionariosda Northwind Corporation trabalham sob comissao e precisamos saber quais vendas eles fizeram.Quando uma venda e feita, 0 ID do funcionario que fez a venda e gravado na tabela Orders.Tabela Shippers Finalmente, a Northwind Corporation usa tres transportadoras diferentes. A tabelaShippers mantem informacoes sobre as transportadoras e cada ID de transportadora aparece na tabelaOrders, com a data do pedido, data do transporte, endereco etc.(8) Entendendo RelacionamentosEm urn banco de dados, cada tabela possui urn campo com valor unico para cada Iinha. Esse campoe marcado com 0Icone de uma chave a frente de seu nome, como voce pode ver na Figura 2.4, e essecampo e a chave primaria da tabela.A chave primaria nao precisa ser uma entidade significativa, porque em muitos casos nao hanenhum campo que seja iinico para cada Iinha. A chave primaria nao precisa representar a entidadeque a identifica. A iinica exigencia e que as chaves primaries sejam unicas na tabela inteira. A ReceitaFederal usa os mimeros de CPF para identificar pessoas de forma tinica, mas uma empresa de vendaa varejo nao pode necessariamente utilizar essa informacao para todos os seus c1ientes (pois podehaver clientes sem CPF). Alguns produtos pod em ter identificacoes iinicas, que podem ser usadascomo chaves primarias. Os Iivros possuem os ruimeros ISBN, mas nem todos. Urna lese catalogadaem uma biblioteca, por exemplo, nao tern urn ISBN. Usualrnente, criamos IDs de produtos que podemou nao representar 0nome do produto. Entao, 0mesmo produto pode ser catalogado com dois codigoscompletamente diferentes por duas empresas diferentes. Inversamente, 0mesmo codigo pode ser usadopor dois produtos totalmente diferentes em duas empresas diferentes. No entanto, ambos os codigos(IDs) sao tinicos dentro do contexto de cada empresa.

    Em muitos projetos, usamos urn inteiro como chave primaria. Para ter certeza de que eles saoiinicos, podemos deixar 0SCBD gerar urn novo inteiro para cada linha adicionada na tabela. Cadatabela pode ter somente uma chave primaria e esse campo nao pode ser nulo.NOTA Muitas chaves primaries sao construidas artificial mente (pelo usuario ou pelo proprioSGBO).Algumas pessoas criam chaves semi-reais. Por exemplo. ja vi bancos de dadosque usam valores ISBNpara identificar unicamente muitos dos livros. e ISBNfalsos (elescomecam com os digitos 000 ou 999) para representar alguns livros que nao possuemISBNs.Essa abordagem funcionara por um tempo. especial mente se voce conhecer como

    construir ISBNs. mas voce nunca sabera quando isso pod era falhar. 0que acontecerase outra livraria tiver a mesma ideia e eventualmente voce tiver de efetuar neqocios comela? Ha uma chance de dois sistemas de identiflcacao "unicos" colidirem um com 0outro.Se voce nao puder usar uma entidade real como chave prima ria. deixe 0sistema construirchaves (micas (voce vera como isso e feito na se~o "Campos Identity e AutoNumera~ao").As chaves nurnericas nao ajudarao no problema de conflito entre 105. mas elas naopretendem ser globalmente (micas. como os ISBNs.As linhas relacionadas em uma tabela repetem a chave primaria da Iinha a qual ela e relacionada,

    em outra tabela. As copias das chaves primaries em todas as outras tabelas sao chamadas chavesestrangeiras. Chaves estrangeiras nao precisam ser iinicas (de fato, elas nao sao) e qualquer campopode ser uma chave estrangeira. 0que torna urn campo uma chave estrangeira e que ele coincide

  • 5/10/2018 DataBaseBasico

    11/38

    Cap. 2 Conceitos Baslcos de Bancos de Dados Relacionais 37

    com a chave primaria de outra tabela. 0 campo CategoryID e uma chave primaria da tabela Categories,porque identifica cada categoria. 0 campo CategoryID na tabela Products e uma chave estrangeira,porque 0mesmo valor pode aparecer em diversas linhas (muitos produtos podem pertencer itmesmacategoria). Quando voce relaciona as tabelas Products e Categories, por exemplo, voce tambem devese assegurar de que:Todo produto adicionado na tabela estrangeira aponta para uma entrada valida na tabela

    primaria. Se voce nao tern certeza sobre a qual categoria 0produto pertence, pode deixar 0campo CategoryID da tabela Products vazio. As chaves prim arias, no entanto, nao podem sernulas.Nenhuma linha na tabela Categories e removida se houver linhas na tabela Products apontandopara a categoria especifica. Isso fara a linha correspondente da tabela Products apontar parauma categoria invalida,

    Essas duas restricoes deveriam ser quase uma obrigacao d_

  • 5/10/2018 DataBaseBasico

    12/38

    38 Dominando a Proqramacao de Banco de Dados com Visual Basic 6.0 Cap. 2

    As linhas da grade menor sao chaves primarias em outro relacionamento, isto e,0relacionamentoentre as tabelas Orders e Order Details. Para visualizar as linhas relacionadas das tabelas Order Details,de urn clique no leone do sinal de adicao it frente de urn pedido. As Iinhas que correspondem ao pedidoselecionado aparecerao em outra grade, como mostrado na Figura 2.10. 0Access 2000 permite quevoce visualize relacionamentos nao apenas na estrutura do banco de dados, mas tam bern nos dadosatuais armazenados nas tabelas.FIGURA 2.10Visualizando relacionamentoscom 0 Access 2000.

    _ PIXContednllo _i II slD m ar 1 0 CompllQ Numo Conted Nllmo J. AlFKI Alfred, FulIori",te ManaAnders SalesRepresentat~:::: ANATR AnaTrujilloEmparedadosy helados Ana Trujillo o,."or~ - ANTON AntonioMoronoTaquerl' AntOniOMoreno o,."or

    O n ta r 10 E m _ jllC lY llo O n to r 0 1110 Require d Da lo S h lp lIC d 0 1110 S h ip V ia

    OtA,M ,

    Frel!l irt1 . ~ LO>elhng.anet 26-De:94 25-Jan-95 02Jan-95UnrtedPackage1- 10507King. Robert 16-Ma.95 13-Jun-95 23-M.~95 SpeedyElpre ss- 10535Peacock. M',garet 13-Jun-95 "-Ju~95 21Jun-95SpeedyElple ssProdud Un" Prlco QuanUlY1Discount

    ~S22 .00~$47,45~SI5.64

    I- OuesoCabra les $21.00 50 10%I- BostonClabMo.t $16.40 10 10%I- Ra / l o lo Angelo $19.50 5 10%..", Racl.tte Could..,aull $55,00 15 10%~ ~ _ _ _ _ _ _ _ S O .O O 1 0%

    10573K'"g, Robo~ 2O-Ju~95 17.Ago-95 21Jul-95FederalShipping 10677Davobo, Nancy 23-001,95 2Q.N",,95 27-0ul-95 Fedelal Shipping 10662Lowll,ng. J.net 26-00195 23-N....95 01-N....95 UMed Packago 10856Le,elilng,Janet 28-F....96 27Mal-$ t2-Mal-$ UMed PackagoI- .. _-,mor.~~~_ _~ __I- AAOUT AroundthoHornI- BERGS. BelglundssnabbkopR09SIN: . ! ! . W J . - - - . . , .'1' do 7

    U84 .B4R54.031136,131$56.43_BS( ) . ( l j

    1 2 1JThomasHardyChnstmaBerglund.1 Sal Represen!"!",oOrde r Admlnlstra10r1NOTA Uma nota para programadores VB: 0 controle que exibe as linhas de varies tabelasrelacionadas no Access nao esta disponivel no ambiente Visual Basic. Isso provavelmentesera incluido como um controle ActiveX na proxima versao da linguagem. No Capitulo

    10 voce aprendera sobre 0 controle MSFlexGrid, que e similar ao controle do Accessmostrado na Figura 2.10 e e usado para exibir cursores hierarquicos,Consultando Bancos de Dados RelacionaisAgora consideraremos as operacoes mais comuns que voce gostaria de executar nas tabelas do bancode dados Northwind. 0processo de recuperacao de dados das tabelas e conhecido como con su l to r(querying) e as instrucoes que voce executa no banco de dados para recuperar linhas selecionadas saochamados c o n su l ta s ( qu e ri es ). Essas instrucoes sao escritas em SQL (Structured Query Language), quee discutida em detalhes no Capitulo 4. Nesta secao, olharemos alguns exemplos de consultas e comoo SGBD combina linhas de diversas tabelas para retomar os dados que nos interessam.Recuperando Pedidos de ClienteEsta e, provavelmente, a operacao rnais comum que alguem executaria em urn banco de dados comoo Northwind. Para recuperar pedidos de urn cliente, inicie com 0 ID do cliente e localize todas aslinhas na tabela Orders em que 0 campo CustomerID coincida com 0 campo CustomerlD da linhaselecionada na tabela Customer. Para recuperar os pedidos do cliente, 0SGBD deve pesquisar a tabelaOrders com a chave estrangeira. Para ajudar 0SGBD com essa operacao, voce deve indexar a tabelaOrders pelo campo CustomerID. As duas versoes do banco de dados Northwind definern urn fndicenesse campo.Calculando 0Total de Cada PedidoA tabela Orders nao con tern 0 total de cada pedido - nem deveria. Os totais devem ser calculadosdiretamente a partir dos detalhes. Conforme mencionado anteriormente, os bancos de dados nfio devem

  • 5/10/2018 DataBaseBasico

    13/38

    Cap. 2 Conceitos Basicos de Bancos de Dados Relacionais 39

    duplicar inforrnacao, e armazenar os totais na tabela Orders seria uma forma de duplicacao (voceduplicaria a inforrnacao que ja esta presente em outra tabela). Se voce armazenar os totais com cad apedido, entao toda vez que alterar uma linha de detalhe, tambern precisara alterar uma linha na tabelaOrders.

    Para calcular um total de pedido, 0 SGBD deve pesquisar a tabela Order Details com a chaveestrangeira (OrderID) e somar 0resultado da multiplicacao das quantidades de produtos pelos pre~os,para todas as linhas que pertencerem a um pedido especifico (levando em consideracao 0 desconto).Para ajudar 0SGBD com essa operacao, voce deve indexar a tabela Order Details pelo campo OrderID.As duas versoes do banco de dad os Northwind definem um Indice no campo OrderID.Calculando 0Total para Cada ClienteEsta operacao e semelhante a totalizacao de um pedido, mas ela envolve tres tabelas. Inicie com a IDdo c1iente e selecione todas as linhas na tabela Orders em que 0 campo CustomeriD coincida com aID do c1iente especifico. Essa e uma lista com as IDs dos pedidos do cliente selecionado. Entao, percorratodas as Iinhas da tabela Order Details onde 0 campo OrderID esta nessa lista e some 0 resultado damultiplicacao das quantidades de produtos pelos pre~os.Executando Consultas Mais Complicadaso tipo de informacao que um gerente pode querer de um banco de dados nao pode ser classificadoou enumerado. Voce pode executar consultas complicadas como a localizacao de um estado ondedeterminado produto e mais popular, os produtos mais vendidos em cada mes ou trimestre etc. Todainformacao esta no banco de dados, portanto, a questao e combinar os campos apropriados das variastabelas para extrair a informacfio que voce necessita para tomar melhores decisoes,

    Na pratica, as consultas envolvem varias tabelas e seus relacionamentos. As chaves prirnariase estrangeiras sao conceitos fundamentais na consulta de bancos de dados, e mais, e um dos aspectosmais importantes no projeto de bancos de dados. Como vera no Capitulo 4, 0aspecto mais dificil doSQL c ligar varias tabelas com base em seus relacionamentos.@ Objetos de Bancos de DadosAgora que voce ja conhece os conceitos basicos (e objetos) de um banco de dados relacional por meiode exemplos, deve ter uma boa ideia do que e um banco de dados relacional. Voce sabe como os dadossao armazenados em tabelas separadas no banco de dados e como tabelas sao ligadas a outras pormeio de relacionamentos. Vocesabe tarnbem como os relacionamentos S.10 usados para executar consultascomplicadas que recuperam dados de varias tabelas. Tenho certeza de que, se voce tem diividas tecnicassobre atributos espedficos, elas serao resolvidas nas proximas secoes deste capitulo. Comecaremosnossa discussao detalhada sobre objetos de um banco de dados relacional com 0mais basico dos objetos,as tabelas,

    o TabelasUma tabela e uma colecao de linhas com a mesma estrutura que arrnazena informacoes sobre umaentidade como uma pessoa, uma nota fiscal, um produto etc. Cada linha contern 0mesmo mimerode colunas e cada coluna pode arrnazenar dados do mesmo tipo. Voce pode imaginar urna tabela comouma grade ou um arquivo de acesso aleatoric que armazena registros. Como voce sabe, cada registroem urn arquivo de acesso aleatorlo tem a mesma estrutura, e voce nao pode ler ou gravar dados parao arquivo a nao ser que conheca a estrutura dos registros que ele possui. Provavelmente nao e necessariomencionar isto, mas qualquer sernelhanca entre tabelas e arquivos de acesso aleatoric terrnina aqui,

    Um SGBD como 0SQL Server ou 0Access nfio arrnazena tabelas em arquivos separados, Todosos dados estao em um iinico arquivo, com informacao au xiliar necessaria pelo SGBD para acessa-lasrapidamente. Na realidade, 0SGBD utiliza mais espa~o para arrnazenar inforrnacoes auxiliares do

  • 5/10/2018 DataBaseBasico

    14/38

    40 Dominando a Programa~ao de Banco de Dados com Visual Basic 6.0 Cap. 2

    que propria mente para os dados. As tabelas de um banco de dados sao uma abstracao: elas formamum modele conceitual de dados. E assim que vemos 0banco de dados. As tabelas nao refletem a estruturaatual dos dados em um banco de dados. Em vez disso, refletem as entidades em nosso banco de dadose as relacoes entre tabelas refletem acoes (produtos sao comprados , clientes fazem pedidos etc.).

    Intemamente, todo SGBD armazena informacao em um formato proprietario, e nao precisamossaber qualquer coisa sobre esse formato. De fato, essa e uma das exigencies do modele de banco dedados relacional: A es iru tu ra fis ic a po de m ud ar, m as e sta m ud an ca n iio d eo e a fe ta r c om o vem os 0 b an co d ed a d o s . A Microsoft pode alterar a estrutura fisica dos dados em um arquivo MDB, mas 0Accesspermanecera venda tabelas e indices e ainda sera capaz de relacionar tabelas com outras usando valorescomuns de campos (as chaves primaria e estrangeira), e seus aplicativos continuarao funcionando.Voce vera as mesmas tabelas, as mesmas instrucoes SQL recuperarao os mesmos dados e voce nemmesmo notara a diferenca (com certeza, havera outros recursos, mas os aplicativos existentes continuaraofuncionando sem quaisquer modificacoes).

    Clientes e Fornecedores: Mesmas Entidades,Fun~6esDiferentesVoci! notara que astabelas Customers e Suppliers do banco de dados Northwind possuem exatamentea mesma estrutura. Tao logo as opera4joes de um aplicativo sao concebidas, clientes e fornecedoressao duas entidades separadas, e nao ha sobreposit;ao entre elas. Essanao e uma situa4jao incomum,em que duas entidades diferentes possuem a mesma (ou quase a mesma) estrutura.

    Nao se esqueca de que 0Northwind e um banco de dados de exemplo. Em uma situa4jaoreal, as duas tabelas podem nao estar total mente isoladas, pois a mesma empresa pode atuarcomo um fornecedor ou como um cliente. Em outras palavras, ela pode nao apenas vender parasua empresa, como tarnbern pode comprar. Em meus aplicativos, utilizo uma tabela unlca paraclientes e fornecedores. Essaabordagem pode complicar um pouco a programa4jao, mas simplifieaas opera4joes do ponto de vista do usuarlo, Se voce nao sabe que um fornecedor e tambem umcliente, voce pode terminar pagando pelos itens que voce comprou normal mente e nunca saberque a outra parte nao esta cumprindo com suas obriga4joes. H a outras razoes praticas para tratarclientes e fornecedores como uma unlca entidade, por exemplo, um fornecedor que e tarnbemum bom cliente.

    (~_~. Criando TabelasPara criar uma tabela voce deve especificar sua estrutura declarando suas colunas: especifique quantascolunas a tabela tem, seus nomes e tipos. Independente de qual SGBD voce esta usando, veja aquicomo as tabelas sao criadas:

    1. Defina um nome para a tabela. Nomes de tabelas podem ser bem longos, en tao, voce deveatribuir um nome compativel com a entidade que ela representa. Nomes de tabelas, assimcomo os nomes de campos, podem incluir espacos, contanto que voce se lembre de envolve-los com um par de colchetes ([Detalhes de Pedidos], [Vendas na Europa] e assim por diante)em seu codlgo.

    2. Defina um nome para cada coluna (ou campo) da tabela. Colunas sao os atributos da entidaderepresentada pela tabela. As colunas de uma tabela que armazena clientes deveriam provavel-mente conter 0nome do cliente, endereco, mimeros de telefone, enderecos eletronicos etc. Ascolunas de uma tabela que armazena notas fiscais deveriam conter 0mimero da nota fiscal,a data de emissao, endereco de entrega etc.

    3. Decida 0 tipo de dados para cada coluna. Uma vez que colunas diferentes armazenarn itensdiferentes de informacoes, seus tipos devem corresponder. Uma coluna que armazenaquantidades deve ser definida como inteiro, enquanto uma coluna que armazena pre~os deve

  • 5/10/2018 DataBaseBasico

    15/38

    Conceitos Basicos de Bancos de Dados Relacionais 41ap. 2

    ser de finida como moeda. Par outre lado, urna coluna que armazena datas deve ser definidade acordo.

    NOTA Di.ferentes SGBDs usarn nornes diferentes para os tipos de dados que aceitam, ja queeles aceitam todos as tipos basicos de dados. Voce aprendera sabre as tipos de dadosaceitos pela Access e SQL Server no Capitulo 3. Quando voce programa bancos de dadospar meio do componente ADQ, pode usaf constantes ADO para cada tipo, independentedo nome utilizado pelo SGBD para descrever cada um dales, A Tabela 2 ..1, apresentadamais adiante neste capitulo, mostra os tipos de dados aceitos pelo Access e SQL Servere a constante ADO para cada tipo de dado.

    IS50 e tudo de que voce precisa para projetar lima tabela. Se mais tarde decidu glle precise deuma coluna adicional, voce sempre pode adicionar urna nova, sern afetar a estrutura au 0 conteiidodas colunas existentes. Voce vera as ferrarnentas para c.r iaIO ~ ~o : 1 : 0 o > t- .; n . ~ ....we. I.. _ e s .-.Lndo, ..._.!'re>_.., f J pot. ~" " ' * ' < 0

    '""""'~~.".,."

    '.

    FIGURA 2.12Projetando urna tabslano Enterprise Managerdo SQL Server. .

    r:II lIft~rrv~chllr" ' " " cN r 0f'Nardw IS n 0nYNthat" rs 0 0' r rv~rchl l r ,0 ,0 :"",,,,,,", .s 0 0. . . . ., , " " 2' 0 DrP< , ""cNr 2. 0 ~

  • 5/10/2018 DataBaseBasico

    16/38

    42 Dominando a Programa~ao de Banco de Dados com Visual Basic 6.0 Cap. 2Cad a coluna deve ter urn nome com no maximo 64 caracteres de tamanho (para bancos de dados

    Access e SQL Server). 0 tipo de dado da coluna pode ser seleeionado de urna lista e pode ter urn dosvalores mostrados na Tabela 2.1. Note que 0Access e 0SQL Server nao reconhecem os mesmos tiposde dados (entretanto, os tipos de dados mais comuns sao comuns a ambos). Voce nfio precisara veras constantes listadas na Tabela 2.1 quando estiver projetando tabelas com Access ou SQL Server, masesse e 0valor que voce deve espeeificar quando programar bancos de dados utilizando ADO.TABELA 2.1 Tipos de dados Access e SQLServer.Constante Access SQL ServeradBinaryadBooleanadCharadCurrencyadDateadDBTimeStampadDecimaladDoubleadGUIDadlntegeradLongVarBinaryadLongVarCharadNumericadSingleadSmalllntadTinylntadVarBinaryadVarChar

    Sim/Naobinarybitcharcurrency. smallmoneyDatetime. smalldatetimetimestampDecimal. numericfloatuniqueidentifierinto identityimagetextdecimal. numericrealsmallinttinyintvarbinaryvarchar

    MoedaData/HoraData/HoraDuploC6digo de replicacaoInteiro longo. AutoNumerac;aoObjeto OLEMemorandoSimplesInteiro

    Inserindo Dados em TabelasHa muitas forrnas de carregar dados em tabelas dos bancos de dad os. Voce pode usar instrucoes SQL:a instru~ao INSERT adieiona uma nova linha na tabela e atualiza seus campos com 0valor espeeificadono comando. Voce pode tambem abrir a tabela e edita-la, Tanto 0Access quanto 0SQL Server aceitamesse tipo de edi~ao direta. Simplesmente de urn clique duplo no nome da tabela Access, ou de urnclique com 0 botao direito do mouse sobre 0 nome da tabela SQL Server e selecione Open Table ;..Return All Rows no menu flutuante. A proposito, 0SQL Server e urn SGBD e nao urn ambiente visualpara acessar e manipular dados. 0 Access e primariamente urn aplicativo "front-end", en tao e maisfacil editar tabelas Access do que tabelas SQL Server. Finalmente, voce pode escrever aplicativos VBque possibilitam aos usuarios editar tabelas por meio de interface apropriada. Obviarnente, esse e 0metodo recomendado, por possibilitar a validacao dos dados e proteger 0banco de dados contra errosdo usuario. Voce encontrara muitas informacoes neste livro para a construcao de interfaces funeionaise praticas com 0Visual Basic.

    ()('; Valores Nulos\ ~-'" Se voce nao esta [amiliarizado com a programacao para banco de dados, provavelmente nao utilizou

    valores nulos ainda, e sera surpreendido sobre a importancia dos valores nulos para bancos de dados,Urn valor 111110 significa que 0valor do campo atual e desconhecido. Urn campo numerico com urnvalor zero nao e urn campo nulo. Assim como uma string de espa.;os em branco tambern nfio e urnvalor nulo.

  • 5/10/2018 DataBaseBasico

    17/38

    Cap. 2 Conceitos Sasicos de Sancos de Oados Relacionais. 43

    ~/'

    Valores nulos foram introduzidos para tratar dados incompletos ou de excecao, e eles devemser manuseados de uma maneira especial. Urn campo em que nao foi assinalado urn valor e consideradoincompleto. Se esse campo e envolvido em uma operacao, 0resultado e considerado excepcional, porquenao e zero nem uma string de espa~os em branco. Quando uma nova linha e criada, todas as suascolunas sao configuradas como nulas, e, a menos que voce especifique urn valor, elas perrnaneceraonulas. Voce pode modifiear esse cornportamento-padrao requisitando que certas colunas nao possamser nulas. Se voce tentar adicionar uma nova linha com urn valor nulo em uma coluna que nao aceitevalores nulos, 0banco de dados rejeitara a insercao. 0 mesmo acontecera se voce editar uma linha econfigurar como nulo 0valor de uma coluna que ndo aceita nulo.

    Campos chave primaria (os campos que vinculam tabelas a outras), por exemplo, nunca podemser nulos. Para especificar que nao e possivel para qualquer outro campo aceitar valor nulo, voce deveconfigurar a propriedade Requerido para Sim no Access, ou a propriedade Allow Nulls para Falseno SQL Server.

    Sesuas tabelas contem valores nulos, voce deve conhecer como 0SGBDtrata esses valores. Quandovoce soma valores de uma coluna com uma funcao como SUMO, os valores nulos sao ignorados. Sevoce contar as linhas com uma fun~ao como COUNTO, os campos nulos sao tambem ignorados. 0mesmo e verdadeiro para uma fun~ao como AVGO, que calcula urn valor medio. Se os valores nulosfossem tratados como zeros, entao, a media poderia estar errada. A funcao AVGO retorna a mediados campos que nfio sao nulos. Se voce quiser incluir valores nul os na media, deve primeiro atualizaresses campos com 0valor numerico zero. Essas regras aplicam-se tanto ao Access quanto ao SQL Server.

    iValores nulos sao muito importantes no trabalho com ban cos de dados e 0SQL reconhece as

    palavras-chave ISNULL e IS NOT NULL (instrucoes SQL nao diferenciam maiiisculas de miruisculas,\ mas este livro usa letras maiusculas para que voce possa rapidamente identifiear palavras- chave SQL\ nos exemplos). Para excluir os valores nulos em uma instrucao SQL, utilize a clausula:

    WHEREnome_coluna IS NOT NULL -Voce aprendera tudo que precisa para conhecer instrucoes SQL no Capitulo 4, ~s aqui esta urn

    exemplo simples de uma instrucao SQL que recupera somente os titulos que tern pre~o e ignora 0restante deles:

    SELECT Titulo, Pre~oFROH LivrosWHERE Pre~o IS NOT NULLPara recuperar os titulos sem pre~o, use uma instrucao como esta:SELECT Ti tuloFROM LivrosWHERE Pre~o IS NULL

    (~) indicesOK, voce criou algumas tabelas e carregou informacoes nelas. Agora a coisa mais importante que podefazer com urn banco de dados e extrair dados dele (ou, entao, por que armazenar a informacao"), Enao estou falando em visualizar todos os c1ientesou todos os produtos. Raramente navegamos nas linhasde uma simples tabela. Pelo contrario, estarnos interessados em resumir informacao que nos ajudara atomar decisoes de neg6cios. Precisamos de respostas para questoes como: "Qual 0produto rnais popularem Santa Catarina?" ou "Qual 0mes de maior venda de determinado produto?" e assim por diante.Para recuperar esse tipo de informacao, voce deve combinar varias tabelas. Para responder a primeiraquestao, voce deve localizar todos os clientes de Santa Catarina, recuperar seus pedidos, calcular as

  • 5/10/2018 DataBaseBasico

    18/38

    44 Oominando a Programa~ao de Banco de Oados com Visual Basic 6.0 Cap. 2

    quantidades de itens que eles adquiriram e depois selecionar 0produto com a maior soma de quantidades.Como pode adivinhar, um SGBO consegue procurar as tabelas e localizar as linhas desejadas rapidamente.Um Indice nada mais e do que um mecanismo para agilizar as operacoes de busca.

    Os computadores utilizam uma tecnica especial, chamada i ndexadio , para localizar inforrnacoesmuito rapidamente. Essa tecnica exige que os dados sejam mantidos em determinada ordem. Comovoce vera, as linhas indexadas nao precisam estar fisicamente em ordem, uma vez que podemosrecupera-las em uma ordem especffica. Se voce quiser recuperar 0nome da categoria de um determinadoproduto, as linhas da tabela Categories devem estar ordenadas de acordo com 0campo CategoryID.Esse e 0valor que liga cada linha na tabela Products a linha correspondente na tabela Categories.

    Para pesquisar um valor em uma lista ordenada, compare 0 elemento do meio da lista com 0valor que voce esta procurando. Se 0valor e maior que 0elemento do meio, voce sabe que nao precisapesquisar a primeira metade (superior) da lista. 0 mesmo processo se repete com a outra metade dalista. Novamente, compare 0 valor com 0elemento do meio na mesma lista e rejeite uma metade dalista de novo. Esse processo repete-se ate voce ficar com um iinico elemento. Esse elemento deve seraquele que voce esta procurando. Se nao for, signifiea que 0elemento que voce esta selecionando naopertence a lista.Esse esquema de pesquisa e chamado de p es qu is a b in d ria (ou busca binaria) e e a ideia basica deindexacao, Para ter uma ideia da eficiencia desse metodo, considere uma lista com 1.024 elementos.Depois da primeira comparacao, a lista e reduzida para 512 elementos. Depois da segunda pesquisa,ela e reduzida para 256 elementos. Apos a decima cornparacao, a lista e reduzida para um tinicoelemento. Apenas 10 comparacoes sao necessaries para localizar um elemento em uma lista com 1.024elementos. Se a lista possui um milhao de elementos, serao necessarias apenas 20 comparacoes,

    Felizmente, nao e voce quem faz a manutencao das linhas da tabela. 0 SGBO faz isso para voce.Voce simplesmente especifica que a tabela deve ser mantida em uma ordem especffica de acordo como valor de uma coluna, e 0 SGBO assumira 0 comando. 0 SGBO pode manter varies indices para amesma tabela. Voce pode desejar pesquisar os produtos por nome e fornecedor. E comum pesquisarum cliente pelo nome, cidade, CEP, pais etc. Para agilizar as pesquisas, voce pode manter um indicepara cada campo que deseja pesquisar.o algoritmo de pesquisa binaria anteriormente descrito e uma descricao simplificada sobre comoum SGBO localiza itens em uma lista ordenada. Como voce provavelmente imaginava, pesquisar umalista ordenada e a parte mais facil. A parte mais dificil e ter certeza de que cada vez que uma novalinha e adicionada, ela e inserida no lugar apropriado para que as linhas da tabela estejam sempreordenadas. Os detalhes da manutencao de listas ordenadas sao um pouco mais complicados. OSQLutiliza uma estrutura de dados conhecida como arvores balanceadas (B-Trees, de Binary Tree) paramanter as linhas de uma tabela em ordem todo 0 tempo e pesquisa-las. Voce nao precisa entender 0que as arvores binaries fazem, porque e exatamente 0que 0SGBO faz: libera voce dos detalhes debaixo nivel e permite que se concentre nos dados, em vez da organizacao dos dados no disco.

    Na verdade, 0SGBO nao ordena as linhas de uma tabela. Ele mantern uma lista de ruimerosque reflete a ordem dos elementos ordenados de acordo com um campo. Essa lista e 0 i nd i ce . Com atabela indexada, cada vez que voce adicionar nova linha na tabela, os indices da tabela serao atualizadoscorretamente. Se voce precisa pesquisar uma tabela de muitas formas, entao pode manter varies indicesna mesma tabela,

    Os Indices sao manipulados pelo SGBO e tudo 0 que voce deve fazer e defini-los, Sempre queuma nova linha e adicionada, ou uma linha ja existente e excluida ou editada, os Indices da tabelasao atualizados automaticamente. Voce pode utilizar um indice quando quiser localizar a linharapidamente. Praticamente, os indices permitem que voce selecione uma linha com base em um campoindexado, instantaneamente. Quando procura por linhas especfficas, 0SGBO leva automaticamenteem consideracao qualquer indice que possa agilizar a pesquisa.

  • 5/10/2018 DataBaseBasico

    19/38

    Cap.2 ConceitosBilsicos de BancosdeDadosRelacionais 45

    Questoes de EficienciaTabelas nao sao objetos estaticos. Muitas tabelas em um banco de dados mudam constantemente:novas linhas sao adicionadas e linhas existentes sao excluldas ou editadas. 1550 significa tarnbemque 0 SGBD deve constantemente atualizar a tabela de Indices. Esse processo pode se tornarligeiramente pesado, entao voc~ nao deve criar muitos Indices. Por outro lado, os Indices agilizamenormemente as operacoes de busca. Entao, qual eo ponto de equillbrio?

    Seestiver usando 0Access, voce precisa ajustar 0 desempenho do banco de dados manual-mente. Se uma tabela e atualizada pesadamente durante 0 dia, tente minimizar 0 nurnero deindices na tabela. Sea tabela nao e atualizada frequentemente, mas e usada para muitas consultas,voce pode adicionar muitos Indices para agiliza-Ias. Infelizmente, as tabelas que sao usadas muitofrequentemente em consultas tambern sao atualizadas pesadamente. De qualquer maneira, sevoce esta colocando muito esforco para manter 0 desempenho de seu banco de dados Access,provavelmente ja esta na hora de mudar para 0 SQLServer.

    Uma das muitas ferramentas que vem com 0 SQLServer 7 e 0 Index Tuning Wizard, 0 qualajuda na decisao de quais Indices manter e quais excluir. 0 Index Tuning Wizard monitora 0desempenho do banco de dados, registra as estatlsticas necessaries e diz a voce quais Indicessao responsaveis pelo desempenho. Essessao os Indices de que voce precisa em seu banco dedados, os outros pod em ser excluldos se estiverem prejudicando 0 processamento de algumasconsultas que nao sao usadas frequentemente, 0 Wizard tambern pode criar um script com asrnudancas que ele sugere e Implernenta-tas imediatamente. Para mais informa~oes sobre 0 IndexTuning Wizard, consulte os livros on-line do SQL Server no CD do SQL Server.

    VisoesComplementando as tabelas, muitos bancos de dados aceitam visoes (views). Urna visao (ou vistaou visualizacao) e uma tabela virtual: ela se parece e se comporta exatamente como uma tabela e tambernpode ser atualizada, mas nao e urn objeto que existe no banco de dad os. Ela e baseada em consulta.As visoes existem somente quando sao requisitadas, e sao liberadas quando nao sao mais necessaries.Quaisquer operacoes que voce executa em uma visao sao automaticamente traduzidas em operacoessobre tabela(s) da(s) qual(is) a visao e derivada.

    As visoes aumentam a seguranca do banco de dad os. Considere uma tabela de pessoal quearmazena informacoes sobre funcionarios, incluindo seus salaries e outras informacoes confidenciais.Enquanto muitas das informacoes sao piiblicas (nomes, ramais, departamentos, projetos envolvidosetc.), alguns campos devem ser restritos apenas a usuaries autorizados. Voce poderia dividir a tabelaem outras menores, 0SQL Server permite que voce crie visoes iinicas e assinale direitos de acessospara grupos de usuaries selecionados.

    Voce tarnbern pode usar as visoes para esconder a complexidade introduzida pelo processo denormalizacao e as relacoes entre tabelas. Os usuaries realmente nao se preocupam com regras denormalizacao ou relacionamentos. Eles preferem ver uma lista de nomes de clientes, seus pedidos eos nomes dos produtos atuais. Essa inforrnacao existe no banco de dados, mas ela e distribuida emquatro tabelas diferentes: Customers, Orders, Order Details e Products. Pela definicao de uma visaono banco de dados, voce pode manter uma estrutura que facilite seu desenvolvirnento e que fornecaaos usuaries a "tabela" que eles gostariam de ver.Atualizando Tabelas e VisoesMudancas em uma visao sao imediatamente refletidas na(s) tabela(s) que elas representam. Quandoa(s) tabela(s) representada(s) muda(m), essas mudancas nao sao refletidas imediatamente nas visoesque se baseiam nela(s). As visoes tern como base os dados das tabelas no momenta em que a consultae executada. Uma visao com base em uma tabela e que esconde algumas de suas linhas (ou colunas)

  • 5/10/2018 DataBaseBasico

    20/38

    46 Dominando a Programa'rBo de Banco de Dados com Visual Basic 6.0 Cap. 2

    e sempre atualizavel, uma vez que ela contem a chave primaria da tabela. (Conforme ja mencionado,a chave primaria identifica unicamente uma linha da tabela. Sem essa informacao, 0SQL Server nfiosaberia qual linha atualizar.)

    Algumas visoes nao podem ser atualizadas. As visoes com base em instrucoes SQL, que combinamvarias tabelas, podem nao ser atualizadas, e as visoes que contem totals, com certeza, nao podem seratualizadas. Os totais sao baseados em muitas linhas e 0SQL Server nao sabe qual pedido ou linhade detalhe precisa ser mudado para afetar 0 total.

    A Figura 2.13 mostra uma secao da vlsao Invoices (ocultei muitas colunas, configurando-as comtamanho zero). Inicie 0Enterprise Manager do SQL Server, abra a pasta banco de dados Northwindno painel esquerdo e de urn clique em Views em baixo do nome do banco de dados Northwind. Osnomes de todas as visoes, definidas para 0banco de dados serao exibidas no painel direito. Para abriruma visao, de urn clique com 0botao direito do mouse sobre seu nome e selecione Open ~ ReturnAll Rows no menu flutuante.

    FIGURA 2.13A visao Invoices exibe osdetalhes do pedido juntocom os nomes dos clientese nomes de produto.

    lIS'a;m5' 0ftI0t!D-Svy .... 1ilS39 21 Sa Pod-oey's Scones 10-Svy.,.. 1ilS39 33 Gdost 2.S 15Mg 10Si0 3 _Sy~ 10 60.ldnet loverbroQ 10Si0 26 G o . m b a r ~chen 31.23 40J a no t l e _1 t>g 10Si0 38 C O te d o e t. y. 263.5 30Janet l . . e r! no 10Si0 68 5 < o tt lS h l o n r 0 4d s 12.5 35Ando . . . ful." 10Si1 24 GuoroNF_. 4,5 35A nd o ... F Y Ie r 10Si1 38 COte de et.ye Z63.S 4Ando~FY Ie r 10Si1 65 l a u s oono Ne

  • 5/10/2018 DataBaseBasico

    21/38

    Cap. 2 Conceitos Basicos de Bancos de Dados Relacionais 47

    Carnes hi; ele ja havia sido alterado (para HANARI CARNES). Foi isso exatamente 0que a mensagemIhe disse. Voce tentou alterar urn campo, mas seu valor original nao era mais 0mesmo quando elefoi lido.

    Claro que nao era. Voce apenas 0alterou, certo? Mas 0SQL Server nao mantem registro de quemalterou 0 que no banco de dados. Tudo 0 que ele sabe e que as alteracoes poderiam ter side feitaspor outro usuario, entao isso simplesmente diz a voce que 0registro que esta para alterar nao e maiso mesmo. Imagine se este fosse urn aplicativo com reserva de passagens. Voce reservou 0mesmo assentopara dois clientes diferentes. Quando voce altera uma linha em uma tabela, deve ter certeza de quea linha nao foi alterada desde a ultima vez que voce a leu.

    Confuso? Bem-vindo ao mundo da prograrnacao de bancos de dados! Como e possivel perceber,esse comportamento nao e unico para vis6es. Esse eo maior topico da programacao de bancos de dados,conhecido como c o nt ro le d e c o nc o rr en c ia . Em urn ambiente multiusuario, ha sempre urn risco de duasou mais pessoas tentarem atualizar a mesma informacao ao mesmo tempo. 0 comportamento que voce

    t testemunhou e norrnalmente uma caracteristica do banco de dados: ele permite que voce saiba que alguernja alterou a linha que voce leu. Por outro lado, voce teria de implementar a mesma logica dentro de

    ~

    seu aplicativo. Nao estou querendo apavorar ninguern. Estou apenas querendo apresentar urn dos maisproblematicos aspectos da programacso de bancos de dados. Voce encontrara mais informacoes sobreo topico de controle de concorrencia e como tratar alteracoes simultaneas no Capitulo 9.NOTA Voce nao consegue repetir esse experimento com 0Access. 0Access pode nao ser umSGBDtao poderoso quanto um SQLServer, mas tem uma interface de usuario muitoflexivel. a qual pode ser usada por pessoas com pouca experiencia em bancos de dados.Ocampo CompanyName e exibido como um elemento de um controle ComboBox. Vocee forc;ado a selecionar outro nome de empresa valido de uma lista com todos os nomesde cllentes, mas nao pode editar 0nome da empresa diretamente - a nao ser que estejaeditando a tabela Customers.Visoes do AccessAs vis6es do Access sao chamadas de consultas, sendo basicamente a mesma coisa. Voce escreve umaconsulta (uma instrucao SQL) que recupera linhas selecionadas de urna ou rnais tabelas e vincula suadefinicao ao banco de dad os. Para trabalhar com uma consulta, de urn clique duplo em seu nome najanela Consultas para visualizar uma grade com as linhas qualificadas. Ha uma grande diferenca entreas vis6es do SQL Server e as consultas do Access. Se a consulta e atualizavel, as alteracoes que vocefaz sao atualizadas imediatamente no banco de dados e tarnbem atualizam a grade da consulta. Essaresposta imediata e urn born recurso que torna 0trabalho com consultas do Access bastante conveniente.Mesmo que outros usuaries alterem uma das linhas que voce esta visualizando, a sua grade seraatualizada imediatamente.NOTA Voce deve estar querendo saber por que dois produtos se comportam tao diferentemente.A resposta e que 0Access nao e um SGSD tao poderoso, mas possui uma interface deusuario amiqavel. 0 SQL Server, por outro lado, e um poderoso SGBD, mas nao umaplicativo "front-end". Voce deve escrever aplicativos para acessar as tabelas e visoesdo SQLServer, e nao edita-las diretamente. Como vera no Capitulo 4, quando voce buscaruma linha com seus aplicativos. 0SQLServer recuperara a versao da linha mais recente.Se outro usuario alterar a linha depois que voce a leu. sera gerado um erro e voce podetratar 0 conflito por meio de seu c6digo.

  • 5/10/2018 DataBaseBasico

    22/38

    48 Dominando a Programacao de Banco de Dados com Visual Basic 6.0 Cap. 2

    Estabelecendo RelacionamentosUma vez que a informacao foi dividida logieamente em tabelas separadas, voce deve estabelecerrelacionamentos entre elas, que e a essencia do modelo relacional de bancos de dados. Para relacionartabelas com outras, voce usa campos com valores comuns. Nesta se~ao, voce vera como as chavesprimarias e estrangeiras sao usadas para estabelecer relacionamentos entre tabelas.Chaves Primarias e EstrangeirasA tabela Categories possui urn campo CategoryID que mantem urn valor para identificar cada categoria.Esse valor precisa ser tinico para cada linha da tabela Categories, e esta e a chave primaria da tabela.A tabela Products tambem possui urn campo CategoryID que e configurado para conter 01Dda categoriaProducts. Os dois campos tern 0mesmo nome, mas isso nao e uma exigencia. E apenas uma convenienciapara nos. A mera existencia de dois campos nao signifiea que as duas tabelas estejam relacionadas.Voce deve especificar como as tabelas serao relacionadas, bern como qual campo e a chave primariaequal e a chave estrangeira. A chave prirnaria e iinica para cada linha, enquanto a chave estrangeirapode aparecer em mais de uma linha. Esse relacionamento e chamado de um-para-muitos porque umasimples linha da tabela Categories e normalmente apontada para varias linhas da tabela Products.A Figura 2.14 mostra como 0SQL Server representa relacionamentos entre tabelas. Para ver osrelacionamentos entre as tabelas de urn banco de dados, inicie 0 Enterprise Manager e abra 0 bancode dados desejado no paine Iesquerdo. De urn clique no Icone Diagrams sob 0nome do banco de dadose, quando 0 fcone Relationships aparecer no painel direito, de urn clique duplo sobre ele. 0 diagramaRelationships aparecera em uma janela nova. Cad a tabela e representada por uma caixa de lista comos nomes dos campos da tabela, e os relacionamentos entre tabelas sao representados com setas, Deurn lado esta 0Icone de uma chave que indica a chave primaria. No outro lado, esta urn simbolo infinitoque indiea a tabela com a chave estrangeira. 0 simbolo infinito signifiea que deve haver muitas linhasapontando para a linha com a chave primaria.FIGURA 2.14Ocampo CategorylD na TabelaProducts e a chave estrangeira queaponta para a chave primaria natabela Categories.

    Uma ultima observacao com referenda a chaves: os campos chave primaria nao sao usados parapesquisas personalizadas. Nao faz senti do recuperar todos os clientes com uma 1D igual a 1000 oumenor, ou os produtos com uma 1Dentre 50 e 75. Os campos chave prima ria sao usados para conectarduas tabelas, entao nunca estaremos interessados em seus valores atuais. Aqui esta uma instrucaoSQL simples que recupera os pedidos colocados pelo cliente Alfreds Futterkiste:

    SELECT * FROM OrdersWHERE Customers.CompanyName = 'Alfreds Futterkiste' AND

    Orders.CustomerID = Customers.CustomerIDEssa instrucao diz ao SGBD para recuperar as linhas da tabela Orders que coincidam com 0seguinte

    criterio: 0 campo CompanyName e 0nome do cliente, e A chave estrangeira na tabela Orders coincide com a chave primaria na tabela Customers.

  • 5/10/2018 DataBaseBasico

    23/38

    Cap. 2 Conceitos Basicos de Bancos de Oados Relacionais 49Essa consulta retornara todas as linhas da tabela Orders em que 0 campo CustomerlD e igual

    ao campo CustomerID da linha do cliente especificado. As chaves primarias e estrangeiras sao usadaspara coincidir linhas em duas tabelas, e seus valores nao sao de nosso interesse. (0 asterisco e urncaractere especial que significa "todos os campos". Voce poderia ter especificado uma lista dos camposdesejados separada por vfrgulas, em vez de asterisco.)@ Visualizandoe Editando RelacionamentosPara ver relacionamentos de urn banco de dados Access, troque para 0modo de exiblcao de tabelase selecione Relacionamentos do menu Ferramentas. A janela mostrada na Figura 2.15, que apareceraem sua tela, e muito similar ao diagrama Relationships do SQL Server. Os relacionamentos entre tabelassao representados com linhas que possuem 0dfgito 1 ao lado da chave primaria e 0simbolo infinitoao lado da chave estrangeira. Assim, a chave primaria em cada tabela e exibida com a fonte em negritopara realcar,

    F IGURA 2.15Visualizando osrelacionamentos em umbanco de dados Access.

    HireOateAdd ressely .:J

    Para excluir urn relacionamento, de urn clique com 0botao direito do mouse no segmento mais

    fino da linha do relacionamento (na maioria dos relacionamentos da Figura 2.14, 0segmerito vertical)e selecione Excluir no menu flutuante (no SQL Server selecione Delete Relationship from Database).Para ver ou editar as propriedades dos relacionamentos, selecione Editar relacionamento (ou Propertiesno SQLServer) no mesmo menu flutuante. Ajanela de propriedades deve especificar as chaves primariese estrangeiras, e no SQL Server cada relacionamento possui um nome. Note que os relacionamentosno Access nao sao nomeados.

    @campos Identity e AutoNumera~aoOs valores em si dos campos chave primarias sao tao irrelevantes que na maioria dos casos deixamosque 0SGBD gere seus valores para nos. 0 SGBD pode automaticamente gerar urn valor inteiro paraurn campo chave primaria toda vez em que uma nova linha e adicionada. 0 SQL Server utiliza 0termoIdenti ty (identidade) para esse tipo de dado, enquanto 0 Access utiliza 0 termo A l l t o N Ii m e r ar ii o . Sevoce especificar urn campo Al i toNl imerar i io no Access, pode especificar se ele sera incrementado porum (1) ou por urn valor aleatoric. No SQL Server voce pode especificar 0valor inicial de urn campoIdentity e seu incremento.

    Para criar urn novo valor para urn campo Autoblumeracao ou Identity, 0SGBD adiciona urn valor(usualmente urn) para 0ultimo valor deste campo na mesma tabela. Essa operacao em principio esimples, mas seria uma grande tarefa se voce tivesse de implementa-la. Com muitos usuariesadicionando linhas na mesma tabela, voce precisaria bloquear a tabela, ler 0valor do campo Identityda ultima linha, adicionar 0 incremento apropriado e depois gravar a nova linha adicionada.

  • 5/10/2018 DataBaseBasico

    24/38

    50 Oominando a Programa4t80 de Banco de Oados com Visual Basic 6.0 Cap. 2

    Relacionamentos Mais ComplexosNem todos os relacionarnentos podem ser resolvidos com um par de chaves primarias e estrangeiras,Vamos dizer que voce esta projetando um banco de dados para armazenar titulos de Iivros. A estruturada tabela com os titulos e 6bvia. 0 relacionamento entre titulos e editoras tarnbern e 6bvio: cada titulopossui um unico editor e 0mesmo editor pode aparecer em varios titulos. 0 relacionamento entreeditoras e titulos e chamado de um-para-muitos. Inversamente, 0relacionamento entre titulos e editorase chamado de muitos-para-um, porque varies titulos podem apontar para a mesma editora. Os relaciona-mentos um-para-muitos e muitos-para-um sao os mesmos - eles seguem 0pedido da tabela relacionada.

    Mas e sobre 0 relacionamento entre titulos e autores? Cada Iivro possui um ruimero de autoresdiferente; alguns Iivros nao possuern autores, alguns podem ter seis. Da mesma maneira, 0mesmo autorpode ter escrito mais de um titulo. 0 relacionamento entre titulos e autores e chamado de muitos-para-rnuitos. Para estabelecer um relacionamento direto entre as tabelas TItles e Authors, algumas Iinhas natabela TItles devem apontar para muitas Iinhas na tabela Authors. Da mesrna forma, algumas linhasna tabela Authors devem apontar para varias linhas na tabela TItles.Para evitar esse tipo de relacionamentoem seu projeto, e necessario inc1uir uma nova tabela, a qual e vinculada por meio de um relacionamentourn-para-muitos na tabela TItles e urn relacionamento muitos-para-um na tabela Authors.

    Em nosso exemplo, introduzirnos uma tabela intermediaria entre as tabelas TItles e Authors: atabela TItleAuthor contem uma linha para cada par titulo-autor, como mostra a Figura 2.16. Essa tabelapossui uma estrutura muito simples (voce poderia dizer que ela nem mesmo contem uma inforrnacaooriginal). Ela simplesmente relaciona livros com autores. Se urn livro possui tres autores, adicionamostres linhas na tabela TitleAuthor. Todas as linhas possuem 0 rnesmo ISBN (a chave do titulo) e a IDdos autores.

    Tabelas intermediarias como a tabela TitleAuthor sao muito comuns em projetos de bancos dedad os. Praticamente, nao ha outro metodo de implementacao de relacionamentos muitos-para-muitosentre tabelas.

    FIGURA 2,16Conectando a tabela Titles itTabelaAuthors com uma tabelaintermediaria, a tabelaTitleAuthor.

    TITLESMMt...-.go.pro 2.6 SpeooI [db:..._ e ng ~ F CA I : Y .. .." . 4M.osterngP.,odo, 5for_Pr"'1_ P.,odo. 5 fO f wrdows_...-.g VIIIl .MIC 3/B

  • 5/10/2018 DataBaseBasico

    25/38

    Cap. 2 Conceitos Sasicos de Sancos de Oados Relacionais 51

    o Regras de Normaliza~aoAgora voce tern uma boa ideia de como bancos de dados relaeionais sao projetados e pode faeilmenteprojetar urn banco de dados relaeional sozinho usando as inforrnacoes anteriormente discutidas e seuborn senso. 0 mais importante e que voce pode entender como a informacao e armazenada em urnbanco de dados observando seu diagrama relaeional.Contudo, ha algumas regras no projeto de banco de dados relacional conheeidas como reg ra s d enormal i z ad io . Essas regras ajudarao voce a projetar urn banco de dados n o r m a l i z a d o , ou pelo menosverificar seu projeto. Urn banco de dados esta normalizado se ele nao repetir a inforrnacao e se naoapresentar anomalias de atualizacao e exclusao, Embora 0ruimero dessas regras varie, as regras basicasde normalizacao sao exatamente tres: a primeira, a segunda e a terceira regras de normalizacao. Contudo,nao fique surpreso se voce encontrar ate meia dtizia de regras de norrnalizacao.

    Uma tabela normalizada de acordo com a primeira regra e dita estar na primeira forma normal(IFN). Uma tabela normalizada de acordo com a segunda regra e dita estar na segunda forma normal(2FN). Note que uma tabela deve estar IFN antes que voce possa aplicar a segunda regra de nor-malizacao. Finalmente, a tabela que esta na 2FN pode ser normalizada de acordo com a terceira regra,que neste caso deve estar na terceira forma normal (3FN). A mais alta forma normal trata de situacoesraras e especificas que a maioria dos programadores tratam em bases individuais.

    (~ Erros de Projeto de Bancos de DadosPara entender a necessidade de normalizacao de bancos de dados, inieiarei com alguns erros comunsocorridos em projetos de bancos de dados. Esses erros sao tao obvios que nao ocupam lugar na cienciada computacao para entender por que e como evita-los. Porern, os mesmos erros sao repetidos cadavez mais. Voce achara facil identified-los nos projetos de exemplo, uma vez que esses exemplos saopequenos. Em grandes bancos de dados, mesmo aqueles com apenas poucas dezenas de tabelas, torn a-se dificil identificar os mesmos erros.

    Inieiaremos com uma simples tabela para armazenar inforrnacoes sobre livros:Tabela TITLBSISBN Title Pages TopicEssa tabela parece perfeitamente boa ate que voce deeida adieionar urn segundo topico para urn

    titulo. Urn livro sobre HTML poderia ser classificado na categoria "programacao", mas tambern nacategoria "Internet". Para adieionar varies topicos voce tera de repetir cad a dado de titulo para cad acategoria:

    01444898900144489890

    Total HTML 850Total HTML 850

    programaC;doInternet

    o problema com essa tabela e que certas informacoes sao repetidas (na verdade, muita informacaoe repetida). 0 primeiro objetivo em projetos de bancos de dados e evitar duplicacao de informacoes.Para evitar essa duplicacao desnecessaria, voce deve mover os topicos para outra tabela. Muitos devoces podem considerar adieionar colunas para varies topicos, entao voce deve fazer uma suposicao(arbitraria) para urn mimero maximo de topicos por titulo e montar uma tabela como a seguinte:

    Tabela TITLBSISBN Title Pages Topic1 Topic2 Topic3Essa tabela tambern nao e a melhor. Para ten tar evitar a duplicacao dos dados da tabela, voce

    introduziu duplicidade de informacoes na estrutura da tabela. Como voce vera, a primeira regra noprojeto de urn banco de dados e evitar grupos de colunas com informacoes do mesmo tipo. Se vocedecidir alterar 0 nome da categoria "programacao" para outro, como "linguagens de computador",tera de alterar varias linhas em varies lugares. Alguns titulos pod em ter "programacao" no Topicl,outros no Topic2 e assim por diante.

  • 5/10/2018 DataBaseBasico

    26/38

    52 Dominando a Programac;aode Banco de Dados com Visual Basic 6.0 Cap. 2

    Para resolver 0problema com muitas colunas do mesmo tipo, voce introduz duas novas tabelasda seguinte forma:

    Tabela TITLESISBN Ti tle PagesTabela TITLETOPICISBN TopicIDTabela TOPICSTopicID TopicNameEsse projeto utiliza uma tabela que armazena apenas topicos. Para alterar a descricdo de urn

    topico, voce deve mudar uma unica linha 'na tabela TOPICS. Os topicos sao relacionados a titulos pormeio da tabela TITLETOPIC. Se urn titulo precisa ser classificado em varies topicos, voce devera inserirvarias linhas na tabela TITLETOPICS. Para encontrar os topicos de urn titulo especifico, use seu ISBNpara pesquisar a tabela TITLETOPIC e extrair as linhas em que 0ISBN coincide com 0ISBN do Iivro.Voce terminara sem nenhuma, uma ou algumas linhas da tabela TITLETOPICS. Utilize 0TopicID dessaslinhas para localizar o(s) topicots) do titulo. Parece complicado? E mais facil do que parece, porquetodas as tabelas sao indexadas apropriadamente e 0SCBD fara as pesquisas necessarias para voce.Atualizando e Excluindo AnomaliasVamos remover a coluna Topic do nosso projeto original e adicionar algumas informacoes de publicacao,Aqui esta a estrutura da outra tabela que man tern informacoes sobre livros:

    Tabela TITLESISBN Title Pages PubYear Publisher PubAddressNote que 0enderec;o da editora (PubAddress) nao pertence a tabela TITLES. Essa estrutura pode

    deixa-lo com duas situacoes alta mente indesejaveis: Se uma editora mudar de endereco voce tera de alterar 0endereco nfio apenas em um, masem centenas, talvez milhares de registros. Isso e conhecido como a n om a lia d e a tu a liz iu iio . Sevoce esquecer de alterar 0endereco da editora em alguns registros, 0banco de dados conterainforrnacao errada, Essa situacao pode ser evitada movendo as editoras para uma tabeladiferente.

    Da mesma forma, se voce excluir 0ultimo livro de uma editora, perdera toda informacao sobreessa editora. Essa situacao e conhecida como a no m alia d e e xc lu sd o que tambern pode ser evitadamovendo as editoras para uma tabela diferente.

    Esta e a melhor estrutura para armazenar a mesma informacao:Tabela TITLESISBN Title Pages PubYear PublisherIDTabela PUBLISHERSPublisherID Publisher PubAddressOcampo PublisherID e urn ruirnero iinico que identifica uma editora, e esse deve ter 0mesmo

    valor nas duas tabelas. Para encontrar a editora do titulo, voce recupera 0campo PublisherID da tabelaTITLES e, entao, localiza a linha na tabela PUBLISHERS que possui 0 mesmo valor no campoPublisherID. Conseqiientemente, 0campo PublisherID na tabela PUBLISHERS e a chave primaria (quenao pode aparecer em mais de uma linha) e os campos PublisherID na tabela TITLES sao chavesestrangeiras (que pod em aparecer em varias linhas).

    Muito bem, isso e muito obvio, mas por que voce tern de introduzir urn novo campo?

  • 5/10/2018 DataBaseBasico

    27/38

    Cap. 2 Conceitos Basicos de Bancos de Dados Relacionais 53

    fI

    Voce nao poderia usar 0 nome da editora para relacionar as duas tabelas? Voce usou 0nome daeditora como uma chave, entao voce nao poderia alterar 0nome da editora em urn iinico lugar. Se aeditora MAKRON Books se tomar uma sociedade anonima, incorporada e alterar seu nome paraMAKRON Books 51A,voce deveria alterar 0nome da editora em urn unico local a fim de evitar anomaliasde atualizacao,Usar urn ruimero para identifiear cada linha em uma tabela e uma pratica muito comum. AsIDs numericas nao precisam ser alteradas para nao causarem nenhuma anomalia de atualizacao. Algunsleitores podem pensar que as editoras nao mudam de nome, mas esse tipo de suposicao e muito perigosono projeto de bancos de dados. As empresas fundern-se, incorporam-se e voce nao pode assumir queseus nomes nunca mudarao, Mesmo quando uma suposicao parece razoavel, voce nao deve basearo projeto de urn banco de dados em suposicoes. Primeira Forma Normal

    ,,- Esta forma e muito simples. Ela diz que uma tabela nao deve conter grupos repetidos. Aqui esta umatabela que contem todos os erros dos projetos anteriores (inaceitaveis), Vamos iniciar os grupos repetidos(os topicos dos livros):.'

    ISBN Title Pages Publisher PubAddress Topicl Topic2Para remover urn grupo de uma tabela, mantenha a primeira coluna do grupo e repita os topicos

    adicionais em varias linhas. Urn titulo com dois topicos sera armazenado na seguinte tabela:ISBN0125488939101254889391

    TitleSQL ServerSQL Server

    Pages850850

    PublisherSybexSybex

    TopicProgramac;:aoBancos de Dados

    NOTA A primeira linha contern nomes de campos e as linhas seguintes sao dados. Omiti a colunaPubAddress para diminuir a quantidade de linhas.

    A primeira forma normal nao exige que uma tabela seja dividida em varias tabelas. Ela transformaalgumas das colunas da tabela em linhas adicionais. Essa estrutura possui as seguintes vantagens:

    Nenhum campo vazio Se urn titulo pertence a urn iinico topico, entao os campos Topic2 eTopic3 do exemplo estariam vazios.Nenhuma limita~ao artificial Se urn titulo espedfico deveria ser localizado em meia diiziade categorias, voce pode adicionar quantas linhas forem necessarias na tabela.

    ja discuti as deficiencias desse projeto. 0 projeto de tabela esta na primeira forma normal e vocedeve agora aplicar a segunda regra de normalizacao.J

    Segunda Forma Normal ,A segunda regra de normalizacao diz que quaisquer campos que nao dependem totalmente da chaveprimaria devem ser movidos para outra tabela. 0 campo Topie na ultima estrutura da tabela nao efuncionalmente dependente do ISBN (a chave primaria). F un cio na lm e nle d ep en de nt e urn termomatematico e signifiea que urn campo e totalmente determinado por uma chave. 0 ruirnero de paginasde urn livro e funcionalmente dependente do ISBN do livro. Se voce conhece 0 ISBN do livro podedeterminar unicamente 0mimero de paginas do livro, 0 mesmo e verdadeiro para 0ana de publicacaodo livro. Mas 0 topico nao e dependente do ISBN porque 0mesmo ISBN pode levar para varies topicos.

    A segunda regra de normalizacao exige que os topicos sejam movidos para uma tabela diferente:Tabela TITLESISBN Titles Pages Publisher PubAddress

  • 5/10/2018 DataBaseBasico

    28/38

    54 Dominando a Programac;aode Banco de Dados com Visual Basic 6.0 Cap. 2

    Tabela TITLETOPICISBN TopicAgora, por que essa estrutura e melhor do que a anterior? 0 mesmo ISBN pode levar a varies

    topicos, A tabela TITLETOPIC nao repete a informacao. Somente a chave primaria e repetida e vocenao pode evitar isso. Urn titulo unico pode ter varies topicos, Esse e urn relacionamento um-para-muitos e voce nao pode evitar a duplicacao da chave prima ria.

    No entanto, ha urn problema com essa tabela tarnbem. Como urn topico de livro e descrito comuma string, voce nao evitou a anomalia de atualizaciio. Se voce alterar a descricao de uma categoria,tera de alterar varias linhas na tabela TITLETOPIC. Para evitar a anomalia de atualizacao, voce devecriar uma tabela separada com os topicos e assinalar uma ID iinica para cada topico:

    Tabela TOPICSTopicID TopicPara conectar cada titulo a urn ou mais topicos, voce deve alterar a tabula TITLETOPIC que conecta

    as tabelas TITLES e TOPICS. A tabela TITLETOPIC deve conter pares de ISBNs e IDs de Topicos.Tabela TITLETOPICISBN TopicID

    ,~(~Terceira Forma NormalA terceira regra de normalizacao diz que nao deve existir dependencia entre campos que nao sao chaves.No ultimo projeto da tabela, voce tern urn exemplo de dependencia. 0 endereco da editora dependeda editora e nfio do ISBN do livro. Para remover esse tipo de dependencia, voce deve mover a informacaoda editora para outra tabela. Desde que cada livro deve ter uma editora, voce adiciona 0campo PublDna tabela TITLES e na nova tabela com as editoras, 0 campo PubID da tabela TITLES deve ter 0mesmovalor que 0campo PubID na tabela PUBLISHERS. Veja aqui a tabela original na terceira forma normal:

    Tabela TITLESISBN Ti tLe Pages PubIDTabela PUBLISHERSPubID PubAddressTabela TOPICSTopicID TopicTabela TITLETOPICISBN TopicIDA Figura 2.17 mostra as tabelas finais e os relacionamentos entre elas. Como voce pode ver, as

    regras de normalizacao sao simples e assernelham-se as regras praticas que derivamos anteriormentecom base em nossa intuicao e born senso. As segunda e terceira regras sao quase identicas - algunsautores as combinam em uma iinica regra. A diferenca e que a segunda regra remove as dependenciesentre os campos e a chave prima ria: voce testa a dependencia de cada campo contra 0campo-chave.A terceira regra remove as dependencies entre campos que nao sao campos-chave.

    Resumindo, voce deve usar 0born sen so para dividir seus dados em tabelas separadas. Use umatabela separada para cada entidade. Depois estabeleca relacionamentos entre tabelas (claro, se elaspuderem ser relacionadas). Durante este processo voce pode precisar inserir tabelas adicionais paraconectar as tabelas basicas de seu projeto. Algumas tabelas nao podem ser ligadas diretamente. A cadaestagio aplique as tres regras de normalizacao em suas tabelas para ter certeza de que seu banco dedados esta normalizado.

  • 5/10/2018 DataBaseBasico

    29/38

    Cap. 2 Conceitos Basicos de Bancos de Oados Relacionais 55

    F IGURA 2.17Diagrama de banco dedados relacionalnormalizado.

    Normaliza~6eseJun~6esVamos voltar ao banco de dados Northwind por urn momenta ever como 0SGBDutiliza rela~oes.Cada vez que vocA conecta duas tabelas com uma chave comum, 0SGBDdeve desenvolver umaopera~o conhecida como jun~ao. Ele deve juntar as duas tabelas usando as chaves prirnarias eestrangeiras. Jun~oes sao opera~oes muito caras e voce deve tentar minimiza-las. Voce deve observartambl!m que as chaves estrangeiras usadas nas opera~oes de jun~ao sao indexadas para ajudaro SGBDcom opera~oes de busca. Alguns bancos de dados podem usar algumas dezenas de Jun~oespara obter os resultados desejados - operacees muito lentas.

    Como vocA deve ter notado, ha urn conffito entre normellzacac e as jun~oes. Em urn bancode dados grande, voce pode acabar com tabelas relacionadas em excesso,0que tambl!m significaurn grande numero de jun~oes. Muitos administradores e programadores de banco de dados iraQnormalizar urn pouco seus bancos de dados para reduzir 0 numero de jun~oes nas consultas.Enquanto essafor uma pratlca comum, nao baseie 0projeto de seu banco de dados nessapremissa.Se vocA sempre projeta bancos de dados com muitas tabelas, pode ter de trocar algumasnormallzacoes por algumas jun~oes. Nao ha regras rfgidas aqui, apenas use 0 seu born senso.

    As versees anteriores do SOLServer tinham urn limite de 16 jun~oes em uma unica instrucaoSOL. 0 SOLServer 7 aceita urn grande numero de jun~oes, mas acredito que mesmo 16 jun~oessejam demais. Se uma opera~ao requer muitas jun~oes, voce pode criar uma ou duas tabelasIntermediaries com poucas jun~oes, e depois juntar essas tabelas. Obviamente, essas operacoesnao devem ser desenvolvidas frequentemente. Se algumas das suas consultas requerem muitasjun~oes, vocA provavelmente deve revisar 0projeto do banco de dados. Paramais informa~oes sobrejun~oes, veja "Juntando Tabelas" no Capitulo 4. Dequalquer maneira, essetipo de problema apareceem bancos de dados corporativos que sao projetados por equipes de especialistas de MER.

    0 J Integridade de Bancos de Dadosomaior desafio do projeto de bancos de dados e manter sua integridade. Projetar urn banco de dadose apenas 0comeco: voce deve tam bern ter certeza de que 0banco de dados esta sempre em boa forma.A responsabilidade de manter urn banco de dados ern boa forma e compartilhada entre 0administradorde banco de dados (DBA - database administrator) e os programadores.

    Como programador, voce deve ter certeza de que todos os dados que seu codigo coloca no bancode dados sao validos. Essa e uma grande tarefa e requer urn grande volume de validacoes, mas comoaprendera nesta secao, 0 proprio banco de dados pode ajudar.

    Os bancos de dados modernosincluem ferramentas que permitem proteger sua integridade. 0Access e 0SQL Server, por exemplo, permitem que voce incorpore regras que reforcarn a integridadedo banco de dados. Por meio da especificacao de cada tipo de coluna, voce estri normalmente dizendoao banco de dados para nao aceitar qualquer dado que ndo esteja ern conformidade corn essasespecificacoes. Se urn usuario ou urn aplicativo tentar atribuir urn valor numerico para urn campoque arrnazena datas, 0banco de dados rejeitara os valores para proteger a integridade de dados.

    !,

  • 5/10/2018 DataBaseBasico

    30/38

    56 Dominando a Programa~ao de Banco de Dados com Visual Basic 6.0 Cap. 2As regras para reforcar a integridade de urn banco de dad os pod em ser classificadas em trescategorias, descritas a seguir.

    ( 5 ) Integridade de Dominioo primeiro e 0mais simples tipo de integridade e a in ie grid ad e d e d om in ic , urn termo elegante quesignifica que cada coluna deve ter urn tipo unico. Se uma coluna man tern datas, entao nao se devepermitir que os usuaries armazenem valores inteiros ou valores booleanos nessa coluna. Como voceja sabe, quando cria uma tabela, deve declarar 0tipo de dado para cada coluna. Se voce tentar atribuirurn valor de urn tipo errado em uma coluna, 0banco de dados rejeitara a operacao e apresentara urnerro tratavel em tempo de execucao. Seja qual for a concepcao de seu aplicativo, voce pode testar 0tipo de dado do valor fomeddo pelo usuario contra 0 tipo de dado da coluna ou interceptar 0errode tempo de execucao que acontecera e trata-lo coerentemente.Integridade de Entidadeo segundo tipo de integridade e a i ni eg ri da d e d a e ni id a de , que significa que uma entidade (urn cliente,produto, nota fiscal etc.) deve ter uma chave primaria valida, Se a chave primaria de uma tabela enula, nenhuma linha em outras tabelas pode ser conectada a esta linha. Todos os SGBDs podem garantira obediencia a esse tipo de integridade, impedindo a insercao de linhas com chaves nulas ou impedindoalteracoes que resultarao em urn valor nulo para a chave primaria. Tudo 0 que voce deve fazer paragarantir a obediencia a esse tipo de integridade e configurar a propriedade Nullable da coluna que eusada como chave primaria para falso. Normalmente, voce nem mesmo precisa configurar a propriedadeNullable, porque tanto 0Access quanta 0SQL Server nao aceitarao valores nulos para campos chavesprimaries.Integridade ReferencialEste e urn dos t6picos mais importantes do projeto de bancos de dados. Projetar bancos de dados eurn processo relativamente rapido, uma vez que voce entendeu as necessidades da empresa (ainformacao que voce armazenara no banco de dados, como ela sera recuperada e as relacoes entre asvarias tabelas). Igualmente importante, se nao for 0mais importante, e assegurar que os variosreladonamentos permanecam valid os 0tempo todo.

    Os reladonamentos tern como base chaves primaries e estrangeiras. 0 que acontecera se a chaveprimaria de urn reladonamento for excluida? Se voce excluir uma linha na tabela Customers, porexemplo, alguns pedidos se tornarao "orfaos": eles farao uma referenda a urn cliente que nao existe.Seus aplicativos continuarao fundonando, mas a qualquer momento voce obtera resultados incorretos.Nada acontecera, por exemplo, no calculo do total de urn certo cliente existente.

    Se voce calcular 0total geral de todos os clientes, obtera urn valor. Se calcular 0 total geral paratodas as linhas de detalhes, obtera urn valor diferente. Esse tipo de inconsistencia nao deve existirem urn banco de dados. Vma vez que voce percebeu que seu banco de dados esta em estado inconsis-tente, deve cornecar examinando cada tabela para en tender por que e quando isso aconteceu e quaisoutros relat6rios nao sao utilizaveis, Essa e a maior dor de cabeca que voce pode evitar. E e facil evitaresse problema reforcando a integridade referendal do banco de dados.

    Os problemas relacionados com integridade referendal de bancos de dados tambem podem serintermitentes. Se urn cliente eliminado nao fez nenhum pedido nos iiltimos 12 meses, todos os totalsque voce calcular para os iiltirnos 12 meses estarao corretos. Se voce receber urn pagamento (muito)atrasado desse cliente, contudo, nao sera capaz de inseri-lo no banco de dados. Nao havera clientecorrespondente a esse pagamento.Garantindo a Integridade ReferencialTanto 0Access quanta 0SQL Server podem ser program ados para garantir a integridade referencial.Se voce garantir a integridade do reladonamento entre Customers e Orders, por exemplo, quando

  • 5/10/2018 DataBaseBasico

    31/38

    Cap. 2 Conceitos Basicos de Bancos de Dados Relacionais 57um aplicativo ten tar excluir um cliente, 0banco de dados apresentara um erro de tempo de execucaoe nao permitira a exclusao do registro. Se um cliente nao tem p