Ir para conteúdo

Arquivado

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

JoaoGusmao

Várias categorias para o mesmo artigo

Recommended Posts

Entrei só pra falar com absoluta certeza que a forma do William Bruno é a correta.

É, inclusive, a utilizada pelo Wordpress.

Não há outra forma mais correta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, digamos que eu tenha o artigo: "Teste de artigo" e as categorias "Futebol", "Notícia" e "Entretenimento".

Simulando que preciso que o artigo "Teste de Artigo" apareça nas categorias Futebol e Entretenimento, como eu deveria fazer de acordo com o método apontado pelo William?

Compartilhar este post


Link para o post
Compartilhar em outros sites

TABELA ARTIGO

id - nome
1  - Teste de artigo

 

TABELA CATEGORIA

id - nome
1  - Futebol
2  - Notícia
3  - Entretenimento

 

TABELA ARTIGO_CATEGORIA

id - artigo - categoria
1 -    1   - 1
2 -    1   - 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Considerando o que @Evandro Oliveira falou, ficaria assim:

 

$sql = "SELECT * FROM (artigos INNER JOIN artigo_categoria ON categoria) WHERE artigos.id=artigo_categoria.artigo && categoria.id=artigo_categoria.id";

 

Acho que é isso!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fera eu tava querendo fazer o q você me falou, mas acho q o implode ou serialize é o mais viável no meu caso pense comigo, se fosse só as categorias estava certo, mas no meu caso o cliente tem q escolheria suas categorias, suas cidades de atuação, e suas e seus ramos de atividades, sendo q uma pesquisa eu tenho q fazer uma seleção com uma dessas opções ou todas no caso de um filtro, ai ferraria tudo pq como q eu ai fazer para filtrar uma tabela com base de outra tabela, q tem qta filtrada com base de outra?

com cordo com cv q com mais tabelas seria melhor mas no meu caso só na categoria.. xD

acha q tem alguma solução melhor no meu caso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fera eu tava querendo fazer o q você me falou, mas acho q o implode ou serialize é o mais viável no meu caso pense comigo, se fosse só as categorias estava certo, mas no meu caso o cliente tem q escolheria suas categorias, suas cidades de atuação, e suas e seus ramos de atividades

 

dúvida já respondida:

 

Note que você está enviando "mais de uma informação" para um campo.

 

Estude sobre formas normais

 

Saiba que esse seu cenário é mais comum e recorrente do que você imagina.

 

Estude sobre JOIN e todas as suas formas variantes como LEFT JOIN, RIGHT JOIN e UNION

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vocês são muitos "formais" e "teóricos"! :P

 

Um banco de dados relacional extremamente normalizado não é o "mais correto". Outra coisa, em qual capítulo do livro esta escrito que a quarta, terceira, segunda ou primeira forma normal é mais correta?

 

Não estou dizendo que esta ou aquela modelagem esta errada, mas daí a dizer que esta "mais correta", também não é verdadeiro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exatamente!

 

vou tentar aqui.. qualquer problema eu posto.. xD.

gostei dessa opção xD.

t+ abraços

 

Vocês são muitos "formais" e "teóricos"! :P

 

Um banco de dados relacional extremamente normalizado não é o "mais correto". Outra coisa, em qual capítulo do livro esta escrito que a quarta, terceira, segunda ou primeira forma normal é mais correta?

 

Não estou dizendo que esta ou aquela modelagem esta errada, mas daí a dizer que esta "mais correta", também não é verdadeiro.

 

Não intendi você ta defendendo o método de array em uma tabela? é isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não há um mais correto.

Assumir qualquer coisa como verdade absoluta é burrice.

 

Hoje em dia esses são os padrões para BD's relacionais que dão certo.

 

Quanto às FN, elas são interdependentes. Não se aplica a FN2 sem ter aplicado a primeira, consequentemente não se tem a FN3 sem a FN2.

 

São apenas recomendações de gente que já teve o mesmo problema que estamos tendo hoje, documentaram e aconselham que esta seja a melhor alternativa.

 

Gente procurando melhor alternativa sempre tem. Uma saída são bancos não relacionais, trazidos à tona pelos NoSQL. Depois do hype, entendeu-se que cada caso é um caso e que os bancos relacionais ainda têm suas aplicações onde levam vantagem, mantendo assim as FN em uso, também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Apenas comentando que não há "mais correto".

A solução do array pode ser tão boa, ou até melhor (não estou dizendo "mais correto" ou "mais errado"), que a solução normalizada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

por mais q eu tenha gostado da solução do JOIN creio q em busca aparecera conteúdos duplicados

fiz um exemplo simples de como quero q funciona nesse exemplo construí uma tabela com array veja

 

Estado
id  estado
1 -   SP
2 -   MG

Regiao
id   estado      Regiao
1  -    1  -  ribeiraopreto
2  -    1  -  campinas
3  -    2  -  beloHorizonte
4  -    2  -  piumhi

cidades|
id   Eestado  Regiao  Cidade
1  -    1   -   1   - Cravinhos
2  -    1   -   1   - RibeiraoPreto
3  -    1   -   2   - Campinas
4  -    1   -   2   - CampoLimpo
5  -    2   -   3   - BeloHorizonte
6  -    2   -   3   - Passos
7  -    2   -   4   - Piumhi
8  -    2   -   4   - VargemBonita

Ramos de atividades
id  Ramo
1 - Casamento
2 - Bodas
3 - Debutantes

 

 

digamos q abaixto temos os clientes da categoria a.

 

cliente	|Estado|Regiao|cidadesAT|cidade|Ramos de atividades
-----------------------------------------------------------
1	|1,2   |1,2,3 |1,2,3,5,6|1     |1
2	|1     |1     |1,2      |2     |3
3	|2     |3,4   |5,6,7,8  |6     |1,2,3
4	|1,2   |3,1   |5,1      |1     |1
5	|2     |3     |5        |5     |1,3
6	|2     |4     |7,8      |7     |1,2
7	|1,2   |2,3   |3,6      |3     |2
8	|1     |2     |3,4      |3     |1,2,3
9	|1,2   |2,4   |3,7      |7     |2,3
10	|1     |1     |1        |1     |3

se eu buscar por categoria a aparecera eles!

 

porem quero fazer um filtro quando buscar pela categoria A e filtrar por estado 1

aparecerá só cliente

1,2,4,7,8,9,10

 

se eu bucar por categoria A e regiao 1

aparecera só cliente 1,2,4,10

 

se eu buscar por categoria A cidade 3

aparecera primeiro cliente 7,8 depois os clientes de cidadesAT - o de cidade 1,9

logo apreceria seguintes clientes 7,8,1,9

 

se eu buscar categoria A e ramo 1

apareceria os clientes da gategoria A com ramo 1

 

e e eu buscar categoria A ramo 1 com algo dons filtro cidatos acima, exemplo o ultimo filtro q tem os clientes 7,8,1,9

aparecera só os clientes 1,8

 

Apenas comentando que não há "mais correto".

A solução do array pode ser tão boa, ou até melhor (não estou dizendo "mais correto" ou "mais errado"), que a solução normalizada.

eu estou achando q no meu caso é a melhor opção.. =S

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, me desculpem por citar "correto".

 

Eu consigo resolver esses problemas com uma modelagem normalizada.

Se fizer da maneira adequada, eu só vejo ganhos.

 

Façam como quiser.

 

 

@Michel Kuguio, onde você quer chegar ? tá com alguma dúvida ?

Vou afirmar uma coisa: você não vai perder dados, se fizer normalizado. Se você mandar buscar tais coisas, com tais filtros, a modelagem vai te responder exatamente oq você pediu.

 

 

Entretanto, usando o array, quero ver o malabarismo que vcs teriam que fazer, para me dizer uma simples coisa:

-> todos os produtos da categoria "Doce".

Compartilhar este post


Link para o post
Compartilhar em outros sites

não estou questionando é q eu não devo ter entendido direito o funcionamento, eu quero fazer q nem você falou..

só q eu preciso entender certinho para fazer certo xD

 

tipo quando pesquisei por JOIN eu estudei por esse site olha

http://www.devmedia.com.br/articles/viewcomp.asp?comp=1071

e pelo no exemplo moas uma tabela q depois de usar o JOIN retorna

cliente UM valor 1000

cliente UM valor 2000

cliente UM valor 3000

Logo pensei na busca aparecerá 3 vezes o mesmo cliente

e é o q vai acontecer não é?

Compartilhar este post


Link para o post
Compartilhar em outros sites

não. Não é isso que vai acontecer.

 

 

Existem várias formas de fazer o JOIN. Existe LEFT JOIN, RIGHT JOIN... existe um mundo ai fora, muito maior do que oq você conhece atualmente.

 

Não vai aparecer triplicado se você não quiser.

Mas dependendo doque você pedir, pode ser q trazer triplicado seja mais simples de manipular.

 

 

Porém também existem outras funções no SGDB que te permitem 'condensar' essas informações, e te retornar uma única linha, se é isso que você quer.

 

 

Acho que a palavra certa aqui é flexibilidade. Me desculpe @Prog, mas me senti um pouco ofendido com o 'vcs são muito teóricos'. Cara, eu tenho experiência com programação, e desenvolvimento de sites. Não sou apenas teórico. Sou prático e teórico. Estudo para fazer direito.

 

Chamo de 'correto', pq para mim, existem muitas formas de se programar, porém aquele que melhor atende, que não te trás dores de cabeça, não te limita, te dá flexibilidade, segue normas bem estruturadas, documentadas, e o #@?$%~ a quatro, é sim o correto.

Na boa, eu não estudei tanto, e não li tantos livros, e nem respondi tantos tópicos, vi tantos códigos, não fiz tantos sistemas, tantas coisas, para simplesmente ler calado tão coisa.

Além do 'livro', ou quantos capítulos você acha que ele possa ter, estou dizendo com a minha experiência em programação, por tudo oque vi, fiz e vivi, que assim dá certo, e eu considero melhor.

 

 

 

Quer fazer de outro jeito ? faz.

Mas na boa, não tumultue, não cause atritos, e não atrapalhe o cara que tem dúvidas.

Seria muito mais produtivo se você argumentasse, e defendesse oque você diz, do que simplesmente virar e reclamar do adjetivo que foi usado. Estamos disperdiçando energia a toa.

 

 

 

 

A minha contribuição para esse tópico é: eu considero pessoalmente que modelar usando as Formas Normais, é a melhor solução, e num contexto de php + mysql(bd relacional), é sim a forma correta.

 

 

 

 

Encerro por aqui a minha opinião.

 

porem quero fazer um filtro quando buscar pela categoria A e filtrar por estado 1

aparecerá só cliente

1,2,4,7,8,9,10

Ok.

 

SELECT id FROM `cliente` LEFT JOIN cliente_estado ON cliente.id = cliente_estado.id_cliente WHERE cliente_estado.id_estado = 1

 

se eu bucar por categoria A e regiao 1

aparecera só cliente 1,2,4,10

Ok.

SELECT id FROM `cliente` LEFT JOIN cliente_regiao ON cliente.id = cliente_regiao.id_cliente WHERE cliente_regiao.id_regiao = 1 ORDER BY `cliente`.`id` ASC

 

 

se eu buscar por categoria A cidade 3

 

aparecera primeiro cliente 7,8 depois os clientes de cidadesAT - o de cidade 1,9

logo apreceria seguintes clientes 7,8,1,9

Me explique oque significa 'cidadeAT'.

 

 

se eu buscar categoria A e ramo 1

apareceria os clientes da gategoria A com ramo 1

Ok.

SELECT id FROM `cliente` LEFT JOIN cliente_ramo ON cliente.id = cliente_ramo.id_cliente WHERE cliente_ramo.id_ramo = 1 ORDER BY `cliente`.`id` ASC

 

 

DUMP

 

-- phpMyAdmin SQL Dump
-- version 3.1.2
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tempo de Geração: Fev 03, 2012 as 01:12 AM
-- Versão do Servidor: 5.1.38
-- Versão do PHP: 5.3.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Banco de Dados: `projeto1`
--

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

--
-- Estrutura da tabela `cidade`
--

CREATE TABLE IF NOT EXISTS `cidade` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `id_estado` int(11) NOT NULL,
 `id_regiao` int(11) NOT NULL,
 `cidade` varchar(30) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

--
-- Extraindo dados da tabela `cidade`
--

INSERT INTO `cidade` (`id`, `id_estado`, `id_regiao`, `cidade`) VALUES
(1, 1, 1, 'Cravinhos'),
(2, 1, 1, 'Ribeirão Preto'),
(3, 1, 2, 'Campinas'),
(4, 1, 2, 'Campo Limpo'),
(5, 2, 3, 'Belo Horizonte'),
(6, 2, 3, 'Passos'),
(7, 2, 4, 'Piumhi'),
(8, 2, 4, 'Vargem Bonita');

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

--
-- Estrutura da tabela `cliente`
--

CREATE TABLE IF NOT EXISTS `cliente` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `nome` varchar(40) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

--
-- Extraindo dados da tabela `cliente`
--

INSERT INTO `cliente` (`id`, `nome`) VALUES
(1, 'A'),
(2, 'B'),
(3, 'C'),
(4, 'D'),
(5, 'E'),
(6, 'F'),
(7, 'G'),
(8, 'H'),
(9, 'I'),
(10, 'J');

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

--
-- Estrutura da tabela `cliente_cidade`
--

CREATE TABLE IF NOT EXISTS `cliente_cidade` (
 `id_cliente` int(11) NOT NULL,
 `id_cidade` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `cliente_cidade`
--

INSERT INTO `cliente_cidade` (`id_cliente`, `id_cidade`) VALUES
(1, 1),
(1, 2),
(1, 3),
(1, 5),
(1, 6),
(2, 1),
(2, 2),
(3, 5),
(3, 6),
(3, 7),
(3, 8),
(4, 5),
(4, 1),
(5, 1),
(6, 7),
(6, 8),
(7, 3),
(7, 6),
(8, 3),
(8, 4),
(9, 3),
(9, 7),
(10, 1);

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

--
-- Estrutura da tabela `cliente_estado`
--

CREATE TABLE IF NOT EXISTS `cliente_estado` (
 `id_cliente` int(11) NOT NULL,
 `id_estado` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `cliente_estado`
--

INSERT INTO `cliente_estado` (`id_cliente`, `id_estado`) VALUES
(1, 1),
(1, 2),
(2, 1),
(3, 2),
(4, 1),
(4, 2),
(5, 2),
(6, 2),
(7, 1),
(7, 2),
(8, 1),
(10, 1),
(9, 1),
(9, 2);

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

--
-- Estrutura da tabela `cliente_ramo`
--

CREATE TABLE IF NOT EXISTS `cliente_ramo` (
 `id_cliente` int(11) NOT NULL,
 `id_ramo` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `cliente_ramo`
--

INSERT INTO `cliente_ramo` (`id_cliente`, `id_ramo`) VALUES
(1, 1),
(2, 3),
(3, 1),
(3, 2),
(3, 3),
(4, 1),
(5, 1),
(5, 3),
(6, 1),
(6, 2),
(7, 2),
(8, 1),
(8, 2),
(8, 3),
(9, 2),
(9, 3),
(10, 3);

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

--
-- Estrutura da tabela `cliente_regiao`
--

CREATE TABLE IF NOT EXISTS `cliente_regiao` (
 `id_cliente` int(11) NOT NULL,
 `id_regiao` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `cliente_regiao`
--

INSERT INTO `cliente_regiao` (`id_cliente`, `id_regiao`) VALUES
(1, 1),
(1, 2),
(1, 3),
(2, 1),
(3, 3),
(3, 4),
(4, 3),
(4, 1),
(5, 3),
(6, 4),
(7, 2),
(7, 3),
(8, 2),
(9, 4),
(9, 2),
(10, 1);

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

--
-- Estrutura da tabela `estado`
--

CREATE TABLE IF NOT EXISTS `estado` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `estado` varchar(2) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Extraindo dados da tabela `estado`
--

INSERT INTO `estado` (`id`, `estado`) VALUES
(1, 'SP'),
(2, 'MG');

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

--
-- Estrutura da tabela `ramo_atividade`
--

CREATE TABLE IF NOT EXISTS `ramo_atividade` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `ramo` varchar(20) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Extraindo dados da tabela `ramo_atividade`
--

INSERT INTO `ramo_atividade` (`id`, `ramo`) VALUES
(1, 'Casamento'),
(2, 'Bodas'),
(4, 'Debutantes');

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

--
-- Estrutura da tabela `regiao`
--

CREATE TABLE IF NOT EXISTS `regiao` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `id_estado` int(11) NOT NULL,
 `regiao` varchar(20) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Extraindo dados da tabela `regiao`
--

INSERT INTO `regiao` (`id`, `id_estado`, `regiao`) VALUES
(1, 1, 'Ribeirão Preto'),
(2, 1, 'Campinas'),
(3, 2, 'Piumhi'),
(4, 2, 'Belo Horizonte');

 

 

ps: 1h13 da manhã.. me perdoe se esqueci alguma coisa, ou errei algum dado.

Algumas coisas básicas ainda precisam ser corrigidas nesse DUMP que colei aqui.

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.