Colégio Técnico Universitário Departamento de Informática Banco de Dados Prof. Stênio Sã Material obtido a partir dos slides do curso do professor Weyler Lopes CEFET PI
Parte I Conceitos básicos em Banco de dados
Parte II Modelagem de dados: Modelo E R
EXTENSÕES DO MODELO E R Possuem o objetivo de aumentar o poder de expressão do modelo provendo novos meios de representações. As principais extensões são: Especialização Generalização Herança de Atributos Agregação No paradigma da Orientação a Objeto, veremos estes conceitos na modelagem de sistema através de Diagramas de Classes.
Especialização Definição de uma entidade que é um subconjunto de uma outra entidade Generalização Definição de uma entidade que é um superconjunto de uma outra entidade Na prática, uma especialização ou uma generalização produzem o mesmo conjunto de entidades. O que as diferem é a ordem que as entidades são geradas
Agregação Ocorre quando um conjunto de entidades e relacionamentos comportam se como se fosse uma entidade. Podendo desta forma associar com com outras entidades.
Outra Representação para Agregação
Parte III Modelo Relacional: detalhamento
CONCEITOS BÁSICOS O modelo relacional representa os dados num BD como uma coleção de tabelas (relações). Cada tabela terá um nome, que será único, e um conjunto de atributos com seus respectivos nomes e domínios. Todos os valores de uma coluna são do mesmo tipo de dados. Exemplo de uma tabela:
CONCEITOS BÁSICOS (continuação) Terminologia do modelo: Tabela é chamada de Relação Linha é chamada de Tupla Coluna é chamada de atributo Associado a um tipo de dados há um domínio. Um domínio D é um conjunto de valores atômicos. Exemplo: IdadeAluno: inteiro entre 16 e 70. Um esquema de relação R é denotado por R(A1,A2,...,An), onde é R representa um conjunto de atributos: R = {A1,A2,...,An}. O grau de uma relação é o número de atributos que seu esquema contém.
CONCEITOS BÁSICOS (continuação) Um instante (snapshot) de relação r, do esquema R(A1, A2,...,An), denotado por r(r), é o conjunto de n tuplas r = {t1,t2,...,tn}. Cada tupla t é uma lista ordenada de valores t = <v1,v2,...,vn> Uma instância r(r) é um subconjunto do produto cartesiano dos domínios de R. r(r) C (dom(a1) X dom(a2) X... X dom(an))
ASPECTOS IMPORTANTES DAS RELAÇÕES A ordem das tuplas e dos atributos não tem importância. Todo atributo possui valor atômico. Cada atributo numa relação tem um nome que é único dentro da relação. Todas as tuplas devem ser únicas (conjunto). A fundamentação matemática está sempre presente.
CONCEITO DE CHAVE Superchave Conjunto de um ou mais atributos que, tomados coletivamente nos permite identificar de maneira unívoca uma tupla em um conjunto de tuplas. Chave candidata É uma superchave para qual nenhum subconjunto possa ser uma superchave. Chave primária é a chave candidata que é escolhida pelo projetista para identificar tuplas dentro de um conjunto de tuplas.
CHAVES DE UMA RELAÇÃO Convenciona se sublinhar os atributos que compõem a chave primária. Ex.:Empregado (Matrícula, Nome, Endereço, Função,Salário) Um mesmo atributo pode ter nomes diferentes nas diversas relações em que participa. Ex.: Empregado (Matrícula, Nome, Endereço, Função, Salário, Dep) e Departamento(CodDepart, Nome, Endereço) Atributos que representam diferentes conceitos podem ter o mesmo nome.
RESTRIÇÕES DE INTEGRIDADE Integridade de Chave: Toda tupla tem um conjunto de atributos que a identifica de maneira única na relação. Integridade de Entidade: Nenhum valor de chave primária poderá ser NULO. Integridade Referencial: Uma relação pode ter um conjunto de atributos que contém valores com mesmo domínio de um conjunto de atributos que forma a chave primária de uma outra relação. Este conjunto é chamado chave estrangeira. Integridade Semântica: Define aspectos comportamentais do BD. Exemplo: Nenhum aluno que não cursou ICC poderá cursar Ling. de Programação.
Parte IV mapeamento E R para o modelo Relacional
MAPEAMENTO E R > RELACIONAL Para cada modelo conceitual E R pode existir vários modelos Relacionais. A maioria das ferramentas de modelagem conceitual automatizam o mapeamento. Porém é importante conhecer as etapas deste mapeamento. A definição equivocada do modelo Relacional afeta a estrutura de todo o projeto. Muitas vezes a maneira como implementar as tabelas no modelo relacional dependem de decisões de projeto e não de regras pré estabelecidas.
Um simples exemplos de mapeamento
ETAPAS DO MAPEAMENTO ETAPA 1 Mapear todos os conjuntos de entidades não fracas. Caso exista atributo composto, inclua todos os atributos elementares Escolha um dos atributos chave de E como chave primária para a relação
ETAPAS DO MAPEAMENTO ETAPA 1 Mapear todos os conjuntos de entidades não fracas. Caso exista atributo composto, inclua todos os atributos elementares Escolha um dos atributos chave de E como chave primária para a relação
ETAPAS DO MAPEAMENTO Funcionário = {FNúmero, FNome, Endereço, Salário} Departamento = {DNúmero, DNome} Projeto = {PNúmero, PNome}
ETAPAS DO MAPEAMENTO Funcionário = {FNúmero, FNome, Endereço, Salário} Departamento = {DNúmero, DNome} Projeto = {PNúmero, PNome}
ETAPA 2 Para cada conjunto de entidade fraca F no esquema ER cria se uma relação R formada por todos os atributos do conjunto de entidade fraca, mais os atributos que são chave das entidades regulares com as quais a entidade se relaciona. Dependente = {DependNome, FNúmero, DataNiver, Parentesco}
ETAPA 3 Relacionamentos de cardinalidade 1 para 1 devem ser identificados e escolhida a entidade que receberá os atributos do relacionamento, assim como qual a entidade que receberá a chave estrangeira. Funcionário = {FNúmero, FNome, Endereço, Salário} Departamento = {DNúmero, Dnome, FNúmero, DataIni}
ETAPA 4 Para cada conjunto relacionamento de cardinalidade 1 para N, a chave primária da entidade que participa com cardinalidade N terá a chave primária da outra entidade como chave estrangeira. Departamento = {DNúmero, Dnome, FNúmero, DataIni} Projeto = {PNúmero, Pnome, DNro}
ETAPA 5 Para cada relacionamento binário M:N cria se uma nova relação Participar = {FNum, PNum, horas}
ETAPA 6 Um relacionamento ternário produzirá uma relação Oferecer = {OCod, CCod, FNum, Horário}
ETAPA 7 Existem duas maneiras de tratar atributos multivalorados no mapeamento: 1) Sabendo uma estimativa do número de ocorrências do atributo. Assim, pode se adicionar à ralação quantos atributos forem necessários. 2) Caso do número de ocorrências do atributo seja indefinido, cria se uma nova relação. LocalDep = {DNúmero, Localização} Departamento = {DNúmero, Dnome, FNúmero, DataIni, local1, local2, local3}
EXERCÍCIO Baseado no modelo E R, abordado em sala, para a Fórmula 1. Aplique todos os passos para o mapeamento E R > Relacional.
Dúvidas? Página 67
EXERCÍCIO (Última aula) Baseado no modelo E R, abordado em sala, para a Fórmula 1. Aplique todos os passos para o mapeamento E R > Relacional. Página 68
Comentários sobre Exercício Esquema muito simples de ser gerado; Aplicação da etapa 1, abordada na aula passada, define praticamente todas as tabelas; O fato do modelo E R ter sido representado através de uma ferramenta, facilita consideravelmente o processo de mapeamento; Exemplos de Relações do Modelo PILOTO(COD_PILOTO, NOME, DATA_NASC, COD_EQUIPE, COD_PAIS) EQUIPE(COD_EQUIPE, NOME, NOME, COD_PAIS) PAIS(COD_PAIS, NOME, POPULACAO) CIRCUITO(COD_CIRCUITO, NOME, EXTENSAO, COD_PAIS) Página 69
Parte V Linguagem SQL Página 70
Características comuns Estilo declarativo, não procedimental; Permite otimizações; Utilizadas por várias classes de usuários Sintaxe simples e bem definida Presente em todos os SGBDs Relacionais É incorporada comumente a uma outra linguagem; Não é uma linguagem completa como C, Java ou Delphi; Portável entre sistema operacionais; Página 71
Algumas Funcionalidades Uma série de comandos DDL para definição de dados Uma série de comandos DML para manipulação de dados Uma versão de SQL embutida em linguagens de programação Instruções para definição de visões (tabelas virtuais) Instruções para controle de autorização de acesso Instruções para controle de transações e concorrência Instruções para especificação de restrições de integridade Página 72
Instruções SQL/DDL CREATE TABLE Permite a criação de uma tabela CREATE TABLE Emp (EmpNume integer(5) not null, EmpNome char(30) not null, EmpFunc char(20) not null, DepNume integer(4) not null, EmpComi integer(10,2), EmpSala integer(10,2), primary key (EmpNume), foreign key has (DepNume) references Dept on delete restrict on update cascade ); ponto-e-vírgula no final!!!!! Página 73
ALTER TABLE Permite a alteração de uma tabela alter table dept ADD (depsala integer(4)); DROP TABLE Permite a exclusão de uma tabela Drop table EMP CREATE INDEX Permite a criação de índice em uma tabela CREATE unique INDEX EmpNum on Emp(EmpNume asc); Página 74
A Instrução SELECT Permite a recuperação de dados em uma ou mais tabelas. Forma básica: SELECT <lista de colunas> FROM <lista de tabelas> WHERE <critério de seleção> Exemplos: SELECT EmpNome, EmpSala FROM EMP WHERE DepNume > 10; SELECT * FROM DEPT; SELECT nome, matricula FROM cadastro WHERE nome like %Silva% ; Página 75
Alguns operadores usados na cláusula WHERE: BETWEEN.. AND... (Entre dois valores (inclusive)) IN (...) (Lista de valores) LIKE (Com um padrão de caracteres) IS NULL (É um valor nulo) Operadores negativos: <> NOT BETWEEN NOT IN valores) NOT LIKE caracteres) IS NOT NULL (Diferente) (Não entre 2 valores informados) (Não existente numa lista de (Diferente do padrão de (Não é um valor nulo) Página 76
Funções de agregação AVG () (Média do valor n, ignorando nulo) COUNT () (Número de registros) MAX () (Maior valor) MIN () (Menor valor) SUM () (Soma dos valores de n, ignorando nulo) Estas funções podem ser usadas em conjunto com as seguintes cláusulas: GROUP BY (Divide tuplas em grupos menores) HAVING (Especifica grupos que são manipulados) Exemplo: SELECT cod_curso, count(*) FROM matricula GROUP BY cod_curso HAVING count(*) > 10 (lista os cursos com mais de 10 alunos) Página 77
Produto Cartesiano Segue a mesma fundamentação da álgebra dos conjuntos Exemplo: SELECT nome_curso, nome_aluno FROM matricula, curso Produto Cartesiano com predicado de junção Permite associar tuplas de duas tabelas pela relação entre suas chaves primária e estrangeira; Produz resultado equivalente à cláusula JOIN que será abordada adiante; Exemplo: SELECT nome_curso, nome_aluno FROM matricula, curso WHERE matricula.cod_curso = curso.cod_curso (matricula.cod_curso = curso.cod_curso) é o predicado de junção Página 78
Produto Cartesiano Segue a mesma fundamentação da álgebra dos conjuntos Exemplo: SELECT nome_curso, nome_aluno FROM matricula, curso Produto Cartesiano com predicado de junção Permite associar tuplas de duas tabelas pela relação entre suas chaves primária e estrangeira; Produz resultado equivalente à cláusula JOIN que será abordada adiante; Exemplo: SELECT nome_curso, nome_aluno FROM matricula, curso WHERE matricula.cod_curso = curso.cod_curso (matricula.cod_curso = curso.cod_curso) é o predicado de junção Página 79
Junções Maneira eficiente de consulta para dados de múltiplas tabelas Tipos de Junção: INNER JOIN OUTER JOIN LEFT OUTER JOIN FULL OUTER JOIN Exemplo: SELECT customer.cust_id_n, customer.cust_name_s, phone.phone_phonenum_s, phone.phone_type_s FROM customer JOIN phone ON customer.cust_id_n = phone.phone_custid_fn Página 80
Combinando Resultados de Diferentes Consultas Permite que as operações básicas sobre conjunto possam ser aplicadas a conjuntos de tuplas. As cláusulas que define esta operação são: UNION INTERSECT EXCEPT Exemplo: SELECT status_code_s, status_desc_s FROM status_1 UNION SELECT status_code_s, status_desc_s FROM status_1 Todas as 3 cláusula suprimem tuplas repetidas da relação gerada. Página 81
A Instrução INSERT Permite a inserção de dados em uma tabela. Estrutura básica: INSERT INTO <tabela> [<campos>] VALUES <valores>; Estrutura completa: INSERT INTO <table_or_view_name> [(<column_name>,...)] { {VALUES (<literal> <expression> NULL DEFAULT,...)} {<select_statement>} } Exemplo: INSERT INTO DEPT (DepNome, DepOrca, DepLoc, DepNume) VALUES ( Informática, 100.000, Prédio A, 100); Página 82
A Instrução UPDATE Permite a alteração de dados em uma tabela. Estrutura básica: UPDATE <tabela> SET <campo> = <expressão> WHERE <condição>; Estrutura completa: UPDATE <table_or_view_name> SET {<column_name> = <literal> <expression> (<single_row_select_statement>) NULL DEFAULT,...} [WHERE <predicate>] Exemplo: UPDATE EMP SET EMPSALA = EMPSALA * 1,2 WHERE EMPSALA < 1000; Página 83
A Instrução DELETE Permite a exclusão de dados em uma tabela. Estrutura básica: DELETE FROM <tabela> WHERE <condição>; Estrutura completa: DELETE FROM <table_or_view_name> WHERE <predicate> Exemplo: DELETE FROM EMP WHERE EMPSALA > 5000; Página84
Outras Instruções MERGE Permite a combinação das instruções INSERT e UPDATE Estrutura : MERGE INTO [<qualifier>.]<table_name1> USING [<qualifier>.]<table_name2> ON (<condition>) WHEN MATCHED THEN UPDATE SET {<column> = {<expression> DEFAULT},...} WHEN NOT MATCHED THEN INSERT [(<column>,...)] VALUES (<expression> DEFAULT,...); Página 85
Outras Instruções TRUNCATE equivalente ao DELETE, porém mais rápido. Não pode ser utilizado com a cláusula WHERE. Não permite exclusão em quando a tabela é referenciada por uma chave estrangeira. Estrutura : TRUNCATE TABLE <table_name> Como é mais eficiente que o DELETE, uma dica é excluir as integridades de referência a chave estrangeira para executar o TRUNCATE. Exemplo: ALTER TABLE ORDER_LINE DISABLE CONSTRAINT FK_ORDLINE_PRODUCT; TRUNCATE TABLE PRODUCT Página 86
Exercícios Baseado no modelo que representa um campeonato de Fórmula 1, elabore as seguintes consultas em SQL para prover as seguintes informações: Pilotos por Equipe Pilotos por Pais Pilotos por Pais utilizando a cláusula Quantidade de Pilotos por Pais Os 3 países com maior quantidade de pilotos Relação de Pilotos com seus respectivos países Quantidade de pontos por piloto Quantidade de pontos por equipe Vencedor do GP da Malásia Pilotos que mais pontuaram Pilotos que pontuaram Pilotos que ainda não pontuaram Pilotos com maior quantidade de pontos Pais como maior número de pilotos Equipe que nunca corre em casa Pilotos que pontuaram em casa Página 87
Resolução dos Exercícios da Aula Anterior Baseado no modelo que representa um campeonato de Fórmula 1, elabore as seguintes consultas em SQL para prover as seguintes inofrmações: Pilotos por Equipe Pilotos por Pais Pilotos por Pais utilizando a cláusula Quantidade de Pilotos por Pais Os 3 países com maior quantidade de pilotos Relação de Pilotos com seus respectivos países Quantidade de pontos por piloto Quantidade de pontos por equipe Vencedor do GP da Malásia Pilotos que mais pontuaram Pilotos que pontuaram Pilotos que ainda não pontuaram Pilotos com maior quantidade de pontos Pais como maior número de pilotos Equipe que nunca corre em casa Pilotos que pontuaram em casa Página 88
Resolução dos Exercícios da Aula Anterior Pilotos por Equipe select piloto.nome, equipe.nome from piloto, equipe where equipe.cod_equipe = piloto.cod_equip order by equipe.nome Pilotos por Pais select piloto.nome, pais.nome from piloto, pais where pais.cod_pais = piloto.cod_pais order by pais.nome Página 89
Resolução dos Exercícios da Aula Anterior Pilotos por Pais utilizando a cláusula join e a cláusula compute select piloto.nome, pais.nome from piloto inner join pais on pais.cod_pais = piloto.cod_pais order by pais.nome compute count(piloto.nome) by pais.nome compute count(piloto.nome) Quantidade de Pilotos por Pais select pais.nome, count(*) from piloto, pais where pais.cod_pais = piloto.cod_pais group by pais.nome Página 90
Resolução dos Exercícios da Aula Anterior Os 3 paises com maior quantidade de pilotos select top 3 pais.nome, count(*) from piloto, pais where pais.cod_pais = piloto.cod_pais group by pais.nome order by count(*) desc Relação de Pilotos com seus respectivos países Diferentes tipo de Join select piloto.nome, pais.nome from piloto inner join pais on pais.cod_pais = piloto.cod_piloto Página 91
Resolução dos Exercícios da Aula Anterior Os 3 paises com maior quantidade de pilotos select top 3 pais.nome, count(*) from piloto, pais where pais.cod_pais = piloto.cod_pais group by pais.nome order by count(*) desc Página 92
Resolução dos Exercícios da Aula Anterior Relação de Pilotos com seus respectivos países Diferentes tipo de Join select piloto.nome, pais.nome from piloto inner join pais on pais.cod_pais = piloto.cod_piloto select piloto.nome, pais.nome from piloto left outer join pais on pais.cod_pais = piloto.cod_piloto select piloto.nome, pais.nome from piloto Right outer join pais on pais.cod_pais = piloto.cod_piloto select piloto.nome, pais.nome from piloto Full outer join pais on pais.cod_pais = piloto.cod_piloto Página 93
Resolução dos Exercícios da Aula Anterior Criado view que converte colocacao em pontos drop view resultado_pontos create view resultado_pontos as select cod_prova, cod_piloto, pontos = case when colocacao_final = 1 then 10 when colocacao_final = 2 then 8 when colocacao_final = 3 then 6 when colocacao_final = 4 then 5 when colocacao_final = 5 then 4 when colocacao_final = 6 then 3 when colocacao_final = 7 then 2 when colocacao_final = 8 then 1 end from resultado Página 94
Resolução dos Exercícios da Aula Anterior Quantidade de pontos por piloto select p.nome, sum(pontos) soma from piloto p, resultado_pontos r where p.cod_piloto = r.cod_piloto group by p.nome order by soma desc Quantidade de pontos por equipe select e.nome, sum(pontos) soma from equipe e, piloto p, resultado_pontos r where p.cod_piloto = r.cod_piloto and e.cod_equipe = p.cod_equipe group by e.nome order by soma desc Página 95
Resolução dos Exercícios da Aula Anterior Vencedor do GP da Malásia select pil.nome from resultado r, prova p, pais pa, piloto pil, circuito c where c.cod_circuito = p.cod_circuito and p.cod_prova = r.cod_prova and pil.cod_piloto = r.cod_piloto and c.cod_pais = pa.cod_pais and pa.nome = "Malásia" and r.colocacao_final = 1 Pilotos que mais pontuaram select p.nome, count(*) cont from resultado r, piloto p where r.cod_piloto = p.cod_piloto group by p.nome order by c desc Página 96
Resolução dos Exercícios da Aula Anterior Pilotos que pontuaram select nome from piloto p where cod_piloto in (select cod_piloto from resultado r where p.cod_piloto = r.cod_piloto) Pilotos que ainda não pontuaram select nome from piloto p where cod_piloto not in (select cod_piloto from resultado r where p.cod_piloto = r.cod_piloto) Página 97
SUBCONSULTAS ANINHADAS Mecanismos para aninhamento de consultas são suportados pelo SQL: IN select nome from piloto p where cod_piloto in (select cod_piloto from resultado) (Relação do pilotos que pontuaram) NOT IN select nome from equipe p where cod_equipe not in (select cod_equipe from piloto) (Relação de equipes sem pilotos) Página 98
SOME select nome from aluno where cod_turma = 1 and nota > some(select nota from aluno cod_turma = 2) (Relação dos alunos da turma 1 cuja nota é maior que alguma nota da turma 2 ) ALL select nome from aluno where cod_turma = 1 and nota > all(select nota from aluno cod_turma = 2) (Relação dos alunos da turma 1 cuja nota é maior que todas as notas da turma 2 ) Página 99
EXISTS select nome from piloto p where exists in (select * from resultado r where p.cod_piloto = r.cod_piloto) (Relação do pilotos que pontuaram) NOT EXISTS select nome from piloto p where exists not in (select * from resultado r where p.cod_piloto=r.cod_piloto and r.colocaca_final= 1) (Relação do pilotos que não venceram corridas) Vale observar que a cláusula EXISTS pode ser facilmente substituída pela cláusula IN. Porém, deve se estar atento para as particularidades de cada uma delas. Página 100
CRIANDO PROCEDIMENTOS (PROCEDURES/FUNCTIONS) Um procedimento nada mais é que um bloco de comandos de comandos SQL que é executado quando invocado. Exemplo: (MS SQL Server) CREATE PROCEDURE INC_RES @cod_prova numeric, @cod_piloto numeric, @colocacao numeric AS INSERT INTO resultado values(@cod_prova, @cod_piloto, null, @colocacao,null, null) excecutando o procedimento: exec INC_RES (1, 2, 3) Página 101
Exemplo: (PostgreSQL) CREATE FUNCTION um() RETURNS integer AS 'SELECT 1 AS RESULTADO;' LANGUAGE SQL; excecutando o procedimento: SELECT um() AS resposta; resposta 1 No PostgreSQL procedimentos são denotados por Function, enquanto no SQL Server, por Procedure. Na verdade, uma Function é um procedimento que retorna valor. Para definir um Function que não retorna valor em PostgreSQL, o tipo de retorno deve ser declarado como opaque Página 102
CRIANDO TRIGGERS (GATILHOS) Uma trigger é uma ação que é automaticamente executada mediante a ocorrência de um determinado evento. Esta ação é comumente um bloco de comandos SQL; Este evento pode ser um INSERT, UPDATE, DELETE em alguma tabela do banco. Exemplo: (PostgreSQL) CREATE TRIGGER se_dist_existe BEFORE INSERT OR UPDATE ON filmes FOR EACH ROW EXECUTE PROCEDURE verificar_chave_primaria ('did', 'distribuidores', 'did'); Página 103
Exemplo: (MS SQL Server) CREATE TRIGGER Inclui_Pontos ON [Resultado] FOR INSERT AS declare @cod numeric declare @pontos numeric declare @colocacao numeric select @colocacao = inserted.colocacao_final from inserted set @pontos = case when @colocacao = 1 then 10 when @colocacao = 2 then 8 when @colocacao = 3 then 6 when @colocacao = 4 then 5 when @colocacao = 5 then 4 when @colocacao = 6 then 3 when @colocacao = 7 then 2 when @colocacao = 8 then 1 end select @cod = cod_piloto from pontuacao where cod_piloto = (select cod_piloto from inserted) if @cod is null insert into pontuacao values (@cod, @pontos) else update pontuacao set pontos = pontos + @pontos where cod_piloto = (select cod_piloto from inserted) Página 104
Parte V Normalização Página 105
Introdução Conjunto de técnicas baseadas na teoria da decomposição visando eliminar eventuais anomalias de atualização. Anomalias de atualização são anomalias geradas nas bases de dados pelas operações de inserção, exclusão e alteração. Assunto pertinente apenas ao universo dos BD relacionais. Normalizar é decompor relações; Objetivo Definir regras para decompor as relações preservando as dependências funcionais e sem perdas de informações que representam entidades do mundo real. Página 106
1a. Forma Normal Uma relação é dita estar na 1a. forma normal quando todos atributos contêm apenas valores atômicos, e também, todos atributos não contenham valores compostos. Exemplo 1: Pessoa(cod, nome, profissoes) Onde profissoes agrupa um conjunto de profissões. Exemplo 2: Pessoa(cod, nome, endereco(log,num,cep,cidade)) Onde endereco é composto de outros atributos. Vale ressaltar, que a 1a. Forma normal é relaxado em alguns SGBDs relacionais. Página 107
2a. Forma Normal Uma relação é dita estar na 2a. forma normal quando: 4. Está em 1FN 5. Todo atributo que não pertence à chave não depende apenas de uma parte desta chave, mas de toda chave. Se apenas um subconjunto é suficiente para determinar funcionalmente um atributo não chave, a relação não está na 2FN. Exemplo 1: Fornercedor(cod,nome,endereco,artigo,preco) Página 108