Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
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.
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?
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:
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:
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.
Certo, minha duvida é em um cenario que a categoria não seja predefinida, e sim criada junto com o produto. Como ficaria?
Neste cenário você cadastra a categoria pega o ID dela e joga na query que cadastra o produto, pronto.
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*/
}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?
Se você ainda não entendeu, recomendo procurar um livro sobre php e banco de dados MySQL...
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?
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
Certo, mas pelo seu conhecimento, tem como fazer com menos consultas? a lógica que eu usei esta correta?
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).
Entendi..obrigado
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.