Banco de Dados I 2007 Módulo II: Modelagem EntidadeRelacionamento versus Relacional (Aula 3) Clodis Boscarioli Agenda: Exercícios de Mapeamento ME-R para MR; Restrições de Domínio; Restrições de Chave e em Valores Null; Integridade Referencial; Asserções; Gatilhos; Dependência Funcional. Introdução Em um banco de dados relacional existem muitas relações, e as tuplas destas relações estão, em geral, relacionadas de diversas maneiras. Existem muitas limitações ou restrições em relação ao valores reais permitidos em um banco de dados. Estas limitações ou restrições são derivadas do mundo real. Podem ser: Restrições inerentes baseadas em modelo (uma relação não pode ter tuplas repetidas) Restrições baseadas em esquema; Restrições baseadas em aplicação. Introdução Fornecem meios para assegurar que mudanças feitas no banco de dados, por usuários autorizados, não resultem em perda da consistência dos dados. Resguardam o banco de dados contra danos acidentais. Restrições no modelo entidade-relacionamento: Declarações de chave: o conjunto de inserções válidas e atualizações é restrito àquelas que não criam duas entidades com o mesmo valor numa chave candidata. Forma de um relacionamento: restringe os conjuntos relacionamentos legais entre entidades de uma coleção de conjuntos-entidade. Uma restrição de integridade pode ser um predicado arbitrário pertencente ao banco de dados. No entanto, os predicados arbitrários podem ser custosos em relação a testes. Deve-se optar por restrições de integridade que possam ser testadas com a mínima manipulação. Restrições de Domínio São a forma mais elementar de restrições de integridade. São testadas facilmente pelo sistema toda vez que um novo item de dado é inserido no banco de dados. Vários atributos podem ter o mesmo domínio. A própria definição de restrição de domínio permite testar os valores inseridos no banco de dados. Dentro de cada tupla, o valor de cada atributo A deve ser um valor atômico no domínio dom(A). Restrições de Domínio A cláusula check (SQL) Permite determinar um predicado que deva ser satisfeito por qualquer valor designado a uma variável. Exemplo: Garantir que o domínio relativo ao turno de trabalho de um operário contenha somente valores maiores que um dado valor (turno mínimo). Sintaxe: create domain número_conta char(10) constraint teste_nulo_numero_conta check(value not null) create domain tipo_conta char(10) Constraint teste_tipo_conta check(value in (“Corrente”,”Poupança”)) Restrições de Chave e em Valores Null Sempre existe um sub-conjunto de atributos de um esquema de relação R com a propriedade de que duas tuplas, em qualquer estado da relação r de R, não tenham as mesmas combinações de valores para esses atributos. Seja SK este subconjunto de atributos; então, para quaisquer tuplas distintas t1 e t2 em um estado (ou instância) da relação r de R, tem-se a restrição que: t1[SK] <> t2[SK] Valores nulos não se aplicam a chaves e a atributos definidos como not null (restrição de integridade de entidade). Nova definição... Um esquema de banco de dados relacional S é um conjunto de esquemas de relação S = {R1, R2, ..., Rm} e um conjunto de restrições de integridade IC. Uma instância de um banco e dados relacional DB de S é um conjunto dos estados da relação DB = {r1, r2, ..., rm} de forma que cada ri seja uma instância de Ri, e de maneira que os estado da relação ri satisfaçam as restrições de integridade especificadas em IC. Adendo: A Junção Natural ( |X| ) A junção natural (natural join) é uma operação binária que nos permite combinar certas seleções e um produto cartesiano em uma única operação. Forma-se um produto cartesiano de duas relações e promove-se uma seleção de tuplas, obedecendo à equivalência dos atributos que aparecem em ambas as relações e, finalmente, remove-se os atributos em duplicidade. Integridade Referencial Utilizadas para garantir que um valor que aparece em uma relação para um dado conjunto de atributos também apareça para um certo conjunto de atributos em outra relação. Considere um par de relações r(R) e s(S) e a junção natural r |x| s. Pode existir uma tupla tr em r que não possa ser combinada a nenhuma tupla em s. Isto é, não existe nenhum ts em s tal que tr[R ∩ S] = ts[R ∩ S]. Tais tuplas são chamadas tuplas pendentes. Dependendo do conjunto de entidades ou de relacionamentos que está sendo modelado, tuplas pendentes podem ou não ser aceitáveis. Integridade Referencial Suponha que existe uma tupla r na relação conta, com t1[nome_agência] = “Agência Cascavel”, mas que não exista uma tupla na relação agência para “Agência Cascavel”. Esta é uma situação indesejável. Espera-se que a relação agência possua todas as agências do banco. Portanto, a tupla t1 faz referência a um conta de agência inexistente. É desejável a implementação de uma regra de integridade que proíba tupla pendentes desse tipo. No entanto, nem todos os tipos de tuplas pendentes são indesejáveis. Suponha que exista uma tupla t2 na relação agência, com t2[nomeagência] = “Agência Toledo”, mas não há nenhuma tupla da relação conta com referência à agência Toledo. Esse caso indica que a agência Toledo não possui nenhuma conta. Integridade Referencial Diferença entre as duas situações: o atributo nome-agência do Esquema_conta é uma chave estrangeira cuja referência é a chave primária do Esquema_agência. O atributo nome_agência do Esquema_agência não é uma chave estrangeira. Seja r1(R) e r2(R) relações com chaves primárias K1 e K2, respectivamente. Dizemos que um subconjunto α de R2 é uma chave estrangeira associada a K1 em relação a r1 se é garantido que, para todo t2 em r2, existe uma tupla t1 em r1, tal que t1[K1] = t2[α]. Exigências destes tipo são chamadas de regras de integridade referencial. Integridade Referencial no ME-R Se derivarmos nosso esquema de banco de dados relacional a partir de diagramas E-R, então toda relação resultante de um conjunto de relacionamentos possui regras de integridade. Outra fonte de regras de integridade são os conjuntos de entidades fracas. Modificações no Banco de Dados Modificações no banco de dados podem originar violação das regras de integridade referencial. Suponha a integridade referencial existente entre r1 e r2, onde r2 detém a chave estrangeira α em relação a chave primária K de r1. Inserção: se uma tupla t2 é inserida em r2, o sistema deve garantir que exista uma tupla t1 em r1 tal que t1[K] = t2[α] Remoção: se uma tupla t1 é removida de r1, o sistema deve tratar também o conjunto de tuplas em r2 que se referem a t1. Atualização: Se uma tupla t2 da relação r2 é atualizada e a atualização modifica valores da chave estrangeira, então é feita uma verificação similar à inserção. Se uma tupla t1 da relação r1 é atualizada e a atualização modifica os valores de uma chave primária, então deverá ser feita uma verificação similar à realizada para a remoção. Asserções Uma asserção é um predicado que expressa uma condição que desejamos que seja sempre satisfeita no banco de dados. Restrições de domínio e regras de integridade referencial são formas especiais de asserções. Exemplos de outras asserções: A soma de todos os totais em empréstimo de cada uma das agências deve ser menor que a soma de todos os saldos das contas dessa agência. Todo empréstimo deve ter ao menos um cliente que mantenha uma conta com saldo mínimo de mil reais. Quando uma asserção é criada, o sistema verifica sua validade. Se as asserções são válidas, então qualquer modificação posterior do banco de dados será permitida somente quando não violar a asserção. Gatilhos (Triggers) Um gatilho é um comando que é executado pelo sistema, automaticamente, em conseqüência de uma modificação no banco de dados. Exigências: Especificar as condições sob as quais o gatilho deve ser executado; Especificar as ações que serão tomadas quando um gatilho for disparado. Exemplo: Ao invés de permitir saldos negativos em conta, o banco pode criar condições para que a conta corrente seja zerada e o saldo negativo seja transformado em um empréstimo. Dependência Funcional Próxima aula... Referências Sistemas de Banco de Dados. (Cap. 6) Abraham Silberchatz, Henry F. Korth e S. Sudarshan. 3ª Edição. Makron Books, 1999. Introdução a Banco de Dados (Apostila). (Cap. 5-6) Osvaldo Kotaro Takai, Isabel Cristina Italiano, João Eduardo Ferreira. DCC-IME-USP, 2005. Sistemas de Banco de Dados. (Cap. 5 e 10) Ramez Elsmari e Shamkant B. Navathe. 4ª Edição. Editora Pearson Addison Wesley, 2005.