-relação nao possui atributos multivalorados ou relações aninhadas (uma tabela dentro de outra tabela)
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.
-- 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;
- Todos atributos não-chave são funcionalmente dependentes de * TODAS-AS-PARTES * da chave primaria.
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.
-- 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
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.
- 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.
Oque vc deve fazer é analisar a tabela e perceber se ela tem alguns atributos não chaves que não dependem da chave primaria
-- 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
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