Ir para conteúdo

POWERED BY:

Arquivado

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

Anderson Narciso

Opcionais

Recommended Posts

Galera, estou com um pouco de falta de idéias. Estou montando um projeto pessoal sobre veículos, porém cheguei na parte do cadastro de opcionais, decidi utilizar campos de checkbox, onde eu marco quais opcionais aquele veículo possui, só que não sei qual melhor forma de cadastrar isso no banco de dados, uma forma que eu possa puxar em uma single do veículo daquele jeito padçao como abaixo, com uma imagenzinha do lado e tals...

 

[sim] Air-Bag

[sim] Ar Condicionado

[sim] Vidro Elétrico

[Não] Teto Solar

 

Não sei de que forma poderia cadastrar todos os opcionais dentro de um campo da tabela para depois fazer o loop e ver qual tem ou nao.. Alguém já criou algo assim, poderia me dar uma dica?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tranquilo e você? É isso só que to sem ideia de como cadastrar porque são varios dentro de um campo só na tabela, teria que ser algo que eu possa recuperar na single do veiculo depois entende?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah cara, isso é sussa d+!

 

O negócio é o seguinte. Você deve criar duas tabelas: `veiculos` e `pecas`... Daí, você vai fazer um insert múltiplo pra cadastrar as peças e depois, é só exibir na single.

 

se precisar de ajuda para isso pd pedir ae sem bronca viu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bah cara ai entra aquele conceito de chave estrangeira né? Sei nada dessas paradas rsrs.. Mas porque cadastrar em outra tabela se vai acabar caindo no mesmo formato de cadastro, todos dentro de um único campo.. Ou não?

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que se você colocar tudo no mesmo campo vai dar um pouco de trabalho de tratar, você pode definir que seus campos são vazios mas com todas as opções que um carro pode ter a que não for preenchida é null logo o que for null você pode ignorar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem duas opções:

 

1. Criar um campo só com zeros e uns representando sim e não.

 

O problema dessa abordagem são vários:

 

1.1. Você tem de manter um "padrão interno" de definição de offsets, por exemplo, a primeira posição é reservada a vidro elétrico, a segunda, rodas de liga-leve e etc.

 

Com tantos opcionais, isso vira um caos.

 

1.2. Fazer um UPDATE direto pelo banco é, pelo menos pra mim, muito difícil pois tem de combinar várias funções para você acertar o offset correto.

 

1.2.1. Você pode, claro, fazer via PHP, consultando, listando, explodindo, alterando, unindo e atualizando.

 

Deu pra perceber quanta performance você gasta à toa?

 

2. Criar uma terceira tabela para armazenar os relacionamentos. Eu ACHO que essa tabela dispensa chave-primária, mas não tenho certeza. À parte disso, um campo para se armazenar o ID do veículo e outro para o ID do opcional.

 

Na hora de consultar você une as informações da tabela de Veículos com os dados dos opcionais, aqui fazendo uma JOIN para a tabela dos opcionais mesmo a fim de obter os nomes deles.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que por cima eu entendi mais ou menos a ideia de todos, mas como nunca mexi com duas tabelas ao mesmo tempo interligando, vou apanhar um pouco hehe. Na parte do cadastro me veio na cabeça o cadastro via array que seria a forma mais rapida né? Faço um implode, separo os dados por virgula e cadastra. A tabela opcionais no caso teria

 

opcionaisId

veiculoId

 

e para baixo todos os opcionais existente que um veículo pode ter, pq sabesmo que tem motos, caminhões e outros e o que um tem o outro não tem, então para não ter o trabalho de fazer opcionais Moto, opcionais caminhão faço uma geral... É certo meu pensamento?

 

Creio que vou precisar também trabalhar com arrays nos checkbox que sera outra experiência nova

Compartilhar este post


Link para o post
Compartilhar em outros sites

péssima ideia trabalhar com delimitadores como o Bruno disse é muito complicado pois é muito trabalho para saber o local de tal informação.

 

mesmo que for para adicionar um número 0 é melhor usar um campo separado.

 

trabalhar com FK é muito simples é simplesmente o ID da tabela relacionada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Banco de dados é uma coisa bem difícil pra mim, mas mesmo assim sempre que posso responder alguma coisa sobre o assunto eu faço para estimular meu próprio aprendizado.

 

Podem haver algumas discrepâncias, mas seria mais ou menos assim:

 

Estrutura

 

--
-- DbNinja v3.0.5 for MySQL
--
-- Dump date: 2012-10-04 12:47:42 (UTC)
-- Server version: 5.5.16
-- Database: imasters
--

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*!40101 SET NAMES utf8 */;

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

CREATE DATABASE `imasters` /*!40100 DEFAULT CHARACTER SET utf16 */;

USE `imasters`;

--
-- Structure for table: vehicles
--

CREATE TABLE `vehicles` (
 `vid` int(9) NOT NULL AUTO_INCREMENT,
 `name` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`vid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--
-- Structure for table: vehiclesAccessories
--

CREATE TABLE `vehiclesaccessories` (
 `aid` int(9) NOT NULL AUTO_INCREMENT,
 `name` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`aid`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--
-- Structure for table: vehiclesAccessoriesRelations
--

CREATE TABLE `vehiclesaccessoriesrelations` (
 `vid` int(9) NOT NULL,
 `aid` int(9) NOT NULL,
 KEY `vid` (`vid`),
 KEY `aid` (`aid`),
 CONSTRAINT `vid` FOREIGN KEY (`vid`) REFERENCES `vehicles` (`vid`) ON DELETE CASCADE,
 CONSTRAINT `aid` FOREIGN KEY (`aid`) REFERENCES `vehiclesaccessories` (`aid`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--
-- Data for table: vehicles
--

ALTER TABLE `vehicles` DISABLE KEYS;
INSERT INTO `vehicles` 
(`vid`, `name`) 
VALUES 
(1, 'Vectra'),
(2, 'Fusion'),
(3, 'S10');
ALTER TABLE `vehicles` ENABLE KEYS;


--
-- Data for table: vehiclesAccessories
--

ALTER TABLE `vehiclesAccessories` DISABLE KEYS;
INSERT INTO `vehiclesAccessories` 
(`aid`, `name`) 
VALUES 
(1, 'Roda Aro 18'),
(2, 'Central Multimídia'),
(3, 'Spoiler Lateral'),
(4, 'Vidro Elétrico'),
(5, 'Trava Elétrica'),
(6, 'Ar-Condicionado'),
(7, 'Air-Bag Lateral'),
(8, 'Protetor Frontal'),
(9, 'Santantônio');
ALTER TABLE `vehiclesAccessories` ENABLE KEYS;


--
-- Data for table: vehiclesAccessoriesRelations
--

ALTER TABLE `vehiclesAccessoriesRelations` DISABLE KEYS;
INSERT INTO `vehiclesAccessoriesRelations` 
(`vid`, `aid`) 
VALUES 
(1, 1),
(1, 2),
(1, 3),
(1, 4),
(1, 5),
(1, 6),
(2, 1),
(2, 2),
(2, 3),
(2, 4),
(2, 5),
(2, 6),
(3, 4),
(3, 5),
(3, 8),
(3, 9);
ALTER TABLE `vehiclesAccessoriesRelations` ENABLE KEYS;



/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

 

E a query:

 

SELECT v.name AS vehicle, a.name AS accessories
 FROM `imasters`.`vehiclesAccessoriesRelations` r
   LEFT JOIN `imasters`.`vehicles` v ON( r.vid = v.vid )
     LEFT JOIN `imasters`.`vehiclesAccessories` a ON( r.aid = a.aid )
       ORDER BY( v.name ) ASC

Saída:

 

+---------+--------------------+
| vehicle | accessories        |
+---------+--------------------+
| Fusion  | Roda Aro 18        |
| Fusion  | Central Multimídia |
| Fusion  | Spoiler Lateral    |
| Fusion  | Vidro Elétrico     |
| Fusion  | Trava Elétrica     |
| Fusion  | Ar-Condicionado    |
| S10     | Vidro Elétrico     |
| S10     | Trava Elétrica     |
| S10     | Protetor Frontal   |
| S10     | Santantônio        |
| Vectra  | Roda Aro 18        |
| Vectra  | Central Multimídia |
| Vectra  | Spoiler Lateral    |
| Vectra  | Vidro Elétrico     |
| Vectra  | Trava Elétrica     |
| Vectra  | Ar-Condicionado    |
+---------+--------------------+
16 rows in set (0.02 sec)

Uma vez passado pelo PHP, durante a listagem das informações, vehicle será o índice da matriz associativa multidimensional e accessories o índice de outro array, este numérico, dentro do primeiro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só um comentário sobre um comentário do @Bruno Augusto, pois também é uma dúvida minha.

Eu ACHO que essa tabela dispensa chave-primária, mas não tenho certeza.

Siga um padrão, normalmente definido por sua empresa/grupo. O SQL em si utiliza chaves compostas, mas a padronização com o grupo de trabalho é importante. Quando define-se um projeto, devem ser realizadas essas padronizações.

 

Como já trabalhei com grupos distintos de desenvolvedores, sempre fomos bem explícitos quanto as padronizações, nada de "Faça como você aprendeu" ou "Faça como achar melhor". Nessas definições, a padronização de N:M sempre foi colocada em pauta e, dependendo do grupo de trabalho, foi escolhido de uma forma ou outra.

 

Pessoalmente, pra mim tanto faz. Mas, por experiência com outros desenvolvedores é muito mais fácil utilizar a ideia que cada tabela possua sua chave primária simples, e relações N:M serão tratadas com CONSTRAINT UNIQUE, é mais fácil que chaves compostas. Mas isso somente em primeira instância, depois acostumam-se.

 

As vezes, chaves compostas geram encadeamento de tabelas e suas chaves primárias, se não mitigado, vira uma zona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu estou evoluindo minhas habilidades em banco de dados a passos de formiga, o que você disse afeta em alguma coisa o que u postei antes?

 

Imagino que sim unicamente pelo fato da consideração a respeito da chave-primária, mas senti que não foi somente "adiciona uma chave lá e pronto acabou".

 

Certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu estou evoluindo minhas habilidades em banco de dados a passos de formiga, o que você disse afeta em alguma coisa o que u postei antes?

Não, não afeta em nada. Você optou por não utilizar uma chave primária em uma tabela N:M. Apenas mantenha esse mesmo padrão, ao menos nesse projeto.

 

A única coisa é que, a tabela pode dispensar uma chave primária, mas isso depende única e exclusivamente da padronização proposta.

 

 

Imagino que sim unicamente pelo fato da consideração a respeito da chave-primária, mas senti que não foi somente "adiciona uma chave lá e pronto acabou".

 

Certo?

Não entendi.

 

Nesse caso em específico, é mais fácil trabalhar com chave composta. Isso porque nenhuma tabela depende da tabela com chave composta.

 

Mas acontece casos de tabelas dependerem de outras tabelas com chaves composta, o que gera uma aglomeração de PKs em uma única tabela.

 

Já vi ERs sendo totalmente reformuladas por essas dependências, onde inserindo uma PK em cada tabela facilitaria a vida de todos.

 

Conversando com um DBA, ele me falou que esse conceito de substituição de chaves compostas por uma chave primária se chama Surrogate Key. Nesse link vai ter uma explicação melhor da que eu dei aqui :yay:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi pessoal, desculpe a demora para o retorno, é que fiquei maquinando esses dois dias em cima da explicação do Bruno Augusto, da forma que ele fez. É que assim, eu tenho um array

 

  $f['nomedoveiculo'] = htmlspecialchars(mysql_real_escape_string($_POST['nomedoveiculo']));
  $f['tipo'] = htmlspecialchars(mysql_real_escape_string($_POST['tipo']));
  $f['fabricante'] = htmlspecialchars(mysql_real_escape_string($_POST['fabricante']));
  $f['modelo'] = htmlspecialchars(mysql_real_escape_string($_POST['modelo'])); 
  $f['ano'] = htmlspecialchars(mysql_real_escape_string($_POST['ano']));
  $f['anomodelo'] = htmlspecialchars(mysql_real_escape_string($_POST['anomodelo']));
  $f['portas'] = htmlspecialchars(mysql_real_escape_string($_POST['porta']));
  $f['cor'] = htmlspecialchars(mysql_real_escape_string($_POST['cor']));
  $f['km'] = htmlspecialchars(mysql_real_escape_string($_POST['km']));
  $f['placa'] = htmlspecialchars(mysql_real_escape_string($_POST['placa']));
  $f['combustivel'] = htmlspecialchars(mysql_real_escape_string($_POST['combustivel']));
  $f['preco'] = htmlspecialchars(mysql_real_escape_string($_POST['preco']));
  $f['adicionais'] = htmlspecialchars($_POST['adicionais']);
  $f['date'] = htmlspecialchars(mysql_real_escape_string($_POST['data']));
  $f['tags'] = htmlspecialchars(mysql_real_escape_string($_POST['tags']));
  $f['categoria'] = htmlspecialchars(mysql_real_escape_string($_POST['categoria']));
  $f['status'] = ($_POST[sendForm] == 'Salvar' ? '0' : '1');
  $f['autor'] = $_SESSION['autUser']['id'];
  $f['tipo'] = 'post';

  if(in_array('',$f)){

   echo 'Erro, campos em branco</span>';

   }else{

      cadastro('veiculos',$f);
   }

 

O cadastro está sendo feito por uma pequena função que cadastra via array, ela da um implode, separa os campos com aspas e vírgulas ('valor1','valor2'). Até ai tudo bem, porém veio essa parte dos opcionais que são checkbox, acho que ai lascou né, porque como o Bruno e outros colegas indicaram teria que ser cadastrado em outra tabela fazendo a referência, mas como fazer isso ao mesmo tempo que eu cadastro o array dos outros campos? Não sei se é possível cadastrar dois arrays ao mesmo tempo em tabelas diferentes..

 

Eu poderia transformar os checkbox e array name="opcionais[]" certo? Algo como:

 

<label><input type="checkbox" name="opcionais[]" id="airbag" value="Air Bag"/>Air Bag</label><br />
<label><input type="checkbox" name="opcionais[]" id="arcondicionado" value="Ar Condicionado"/>Ar Condicionado</label><br />
<label><input type="checkbox" name="opcionais[]" id="ardigital" value="Ar Cond. Digital"/>Ar Cond. Digital</label><br />
<label><input type="checkbox" name="opcionais[]" id="cambioauto" value="Cambio Automático"/>Cambio Automático</label><br />
<label><input type="checkbox" name="opcionais[]" id="cdplayer" value="CD Player"/>CD Player</label><br />
<label><input type="checkbox" name="opcionais[]" id="desembtraseiro" value="Desembaçador Traseiro"/>Desembaçador Traseiro</label><br />

Porém se $f['opcionais'] = $_POST['opcionais'] eu teria um array dentro de outro array, complicaria mais ainda, esto meio perdido pois não tenho tenta experiência assim com php ou banco de dados, ta freud...

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.