Skip to content

IESGO - Professor 🎲 Sandir 🎲 Postgree SQL 🐘

Notifications You must be signed in to change notification settings

Luanqmata/Banco-Dados

Repository files navigation

Rev. Prova Sandir (RPS) 4°Sem - 2°Tri

Para a tabela estar na 1° forma normal ela deve:

-somente possuir valores ATOMICOS

-não ha grupos de atributos repetidos (há apenas um dado por coluna nas linhas)

-existe uma chave primaria

-relação nao possui atributos multivalorados ou relações aninhadas (uma tabela dentro de outra tabela)


image

(Imagem tabela não normalizada, acima!)

image

(Imagem tabela Normalizada!! acima!!)

Obs: Contem 1Pk, Desmembrar o endereço para que nao tenha compostos dentro de um campo só,e na segunda tab temos os telefones não multivalorados e fazendo referenciação a pk da primeira tab.

image

CODIGO da 1°Fn do exemplo:

  -- https://www.youtube.com/watch?v=eRaAMNjCFYw
  -----------------------------Tabela não normalizada--------------------------------
  DROP TABLE cliente;
  SELECT * FROM cliente;
  
  CREATE TABLE cliente (
      cod_cliente INT PRIMARY KEY,
  	nome_cliente VARCHAR(50),
  	telefone_cliente VARCHAR(20),
  	endereco_cliente VARCHAR(150)
  )
  
  INSERT INTO cliente (cod_cliente, nome_cliente, telefone_cliente, endereco_cliente)
  VALUES
  (2532, 'José ', '998241004,998877665', 'Rua 19, 244 - Formosinha'),
  (2536, 'Marcus ', '998877665', 'Avenida Brocoto, 670 apt-103 - Abreu'),
  (2453, 'Ana ','400289222,666777888', 'Rua 9a, 9 - Bela Vista');
  
  ------------------------------------------------------
  DROP TABLE telefone_cliente;
  SELECT * FROM telefone_cliente;
  
  CREATE TABLE telefone_cliente (
      cod_cliente INT,
      telefone NUMERIC(11),
      FOREIGN KEY (cod_cliente) REFERENCES cliente (cod_cliente)
  );
  
  INSERT INTO telefone_cliente (cod_cliente, telefone)
  VALUES
  (2532, 998241004),
  (2532, 998877665),
  (2536, 998877665),
  (2453, 400289222),
  (2453, 666777888);
  
  -------------- organizando CLIENTE ------------------
  ALTER TABLE cliente DROP COLUMN telefone_cliente;
  
  ALTER TABLE cliente ADD COLUMN bairro VARCHAR(30);
  
  UPDATE cliente
  SET bairro = 'Formosinha'
  WHERE cod_cliente = 2532;
  
  UPDATE cliente
  SET bairro = 'Abreu'
  WHERE cod_cliente = 2536;
  
  UPDATE cliente
  SET bairro = 'Bela Vista'
  WHERE cod_cliente = 2453;
  
  UPDATE cliente
  SET endereco_cliente = 'Rua 19, 244'
  WHERE cod_cliente = 2532;
  
  UPDATE cliente
  SET endereco_cliente = 'Avenida Brocoto, 670 apt-103'
  WHERE cod_cliente = 2536;
  
  UPDATE cliente
  SET endereco_cliente = 'Rua 9a, 9'
  WHERE cod_cliente = 2453;
  ------------- RESULTA DO FINAL ---------------
  SELECT * FROM cliente;
  SELECT * FROM telefone_cliente;

Conceito 2°Fn:

Baseado no conceito de Dependencia funcional total (DFT)

Cada Atributo que nao for chave tende ser total e funcionalmente dependentes da PK

Um atributo-chave é um atributo que é uma PK ou parte de uma PKC (Composta) .

Atributos não-chaves São os demais atributos .


Para a tabela estar na 2° Fn ela deve:

- Estar na 1°Fn .

- Todos atributos não-chave são funcionalmente dependentes de * TODAS-AS-PARTES * da chave primaria.

- Não existem Dependencias Parciais (DFP).

- Caso Contrario deve se criar outra tabela com os dados.


image

(Imagem tabela não normalizada, acima!)

image

(Imagem tabela Normalizada!! acima!)

o que vc deve fazer é analisar a tabela inteira desde nome a atributos , e os atributos que não fazem parte diretamente da chave primaria inteira (se for uma composta no caso)

vc vai remover da tabela principal e criar outra tabela com chave primaria referenciando ao msm numero da chave que esta na primeira tabela.


Cod exemplo 2°Fn:

-- https://www.youtube.com/watch?v=6ER9lWOk-cY
-----------------------------Tabela não normalizada--------------------------------

SELECT * FROM tbl_pecas
DROP TABLE tbl_pecas

CREATE TABLE tbl_pecas (
    cod_peca INT,
	cod_fornec INT,
	local_fornecedor VARCHAR(50),
	qnt_estoq INT,
	tel_fornecedor NUMERIC(11),
	qtde_Caixas INT,
	primary key(cod_peca,cod_fornec)
);

INSERT INTO tbl_pecas
VALUES
(0009,121,'São Paulo',512,30302020,52),
(0023,122,'Manaus',263,60607070,27),
(0065,121,'São Paulo',196,30302020,20),
(0071,123,'Porto Alegre',89,10121314,9),
(0073,122,'Manaus',296,60607070,30)

-------------------------------- separando dfp da primeira tab pra outra tab --------------------------------------

SELECT * FROM tbl_fornecedor
DROP TABLE tbl_fornecedor

CREATE TABLE tbl_fornecedor(
    cod_fornecedor INT,
	local_fornec VARCHAR(50),
	tel_fornec NUMERIC(11),
	primary key(cod_fornecedor)
);

INSERT INTO tbl_fornecedor
VALUES
(121,'São Paulo',30302020),
(122,'Manaus',60607070),
(123,'Porto Alegre',10121314)

----------------------------------- Modelando as tabelas ------------------------------------

--adicionando fk na tabela peças no cod_fornecedor , e referenciando para a tbl_fornecedor no cod_fornecedor 
ALTER TABLE tbl_pecas
ADD CONSTRAINT fk_pecas_fornecedor
FOREIGN KEY (cod_fornec)
REFERENCES tbl_fornecedor (cod_fornecedor)

ALTER TABLE tbl_pecas DROP COLUMN local_fornecedor
ALTER TABLE tbl_pecas DROP COLUMN tel_fornecedor

-------------------------------------- Saida final -----------------------------
SELECT * FROM tbl_pecas
SELECT * FROM tbl_fornecedor

image image

Ou seja:

Resumindo vc vai criar uma tabela com atributos principais e o atributos secundario vc vai colocar na outra tabela e fazer refenciação daquelas atributos secundarios que possuem um ID ao msm aID da tabela principal.


Conceito 3°Fn

- Baseado no Conceito DFT dependencia transitiva

- Atributos não-chave na mesma tabela nao podem se relacionar com outro atributos não-chave

- Não deve haver dependencia Transitiva de um atributo não chave sobre a PK

- Se eu tenho um atributo comum que é não-chave que depende de outro atributo que é não-chave ,voce deve montar outra relação contendo esses novos atributos os dois ou mais.


Terceira forma normal:

- Deve estar na 2°Fn

- Não existe DFT

- A DFT em uma tabela é uma depencia funcional entre dois atributos não-chave


3°Fn

image


image

(Imagem tabela não normalizada, acima!)

image

(Imagem tabela Normalizada!! acima!)

Oque vc deve fazer é analisar a tabela e perceber se ela tem alguns atributos não chaves que não dependem da chave primaria

com isso vc deve criar outra relação e lá vc coloca um Pk e os atributos que dependem dos não-chave

e na relação principal vc coloca uma FK para fazer relação com a PK dos atributo não-chave


Cod ex 3°Fn:

-- https://www.youtube.com/watch?v=usA8QKvEHWw
-----------------------------Tab não normalizada------------------------
SELECT * FROM tbl_venda
DROP TABLE tbl_venda

CREATE TABLE tbl_venda (
    nota_fiscal INT,
	cod_vendedor INT,
	nome_vendendor VARCHAR(15),
	cod_produto INT,
	qtde_vendida INT,
    PRIMARY KEY (nota_fiscal)
);

INSERT INTO tbl_venda
VALUES
(15326,002,'Leila',132,10),
(15327,006,'Ana',153,12),
(15328,002,'Leila',143,11),
(15329,009,'Fábio',132,9),
(15330,007,'Renato',153,12)

---------------------------------- Criando a relação para atributos nao-chave -------------------------------------------

SELECT * FROM tbl_vendedor
DROP TABLE tbl_vendedor

CREATE TABLE tbl_vendedor(
    cod_vendedor INT,
	nome_vendedor VARCHAR(30),
	PRIMARY KEY (cod_vendedor)
);

INSERT INTO tbl_vendedor
VALUES
(002,'Leila'),
(006,'Ana'),
(007,'Renato'),
(009,'Fabio')

-- adicionando relacionamento de fk na tab principal para fazer relação com a pk da tabela secundaria
ALTER TABLE tbl_venda
ADD CONSTRAINT fk_vendedor_venda
FOREIGN KEY (cod_vendedor)
REFERENCES tbl_vendedor (cod_vendedor)
-------------------------------- Modelando -------------------------------------
ALTER TABLE tbl_venda DROP COLUMN nome_vendendor
---------------------------------RESULTADO FINAL-----------------------------------------------
SELECT * FROM tbl_venda
SELECT * FROM tbl_vendedor

image image


Girada de chave mental:

image


Ex codigo de tabela relação 1°Fn N -> N

image

SELECT * FROM pessoa
DROP TABLE pessoa

CREATE TABLE pessoa (
	id_pessoa SERIAL,
	nome VARCHAR(50),
	interesse TEXT,
	PRIMARY KEY (id_pessoa)
);

INSERT INTO pessoa(nome,interesse)
VALUES
('luan','cybesec,f800'),
('rafaela','playboy,dinheiro'),
('luan','gs 450,tracer 900')

--------------------- criar outra tab

SELECT * FROM tb_interesse
DROP TABLE tb_interesse

CREATE TABLE tb_interesse (
    id_interesse SERIAL PRIMARY KEY,
	interesse TEXT
);

INSERT INTO tb_interesse (interesse)
VALUES
('cybersec'),
('f800'),
('play boy'),
('dinheiro'),
('gs450'),
('tracer900')
-----------------------------tab relacionamento
SELECT * FROM tab_inte_pessoa
DROP TABLE tab_inte_pessoa

CREATE TABLE tab_inte_pessoa (
	id_pessoa INT,
	id_interesse INT,
	PRIMARY KEY (id_pessoa,id_interesse),
	FOREIGN KEY (id_pessoa) REFERENCES pessoa (id_pessoa),
	FOREIGN KEY (id_interesse) REFERENCES tb_interesse (id_interesse)
);

INSERT INTO tab_inte_pessoa
VALUES
(1,1),
(1,2),
(2,3),
(2,4),
(3,5),
(3,6)

ALTER TABLE pessoa DROP COLUMN interesse

About

IESGO - Professor 🎲 Sandir 🎲 Postgree SQL 🐘

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published