Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Thiago Moraes

Relação de tabelas

Recommended Posts

Boa parte dos sistemas que conheço trabalha da seguinte forma: uma tabela com o nome do produto e outra com o nome da categoria...Pq não incluir o nome da categoria na própria tabela do produto? Qual a melhor opção?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você deve evitar ter dados repetidos no BD, logo, se você tiver mais de um produto na mesma categoria você teria ela repetida, com um tabela apenas para as categorias você registra essa informação apenas uma vez e então apenas referencia o id dela na tabela dos produtos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imagina que você precise trocar o nome de uma categoria, como ia ser? Você ia sair trocando cada linha que tivesse? É mais por uma questão de manutenção, e como o ESerra disse, não deve se repetir dados no BD, já que isso o sobrecarrega.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi...então na hora de cadastrar um produto, eu teria q fazer uma consulta para inserir as informações na tabela produtos, outra na tabela categorias, e como eu faria pra relacionar as duas pelo ID, supondo que a categoria foi gravada junto com o produto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

As categorias são sempre pré-definidas, certo? Então você cria uma tabela com as categorias e suas respectivas ID's, como na imagem abaixo:

 

ytL8CBW.png

 

Tem até a coluna cor (coloquei isso pq estou sem criatividade kkk). Mas você vai entender depois. Ok, dá pra ver que cada categoria tem ma ID única que a gente vai usar na tabela produtos:

 

aW6qA9O.png

 

Essa é a tabela produtos, sempre em que você ou outra pessoa for registrar o produto, é só ver o id categoria, e quando for chamar o produto e quiser mostrar o nome ou outra informação da categoria, é só fazer uma consulta com o categoria_id. E serve para outras coisas também, e criei um site em que cada matéria (escolar, tipo: matemática, português etc) tinha uma cor, imagina para mudar apenas uma cor a trabalheira que ia ser se não tivesse relacionado as tabelas. Espero que tenha sido bem didático.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, minha duvida é em um cenario que a categoria não seja predefinida, e sim criada junto com o produto. Como ficaria?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Neste cenário você cadastra a categoria pega o ID dela e joga na query que cadastra o produto, pronto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exatamente. imagina que você tenha a função de registrar o produto, no começo dessa função passe para uma variável o valor que você vai receber de outra função, no caso a de registrar a categoria, e esse valor vai ser o id da categoria. Exemplo:

/*Aqui você já tem a array do produto com todas as informações dentro, inclusive o $produto['categoria_nome'] e $produto['categoria_cor'], Falta o id*/ 
function registra_produto($conexao, $produto){
    $produto['categoria_id'] = registra_categoria($conexao, $protudo);
    $sql = "INSERT INTO produtos (nome, categoria_id) VALUES ('{$produto['nome']}', $produto['categoria_id'])";
    /*... Aqui o resto da função que você executa a query e tals*/
}
//Registra a categoria
function registra_produto($conexao, $produto){
    $sql = "INSERT INTO categorias (nome, cor) VALUES ('{$produto['categoria_nome']}', '{$produto['categoria_cor']}')";
    mysqli_query($conexao, $sql) or die(mysqli_error());
    //Essa função retorna o último id inserido na sessão
    return mysqli_insert_id($conexao);
}

Entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok...Não sei se a minha lógica ficou correta, mas seria tipo:

 

 

seleciono nome e id das categorias existentes;

 

verfico se a que esta sendo salva já existe;

 

(se ela não existe) { salvo o nome e id da categoria, seleciono novamente as categorias e salvo produto com o id da nova categoria salva};

 

(se ela já existe) { salvo o produto com o id da categoria existente };

 

Foram 5 consultas ao banco nessa operação..minha dúvida é, tem como fazer menos consultas? Ou é isso mesmo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A questão de granularização da base de dados tem haver com a Normalização de Dados. São basicamente regras/diretrizes a fim de otimizar o uso de um banco de dados relacional.

 

A questão de existir ou não, você pode usar a integridade da base de dados, como unique. Se der erro, trate como uma exceção.

 

Pode ver um pouco aqui:

http://forum.imasters.com.br/topic/523524-multiplos-insertsrollback-com-pdo/?p=2083720

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, mas pelo seu conhecimento, tem como fazer com menos consultas? a lógica que eu usei esta correta?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, primeiro você pega o nome da categoria e verifica no BD (consulta 1), se retornar zero faz o cadastro da categoria (consulta 2), o próprio SGBD vai te devolver o ID para usar (http://php.net/manual/pt_BR/pdo.lastinsertid.php, então não precisa fazer outra consulta), insere o registro do produto com o id obtido anteriormente (consulta 3).

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.