TPC1
• Numa empresa cada empregado tem no máximo uma habilitação mas
uma dada habilitação pode ser possuída por vários empregados.
• Um empregado está habilitado a operar determinado tipo de
máquina se tiver uma de entre várias habilitações, mas cada
habilitação está associada com a operação de um único tipo de
máquina.
• Possuir uma dada habilitação permite ao empregado manter vários
tipos de máquinas apesar de a manutenção de um tipo de máquina
requerer uma habilitação específica.
TPC1 (cont)
a) Desenhe o diagrama E-A usando as seguintes entidades e
associações:
Entidade Associação Entidade
Habilitação Possuída_por Empregado
Tipo_Máquina Necessita_para_Operação Habilitação
Habilitação Permite_Manutenção Tipo_Máquina
b) Redesenhe o diagrama com as associações
Necessita_para_Operação e Permite_Manutenção combinados numa
só associação M:N Operação_ou_Manutenção
Revisão
• Diagramas E-A
• Entidades, atributos e associações
• Associações 1:1, 1:N, M:N
• Obrigatoriedade de participação
• Decomposição de relações M:N
Sumário
• Associações Complexas
• Situações Ambíguas
• Entidades fracas
• Associação unária e Papel
• Generalização e Especialização
• Agregação
• Restrições não-formalizáveis
• Erros comuns
Exemplo
• Qualquer fornecedor fornece qualquer peça a qualquer cliente
Fornecedor Peça Cliente
F1 P1 C1
F2 P1 C2
F2 P2 C1
Solução: 3 associações?
• Que fornecedores fornecem que peças?
• Que peças são fornecidas a que clientes?
• Que fornecedores fornecem que clientes?
• Que fornecedores fornecem que peças a que clientes?
Fornecedor Peça Cliente
F1 P1 C1
F2 P1 C2
F2 P2 C1
Associações Complexas
• Relacionam mais do que duas entidades entre si
• Devem ser usadas apenas quando o conceito não pode ser
representado por um conjunto de associações binárias
Associações Complexas Grau 1:1:1
• A cada par de ocorrências das entidades B e C está associada apenas
uma ocorrência de A (ou nenhuma)
• Análogo para B e C
Associações Complexas Grau (1:1:N)
• A cada par de ocorrências das entidades B e C está associada uma, várias
ou nenhuma ocorrência de A
• A cada par de ocorrências de A e C está apenas uma ocorrência de B
• A cada par de ocorrências de A e B está apenas uma ocorrência de C
• Análogo para 1:M:N e M:N:P
Associações Complexas Grau 1:1:1
• A cada par de ocorrêmcoas das entidades B e C está associada apenas
uma ocorrência de A (ou nenhuma)
• Análogo para B e C
Solução: 3 associações?
• Que fornecedores fornecem que peças a que clientes?
Fornecedor Peça Cliente
F1 P1 C1
F2 P1 C2
F2 P2 C1
Solução: Associação Complexa (M:N:P)
• Qualquer fornecedor fornece qualquer peça a qualquer cliente
• Decompor em associações 1:N
Situações Ambíguas (Fan Trap)
• Permite responder às questões:
• Quais os empregados de uma direção?
• Quais os departamentos de uma direção?
• A que direção pertence um empregado?
• A que direção pertence um departamento?
• A que departamento pertence um empregado?
• Quais os empregados de um departamento?
Fan Trap
N:1/1:N
Situações Ambíguas (Chasm Trap)
• E se um empregado pertencer a uma direção mas não pertencer a um
departamento?
Chasm Trap
1:N/1:N
Exercício 1
• Numa companhia cada departamento possui um carro que só pode
ser usado por empregados do departamento devidamente
autorizados. Considere a estrutura
Carro (N_registo, marca)
Departamento (Nome_dep, localização)
Empregado (N_emp, nome_emp, categoria)
Exercicio 1 (cont.)
• Se souber o número de um empregado autorizado, a estrutura
permitirá determiner qual o carro utilizado?
• Se souber o número de registo de um carro poderá saber que
empregados estão autorizados a usá-lo?
• Como pode o diagrama ser estendido (por adição de uma associação)
para que represente utilizadores autorizados?
• Como podem ser representados utilizadores autorizados se for
permitido um novo atributo?
Exercício 2
• Um modelo conceptual representa autores e a classificação por temas
dos seus livros. Discuta as vantagens:
Associação unária e Papel
• O papel pode ser especificado para evitar ambiguidades
funcionário
supervisiona
supervisor supervisionado
1 N
Generalização e Especialização
• Quando entidades obedecem a hierarquia de especialização
• Disjoint/Overlapping (default)
• Herança e atributos
empregado
CC nome
IS-A
freelancer
tarifa_horária
horas_trabalho
contratado
salário_mensal
disjoint
Agregação
• Projetos (executados por departamentos) podem ser monitorizados
por um empregado
Empregado
CC nome
até
monitoriza Projeto Departamento
desde
pid inicio did nome
executa
Restrições não formalizáveis
• Não conseguimos representar todo o tipo de restrições no diagrama
E-A
• Descritos como anexo ao diagrama E-A
Empregado Departamento
trabalha
cc did nome
N 1
nome
orçamento
desde até
Restrições de Integridade:
(IC-1) Empregados têm de trabalhar pelo menos três meses num departamento
Erros comuns
• Usar atributos que podem ser calculados (# funcionários)
• Entidades sem atributos
• Restrições anexas que podem ser modeladas
• Entidades com uma única instância (e.g. empresa para base de dados
da empresa)
• Partes isoladas do diagrama
• Agregação de várias associações (agregação deve apenas conter uma
associação)
Sumário
• Estrutura de Bases de Dados Relacionais
• Modelo Relacional
• Estruturas, atributos
• Base de dados relacional
• Chaves
Modelo Relacional
• Criado em 1970 por Edgar F. Codd
• O modelo relacional é independente da implementação
• Facilmente traduzido para base de dados relacionais, mas também
para muitas outras aplicações
• Um modelo formal simples e elegante baseado na teoria dos
conjuntos: permite rapida deteção de anomalias
Ideias fundamentais
• Tudo é representado por relações (conjunto de tuplos)
• Todos os elementos de uma relação devem respeitar o seu esquema
• Todas as operações sobre os dados são operações sobre conjuntos
• Situações que não podem ocorrer são especificadas como restrições
Exemplo de uma Relação
• Como tabela
• Ou como conjunto:
Cliente {(Silva, Av. da Liberdade, Lisboa), (Antunes, Rua da Prata, Lisboa), (Costa,
Av. Aliados, Porto)}
cliente_nome cliente_rua cliente_cidade
Silva Av. da Liberdade Lisboa
Antunes Rua da Prata Lisboa
Costa Av. Aliados Porto
Estrutura Básica
• Formalmente, dados conjuntos D1, D2, …, Dn, a relação r é um subconjunto de D1 x D2 x … x Dn
Logo, a relação é um conjunto de n-tuplos (a1, a2, …, an) onde ai e Di
• Exemplo: Se
• cliente_nome = {Silva, Antunes, Costa}
• cliente_rua = {Av. Da Liberdade, Rua da Prata, Av. Aliados}
• cliente_cidade = {Lisboa, Porto}
Então
r = {(Silva, Av. da Liberdade, Lisboa), (Antunes, Rua da Prata, Lisboa),
(Costa, Av. Aliados, Porto)}
É uma relação sobre
cliente_nome x cliente_rua x cliente_cidade
Tipo de Atributos
• Cada atributo de uma relação tem um nome
• O conjunto de valores permitidos por cada atributo é designado por
domínio
• Valores dos atributos são necessariamente atómicos
i.e. um único valor indivisivel
Exemplo Entidade
• Consideremos a entidade Pessoa com os atributos: NISS, primeiro
nome, último nome, idade
• Pessoa(NISS, primeiro_nome, ultimo_nome, idade)
• Onde os domínios dos atributos são:
• NISS – conjunto, S, dos números de segurança social
• primeiro_nome – conjunto, A, de sequências finitas de letras
• ultimo_nome – conjunto, A, de sequências finitas de letras
• idade – conjunto, N, dos inteiros positivos < 150
• Função: (NISS, primeiro_nome, ultimo_nome, idade): Pessoa −> S x A x A x N
Esquema da Relação
• A1, A2, …, An são atributos
• R = (A1, A2, …, An) é o esquema da relação
• Exemplo
Cliente=(cliente_nome, cliente_rua, cliente_cidade)
• r(R) é uma relação no esquema R
• Exemplo
cliente(Cliente)
• Ou
cliente(cliente_nome, cliente_rua, cliente_cidade)
Instâncias da Relação
• Os valores (instâncias) de uma relação são especificados por uma
tabela
• Um elemento t de r é um tuplo, representado por uma linha da tabela
cliente_nome cliente_rua cliente_cidade
Silva Av. da Liberdade Lisboa
Antunes Rua da Prata Lisboa
Costa Av. Aliados Porto
Atributos (colunas)
tuplos
(linhas)
Propriedades das Relações
• Não contém tuplos duplicados (é um conjunto)
• Não contém nome de atributos duplicados
• A ordem dos tuplos é irrelevante
• A ordem dos atributos é irrelevante
Base de Dados Relacional
• A Base de Dados consiste em múltiplas relações cujo conteúdo varia no tempo
• Esquema relacional é a descrição das estrutura das relações de BD Relacional
• A informação sobre a empresa é decomposta por partes, onde cada relação
guarda uma parte da informação
• conta: guarda informação sobre contas
• titular: guarda informação sobre a titularidade de clientes sobre contas
• cliente: guarda informação sobre clientes
• Porque não armazenar toda a informação numa só relação?
banco(conta_numero, saldo, cliente_nome, …)
A base de dados banco
conta_numero agencia_nome saldo
A-102 Lumiar 500
A-217 Campolide 1000
A-222 Caparica 1500
A-201 Campanhã 700
cliente_nome cliente_rua cliente_cidade
Silva Av. da Liberdade Lisboa
Antunes Rua da Prata Lisboa
Costa Av. Aliados Porto
Pereira Av. da Liberdade Lisboa
Nunes Rua Forte Almada
cliente_nome conta_numero
Silva A-102
Antunes A-101
Antunes A-305
Costa A-201
Pereira A-217
Nunes A-222
Chaves
• Seja K ⊆ R
• K é superchave de R se os valores para K forem suficientes para identificar
um único tuplo de cada possivel relação r(R)
• Possivel r significa uma relação que poderia existir na organização que estamos a
modelar
• Exemplo: {cliente_nome, cliente_rua} e {cliente_nome} são ambos supercahve de
cliente, se não for possivel ter dois clientes com o mesmo nome
• K é uma chave candidate se K é mínimo
• Exemplo: {cliente_nome} é chave candidate para cliente, uma vez que é superchave
mas não contém subconjuntos que sejam superchave
• Chave primária é uma chave candidate usada como identificador principal
de um tuplo
Chaves na relação cliente
• Será {cliente_nome, cliente_rua, cliente_cidade} uma superchave?
• Será {nome_rua} chave candidate?
• Será {nome_rua, nome_cidade} superchave?
cliente_nome cliente_rua cliente_cidade
Silva Av. da Liberdade Lisboa
Antunes Rua da Prata Lisboa
Costa Av. Aliados Porto
Pereira Av. da Liberdade Lisboa
Nunes Rua Forte Almada
Chaves na relação titular
• Quais as chaves candidatas?
cliente_nome conta_numero
Silva A-102
Antunes A-101
Antunes A-305
Costa A-201
Pereira A-217
Nunes A-222
Chaves Estrangeiras
• Uma chave estrangeira é uma conjunte de atributos que referencia a
chave primária (ou chave candidata) de outra tabela
• Obriga a que um valor que apareça numa relação apareça igualmente
numa segunda relação
• Exemplo: Se “Lumiar” é o nome de uma agência que aparece nos tuplos de
uma relação conta, então existe obrigatoriamente um tuplo na relação
agências com valor “Lumiar”
Exemplos de Chaves Estrangeiras
conta_numero agencia_nome saldo
A-102 Lumiar 500
A-217 Campolide 1000
A-222 Caparica 1500
A-201 Campanhã 700
cliente_nome cliente_rua cliente_cidade
Silva Av. da Liberdade Lisboa
Antunes Rua da Prata Lisboa
Costa Av. Aliados Porto
Pereira Av. da Liberdade Lisboa
Nunes Rua Forte Almada
cliente_nome conta_numero
Silva A-102
Antunes A-101
Antunes A-305
Costa A-201
Pereira A-217
Nunes A-222
Sumário
• Linguagem de Definição de Dados
• Criar Base de Dados
• Popular Base de Dados
• Trabalho prático
• Linguagem de Manipulação de Dados
• Query
• Trabalho prático
Base de Dados exemplo
• conta(conta_numero, agencia_nome, saldo)
• agencia(agencia_nome, agencia_cidade)
• cliente(cliente_nome, cliente_rua, cliente_cidade)
• emprestimo(emprestimo_numero, agencia_nome, quantia)
• titular(nome_cliente, conta_numero)
• devedor(nome_cliente, emprestimo_numero)
Linguagem de Definição de Dados
• Permite a especificação não só do conjunto de relações como
também a informação sobre cada relação incluindo:
• O esquema de cada relação
• O domínio de valores associados a cada atributo
• Restrições de integridade
• O conjunto de índices a manter para cada relação
• Informação de segurança e autorização sobre cada relação
• A estrutura física de armazenamento de uma relação no disco
Tipos de domínios em SQL
• char(n) – string de caracteres de tamanho fixo, tamanho n
especificado pelo utilizador
• Varchar(n) – string de comprimento variável com número máximo de
caracteres n especificado pelo utilizador
• Integer – inteiro
• Numeric(p,d) – número de virgula fixa, com precisão do número de
digitos p e d especificado pelo utilizador
• … muitos outros
Criação de Tabelas
• Em SQL uma relação é definida usando o comando create table:
CREATE TABLE r (
A1 D1, A1 D2, …, An Dn,
constraint1, …, constraintm
)
• r é o nome da relação
• cada Ai é um atributo no esquema da relação r
• Di é o tipo de valores no domínio do atributo Ai
CREATE TABLE agencia (
agencia_nome char(15),
agencia_cidade char(30)
)
Restrições de Integridade
• Assegurar valores não nulos: not null
• Definir identificador: primary key (A1, …, An)
CREATE TABLE agencia (
agencia_nome CHAR(15),
agencia_cidade CHAR(30) NOT NULL,
PRIMARY KEY (agencia_nome)
)
• Chave primária implica que atributo não é null
Apagar e Alterar Tabelas
• O comando drop table apaga toda a informação da relação
DROP TABLE r
• O comando alter table é usado para adicionar ou remover atributos
de uma relação já existente
ALTER TABLE r ADD A D
ALTER TABLE r DROP A
• Onde A é o nome do atributo e D o dominio do atributo
• Ao adicionar um atributo, este assumirá o valor null para todos os tuplos já
existentes
• A remoção de atributos não é suportada por muitos sistemas de BD
Inserção de Tuplos
• O comando insert into permite inserir novos tuplos na tabela
• Inserir um novo tuplo na tabela conta:
INSERT INTO conta
VALUES (‘A-9732’, ‘Campolide’, 1200)
Ou
INSERT INTO conta (agencia_nome, saldo, conta_numero) VALUES (‘Campolide’,
1200, ‘A-9732’)
Estrutura Básica de uma Query
• O formato típico de uma query SQL é:
SELECT A1, A2, …, An
FROM r1, r2, …, rm
WHERE P
• Ai representa um atributo
• Ri representa uma relação
• P é o predicado
• O resultado de uma query é uma relação
A clausula SELECT
• O comando SELECT lista os atributos desejados no resultado da query
• Exemplo: encontrar nomes de todas as agências na relação
empréstimo:
SELECT agencia_nome
FROM emprestimo
• Nota: As palavras-chave SQL são case insensitive
A clausula SELECT (cont)
• O SQL permite duplicados nas relações assim como no resultado da
query
• Para forçar a eliminação de resultados duplicados, podemos usar a
palavra chave DISTINCT na query
• Exemplo: encontrar nomes de todas as agências na relação
empréstimo e remover duplicados:
SELECT DISTINCT agencia_nome
FROM emprestimo
A clausula SELECT (cont)
• Um asterisco no comando select significa “todos os atributos”
SELECT *
FROM emprestimo
• O comando SQL pode conter expressões aritméticas que envolvam
operações +,-,* e / operando sobre constants e/ou atributos de
tuplos
SELECT empréstimo_numero, quantia*100
FROM emprestimo
• Retorna uma relação com o valor da quantia multiplicado por 100.
A clausula WHERE
• A clausula WHERE especifica as condições que o resultado deve satisfazer
• Exemplo: encontrar todos os número de empréstimo para empréstimos
feitos na agência de Campolide e cuja quantia é superior a 1200€
SELECT empréstimo_numero
FROM empréstimo
WHERE agencia_nome = ‘Campolide’ AND quantia > 1200
• Resultados de comparações podem ser combinados através de operadores
lógicos AND, OR ou NOT
• As comparações podem ser aplicadas ao resultado de expressões
aritméticas
A clausula WHERE
• O SQL possui um operador de comparação BETWEEN
• Exemplo: encontrar todos os número de empréstimo para
empréstimos cuja quantia é superior a 1200€ e menor que 5000€
SELECT empréstimo_numero
FROM empréstimo
WHERE quantia BETWEEN 1200 AND 5000
A clausula FROM
• A cláusula FROM lista as relações envolvidas na query
• Corresponde ao produto cartesiano da operação
• Exemplo: encontrar produto cartesiano titular x emprestimo
SELECT *
FROM titular, empréstimo
A clausula FROM (cont)
• Exemplo: encontrar nome, número de empréstimo e quantia de
todos os clientes que têm um empréstimo na agência de Campolide
SELECT cliente_nome, empréstimo.empréstimo_numero, quantia
FROM devedor, empréstimo
WHERE empréstimo.empréstimo_numero = devedor.empréstimo_numero
AND agencia_nome = ‘Campolide’
Renomear
• O SQL permite renomear as relações e atributos utilizando a clausula
AS:
nome_antigo AS novo_nome
• Exemplo: encontrar nome, número de empréstimo e quantia de
todos os clientes; muda o nome da coluna emprestimo_numero para
emprestimo_id
SELECT cliente_nome, empréstimo.empréstimo_numero AS empréstimo_id, quantia
FROM devedor, empréstimo
WHERE empréstimo.empréstimo_numero = devedor.empréstimo_numero
Variáveis Tuplo
• Variáveis de tuplo são definidas na clausula FROM através da
utilização (opcional) da cláusula AS:
• Exemplo: encontrar nome, número de empréstimo e quantia de
todos os clientes que têm empréstimo
SELECT D.cliente_nome, D.empréstimo_numero, E.quantia
FROM devedor AS D, empréstimo AS E
WHERE E.empréstimo_numero = D.empréstimo_numero
Operadores de Strings
• O operador LIKE permite pesquisar strings utilizando padrões descritos
com dois caracteres especiais
• Percentagem (%) – coincide com qualquer substring
• Underscore (_) – coincide com qualquer caracter
• Exemplo: encontrar nome de todos os clientes cujo nome da rua contenha
Liberdade
SELECT cliente_nome
FROM cliente
WHERE cliente_rua LIKE ‘%Liberdade%’
• O SQL suporta muitas outras operações sobre strings
Ordenação de Tuplos
• Listar por ordem alfabética os nome de todso os clientes com um
empréstimo na agência de Campolide
SELECT DISTINCT D.cliente_nome
FROM devedor AS D, empréstimo AS E
WHERE E.empréstimo_numero = D.empréstimo_numero
AND agencia_nome = ‘Campolide’
ORDER BY cliente_nome
• Para especificar ordem o sentido da ordem podemos usar a palavra
DESC ou ASC (default)
ORDER BY cliente_nome DESC