Jump to content
Fórum Script Brasil
  • 0

foreignkeys


Rafael-Moran

Question

Bom pessoal , to fazendo um site para a papelaria da minha irmã e gostaria de saber se a lógica do meu banco de dados está correto

Imagem do banco de dados

Bom pessoal a minha intenção é a seguinte.

Tenho as seguintes tabelas

Produtos Carrinho

Escolar Festa Escritório

A tabela produtos vai ter chave estrangeira da tabela Escolar, Festa e Escritório ( Bom até onde eu sei, dessa maneira quando eu chamar a tabela " Produtos" na minha pagina

consigo mostrar os produtos das tabelas que são estrangeiras ( vou poder mostrar os produtos da tabela Escolar, Festa e Escritório )

Assim pretendo criar a chave estrangeira da tabela Produtos na tabela carrinho, para ter as informações das outras tabelas ( festa, escritório e escola )

Acredito que a imagem facilitará a compreensão.

obrigado a todos que tentarem me ajuda.

Link to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 0

Opa, beleza ?!

Não seria viável criar a tabela PRODUTO desta forma, pois ela teria 3 chaves estrangeiras indicando um só produto, mas cada uma dessas chaves é uma produto.

Por exemplo, você teria um registro do tipo:

id_produto: 1

escritorio_id: 1

festa_id: 1

escolar_id: 1

E isso não seria correto, pois a maioria dos produtos será OU escritorio OU festa OU escolar.

Assim, ao invés de criar uma tabela para cada tipo de produto será melhor criar um campo TIPO na tabela PRODUTO, uma vez que em todas se tem as mesmas colunas (nome, descricao e valor). Ficaria assim:

id_produto: 1

Nome: Cadeira

Valor: 150

Tipo: ESCRITORIO

A tabela CARRINHO acredito que seja a responsável por guardar a compra, então nela deve guardar o ID do cliente com os ID's dos produtos, então poderia ficar assim:

cliente_id: 1

produto_id: 1

quantidade: 2

valor: 300

cliente_id: 1

produto_id: 2

quantidade: 10

valor: 500

É isso, espero ter ajudado. XD

E qualquer coisa, estamos por aqui.

Link to comment
Share on other sites

  • 0
Opa, beleza ?!

Não seria viável criar a tabela PRODUTO desta forma, pois ela teria 3 chaves estrangeiras indicando um só produto, mas cada uma dessas chaves é uma produto.

Por exemplo, você teria um registro do tipo:

...

Concordo com o Vitor.

Porém, melhorando um pouco sua modelagem, você poderia ter a tabela PRODUTO e a tabela CATEGORIA

A tabela PRODUTO teria um ID da tabela CATEGORIA mostrando um relacionamento de uma categoria existente e muitos produtos. Este ID em PRODUTO seria a chave estrangeira para CATEGORIA.

Finalizando, seu modelo teria 3 tabelas. PRODUTO, CATEGORIA e CARRINHO.

Link to comment
Share on other sites

  • 0

Bom pessoal valeu pela ajuda.

Pior que eu não me dei de conta disso.

minha intenção era tentar facilitar na hora de chamar os produtos no php.

bom...

mas ai, eu me encontro com outro problema.

como vou separa os produtos ?

( eu pensei em algo no tipo, a ideia de vocês é deixar apenas a tabela Produtos CERTO ?. bom nesse caso eu crio uma coluna na tabela

dentro da tabela produtos

tabela=> Produto

Id_produto: 1

descrição: É um bom produto

valor: 100.00

tipo: festa

bom com essa tabela criada desse jeito, eu consigo criar no php uma pesquisa simples para mostrar só aquele tipo de produto.

espero que eu tenha sido claro.

dessa forma a tabela carrinho, vai ter a chave estrangeira ( produto ) ???

bom espero que isso solucione o meu problema.

Novamete agradeço a todos...

Link to comment
Share on other sites

  • 0
dessa forma a tabela carrinho, vai ter a chave estrangeira ( produto ) ???

...

Isso, carrinho terá id_produto, id_cliente, é uma n:m de produto com cliente, dá para saber tudo que o cliente comprou.. Mais interessante seria se o nome desta tabela fosse 'compra', pois o nome 'carrinho' pode confundir com os produtos que esteja, de fato, no carrinho do cliente, mas ele ainda não tenha finalizado a compra.

Qualquer coisa.. estamos por aqui..

Link to comment
Share on other sites

  • 0
Bom. fica assim então ?

Assim !

Muito obrigado pela ajuda.

Pode remover a tabela produto_has_carrinho e ligar produto a carrinho. Carrinho será a tabela intermediária entre clientes e produto. Ou seja a tabela que fará a ligação muitos patra muitos entre cliente e produto.

Link to comment
Share on other sites

  • 0

Bom é que quando ligo a tabela no modo, muitos para muitos, ele cria aquela tabela intermediária

estou utilizando o Workbench para criar o banco.

então nesse caso esta certo a minha ligação e o meu banco ???

bom e quando estou gerando o SQL me apresenta o seguinte erro .

Erro

consulta SQL:

-- -----------------------------------------------------

-- Table `mydb`.`carrinho`

-- -----------------------------------------------------

CREATE TABLE IF NOT EXISTS `mydb`.`carrinho` (

`id_carrinho` INT NOT NULL AUTO_INCREMENT ,

`quantidade` INT NOT NULL ,

`sessao` TEXT NOT NULL ,

`cliente_id_cliente` INT NOT NULL ,

PRIMARY KEY ( `id_carrinho` ) ,

INDEX `fk_carrinho_cliente1` ( `cliente_id_cliente` ASC ) ,

INDEX `fk_produto_id_produto` ( ) ,

CONSTRAINT `fk_carrinho_cliente1` FOREIGN KEY ( `cliente_id_cliente` ) REFERENCES `mydb`.`cliente` (

`id_cliente`

) ON DELETE NO ACTION ON UPDATE NO ACTION

) ENGINE = InnoDB DEFAULT CHARACTER SET = latin1 COLLATE = latin1_swedish_ci;

Mensagens do MySQL :

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ,

CONSTRAINT `fk_carrinho_cliente1`

FOREIGN KEY (`cliente_id_clien' at line 15

Edited by Rafael-Moran
Link to comment
Share on other sites

  • 0
Bom é que quando ligo a tabela no modo, muitos para muitos, ele cria aquela tabela intermediária

estou utilizando o Workbench para criar o banco.

então nesse caso esta certo a minha ligação e o meu banco ???

Não. A ligação entre Produto e carrinho é um para muitos e a ligação entre cliente e carrinho, também é de um para muitos

Carrinho já é a ligação muitos para muitos entre produtos e clientes.

bom e quando estou gerando o SQL me apresenta o seguinte erro .

INDEX `fk_produto_id_produto` ( ) ,

Mensagens do MySQL :

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ,

CONSTRAINT `fk_carrinho_cliente1`

FOREIGN KEY (`cliente_id_clien' at line 15

Você não pode criar indice sem campos associados. Informe o campo entre parenteses.

Link to comment
Share on other sites

  • 0

bom fiz o que tu me falou..

passei o SQL para o banco e foi direitinho, mas ao inserir alguma coisa nas tabelas

ADM,

Produto,

apresenta o mesmo problema

#1452 - Cannot add or update a child row: a foreign key constraint fails (`mydb`.`produto`, CONSTRAINT `fk_produto_carrinho1` FOREIGN KEY (`carrinho_id_carrinho`) REFERENCES `carrinho` (`id_carrinho`) ON DELETE NO ACTION ON UPDATE NO ACTION)

bom o SQL é esse.

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;

SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';



CREATE SCHEMA IF NOT EXISTS `tua-papelaria`;

USE `tua-papelaria`;



-- -----------------------------------------------------

-- Table `tua-papelaria`.`funcionario`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `tua-papelaria`.`funcionario` (

  `id_funcionario` INT NOT NULL AUTO_INCREMENT ,

  `login_func` VARCHAR(45) NOT NULL ,

  `senha_func` VARCHAR(45) NOT NULL ,

  PRIMARY KEY (`id_funcionario`) )

ENGINE = InnoDB

DEFAULT CHARACTER SET = latin1

COLLATE = latin1_swedish_ci;





-- -----------------------------------------------------

-- Table `tua-papelaria`.`cliente`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `tua-papelaria`.`cliente` (

  `id_cliente` INT NOT NULL AUTO_INCREMENT ,

  `nome_cli` INT NOT NULL ,

  `telefone_cli` INT NOT NULL ,

  `endereco_cli` VARCHAR(200) NOT NULL ,

  `bairro_cli` VARCHAR(200) NOT NULL ,

  `numero_cli` VARCHAR(45) NOT NULL ,

  `complemento_cli` VARCHAR(45) NOT NULL ,

  `cep_cli` INT NOT NULL ,

  `email_cli` VARCHAR(200) NOT NULL ,

  `senha_cli` VARCHAR(45) NOT NULL ,

  PRIMARY KEY (`id_cliente`) )

ENGINE = InnoDB

DEFAULT CHARACTER SET = latin1

COLLATE = latin1_swedish_ci;





-- -----------------------------------------------------

-- Table `tua-papelaria`.`carrinho`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `tua-papelaria`.`carrinho` (

  `id_carrinho` INT NOT NULL AUTO_INCREMENT ,

  `quantidade` INT NOT NULL ,

  `sessao` TEXT NOT NULL ,

  `cliente_id_cliente` INT NOT NULL ,

  PRIMARY KEY (`id_carrinho`) ,

  INDEX `fk_carrinho_cliente1` (`cliente_id_cliente` ASC) ,

  CONSTRAINT `fk_carrinho_cliente1`

    FOREIGN KEY (`cliente_id_cliente` )

    REFERENCES `tua-papelaria`.`cliente` (`id_cliente` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB

DEFAULT CHARACTER SET = latin1

COLLATE = latin1_swedish_ci;





-- -----------------------------------------------------

-- Table `tua-papelaria`.`produto`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `tua-papelaria`.`produto` (

  `id_produto` INT NOT NULL AUTO_INCREMENT ,

  `produto` VARCHAR(200) NOT NULL ,

  `descricao` VARCHAR(500) NOT NULL ,

  `valor` VARCHAR(100) NOT NULL ,

  `especie` VARCHAR(45) NOT NULL ,

  `img` BLOB NOT NULL ,

  `carrinho_id_carrinho` INT NOT NULL ,

  PRIMARY KEY (`id_produto`) ,

  INDEX `fk_produto_carrinho1` (`carrinho_id_carrinho` ASC) ,

  CONSTRAINT `fk_produto_carrinho1`

    FOREIGN KEY (`carrinho_id_carrinho` )

    REFERENCES `tua-papelaria`.`carrinho` (`id_carrinho` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB;





-- -----------------------------------------------------

-- Table `tua-papelaria`.`adm`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `tua-papelaria`.`adm` (

  `id_adm` INT NOT NULL AUTO_INCREMENT ,

  `login_adm` VARCHAR(45) NOT NULL ,

  `senha_adm` VARCHAR(45) NOT NULL ,

  `funcionario_id_funcionario` INT NOT NULL ,

  `produto_id_produto` INT NOT NULL ,

  PRIMARY KEY (`id_adm`) ,

  INDEX `fk_adm_funcionario` (`funcionario_id_funcionario` ASC) ,

  INDEX `fk_adm_produto1` (`produto_id_produto` ASC) ,

  CONSTRAINT `fk_adm_funcionario`

    FOREIGN KEY (`funcionario_id_funcionario` )

    REFERENCES `tua-papelaria`.`funcionario` (`id_funcionario` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION,

  CONSTRAINT `fk_adm_produto1`

    FOREIGN KEY (`produto_id_produto` )

    REFERENCES `tua-papelaria`.`produto` (`id_produto` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB

DEFAULT CHARACTER SET = latin1

COLLATE = latin1_swedish_ci;





-- -----------------------------------------------------

-- Table `tua-papelaria`.`sac`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `tua-papelaria`.`sac` (

  `id_sac` INT NOT NULL AUTO_INCREMENT ,

  `nome_sac` VARCHAR(45) NOT NULL ,

  `email_sac` VARCHAR(200) NOT NULL ,

  `telefone_sac` VARCHAR(45) NOT NULL ,

  `comentario_sac` VARCHAR(500) NOT NULL ,

  PRIMARY KEY (`id_sac`) )

ENGINE = InnoDB

DEFAULT CHARACTER SET = latin1

COLLATE = latin1_swedish_ci;







SET SQL_MODE=@OLD_SQL_MODE;

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;

SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Link to comment
Share on other sites

  • 0
bom fiz o que tu me falou..

passei o SQL para o banco e foi direitinho, mas ao inserir alguma coisa nas tabelas

ADM,

Produto,

apresenta o mesmo problema

#1452 - Cannot add or update a child row: a foreign key constraint fails (`mydb`.`produto`, CONSTRAINT `fk_produto_carrinho1` FOREIGN KEY (`carrinho_id_carrinho`) REFERENCES `carrinho` (`id_carrinho`) ON DELETE NO ACTION ON UPDATE NO ACTION)

bom o SQL é esse.

...

Você errou na ordem. Não é carrinho que se liga em produto. é produto que se liga em carrinho.

O script correto é esse:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `tua-papelaria`;
USE `tua-papelaria`;

-- -----------------------------------------------------
-- Table `tua-papelaria`.`funcionario`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `tua-papelaria`.`funcionario` (
`id_funcionario` INT NOT NULL AUTO_INCREMENT ,
`login_func` VARCHAR(45) NOT NULL ,
`senha_func` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`id_funcionario`) 
)ENGINE = INNODB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;

-- -----------------------------------------------------
-- Table `tua-papelaria`.`cliente`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `tua-papelaria`.`cliente` (
`id_cliente` INT NOT NULL AUTO_INCREMENT ,
`nome_cli` INT NOT NULL ,
`telefone_cli` INT NOT NULL ,
`endereco_cli` VARCHAR(200) NOT NULL ,
`bairro_cli` VARCHAR(200) NOT NULL ,
`numero_cli` VARCHAR(45) NOT NULL ,
`complemento_cli` VARCHAR(45) NOT NULL ,
`cep_cli` INT NOT NULL ,
`email_cli` VARCHAR(200) NOT NULL ,
`senha_cli` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`id_cliente`) 
)ENGINE = INNODB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;

-- -----------------------------------------------------
-- Table `tua-papelaria`.`carrinho`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `tua-papelaria`.`carrinho` (
`id_carrinho` INT NOT NULL AUTO_INCREMENT ,
`quantidade` INT NOT NULL ,
`sessao` TEXT NOT NULL ,
`cliente_id_cliente` INT NOT NULL DEFAULT 0,
`produto_id_produto` INT NOT NULL DEFAULT 0,
PRIMARY KEY (`id_carrinho`) ,
INDEX `fk_carrinho_cliente1` (`cliente_id_cliente` ASC) ,
CONSTRAINT `fk_carrinho_cliente1`
FOREIGN KEY (`cliente_id_cliente` )
REFERENCES `tua-papelaria`.`cliente` (`id_cliente` )
ON DELETE NO ACTION ON UPDATE NO ACTION,
INDEX `fk_carrinho_produto1` (`produto_id_produto` ASC) ,
CONSTRAINT `fk_carrinho_produto1`
FOREIGN KEY (`produto_id_produto` )
REFERENCES `tua-papelaria`.`produto` (`id_produto` )
ON DELETE NO ACTION ON UPDATE NO ACTION
)ENGINE = INNODB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;

-- -----------------------------------------------------
-- Table `tua-papelaria`.`produto`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `tua-papelaria`.`produto` (
`id_produto` INT NOT NULL AUTO_INCREMENT ,
`produto` VARCHAR(200) NOT NULL ,
`descricao` VARCHAR(500) NOT NULL ,
`valor` VARCHAR(100) NOT NULL ,
`especie` VARCHAR(45) NOT NULL ,
`img` BLOB NOT NULL ,
PRIMARY KEY (`id_produto`) 
)ENGINE = INNODB;

-- -----------------------------------------------------
-- Table `tua-papelaria`.`adm`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `tua-papelaria`.`adm` (
`id_adm` INT NOT NULL AUTO_INCREMENT ,
`login_adm` VARCHAR(45) NOT NULL ,
`senha_adm` VARCHAR(45) NOT NULL ,
`funcionario_id_funcionario` INT NOT NULL ,
`produto_id_produto` INT NOT NULL ,
PRIMARY KEY (`id_adm`) ,
INDEX `fk_adm_funcionario` (`funcionario_id_funcionario` ASC) ,
INDEX `fk_adm_produto1` (`produto_id_produto` ASC) ,
CONSTRAINT `fk_adm_funcionario`
FOREIGN KEY (`funcionario_id_funcionario` )
REFERENCES `tua-papelaria`.`funcionario` (`id_funcionario` )
ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_adm_produto1`
FOREIGN KEY (`produto_id_produto` )
REFERENCES `tua-papelaria`.`produto` (`id_produto` )
ON DELETE NO ACTION ON UPDATE NO ACTION
)ENGINE = INNODB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;

-- -----------------------------------------------------
-- Table `tua-papelaria`.`sac`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `tua-papelaria`.`sac` (
`id_sac` INT NOT NULL AUTO_INCREMENT ,
`nome_sac` VARCHAR(45) NOT NULL ,
`email_sac` VARCHAR(200) NOT NULL ,
`telefone_sac` VARCHAR(45) NOT NULL ,
`comentario_sac` VARCHAR(500) NOT NULL ,
PRIMARY KEY (`id_sac`) 
)ENGINE = INNODB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Link to comment
Share on other sites

  • 0
Bom...

show de bola, resolveu o problema, na tabela produto, mas continuo com o mesmo problema na tabela

ADM

e

Carrinho

=/

Oi Rafael,

Por favor alise o modelo em anexo. As linhas em azul foram as ligações que corrigimos entre cliente x carrinho x produto.

A linha em vermelho e a em preto foram definidas por você em seu script original.

Poderia, por favor, responder as perguntas abaixo?

1 - O que faz a tabela adm e por que produto e funcionário se ligam a ela?

2 - Para que serve a tabela sac e como esta tabela se relaciona com seu sistema?

3 - Que relação há entre carrinho e ADM?

papelaria.pdf

Link to comment
Share on other sites

  • 0

Boa tarde a todos, desculpe a demora na resposta, eu estava viajando e lá eu não tinha tinha nenhum tipo de sinal de internet.

Bom meus caros amigos, estou analisando melhor o banco e resolvi mudar algumas coisas.. bom vou tentar repassar o que eu pensei.

Respondendo as perguntas

1- a tabela ADM, vai gravar as informações do ADM para realizar o login,

O funcionário se liga a ela porque a conta do funcionário será criada pelo ADM e a tabela produto o ADM cadastrará produtos.

2- a tabela sac, receberá os comentários e reclamações dos clientes

3- bom não pensei em nenhuma ligação entre a tabela ADM e CARRINHO, mas tiveres alguma sugestão.

Deixo aberto qualquer modificação que vocês julguem necessárias, em baixo esta a imagem do banco que eu modifiquei.

Bom primeiramente eu estou fazendo um site de uma papelaria onde o usuario poderá realizar compras.

bom tabelas que eu pensei ( Podem me corrigir a vontade caso seja necessário.)

vou precisar ter as seguintes tabelas.

ADM | FUNCIONARIO | PRODUTO | CARRINHO | USUARIO | SAC

Minha intenção para cada tabela é a seguinte.

ADM -> ( onde vai armazenar os dados do administrador total do site, o adm poderá... cadastrar funcionários, produtos, verificar o carrinho de compras dos usuários e verificar as informações do sac )

FUNCIONARIO ->( ficara salvo o cadastro dos funcionário, os funcionários vão cadastrar produtos, verificar o carrinho de compras dos usuários )

PRODUTO -> ( salvara as informações dos produtos cadastrados pelos funcionários )

carrinho -> ( salvara a sessão do usuário e as informações de compra, )

USUARIO -> ( onde ficaram salvas as informações do usuário, o usuário poderá realizar compras e verificar o seu carrinho,)

Estou pensando em deixar assim qualquer problema que alguém note.

favor fique a vontade de modificar.

Edited by Rafael-Moran
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...