Jump to content


Photo

Relacionamento De Tabelas


  • Faça o login para participar
4 replies to this topic

#1 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 25/05/2007, 11:24

Estou planejando aqui o meu banco de dados e estou com umas dúvidas quanto a estrutura. Eu preciso criar tabelas para produtos, mas são 3 níveis:

Categoria -> Sub-Categoria - Sub-Categoria - Produto

Até 2 níveis eu já trabalhei e consegui fazer, mas com 3 está meio complicado gerar essa relação. Com 2 níveis eu fiz assim:

Categoria:
id | nome


Sub-Categoria:
id | cat_pai | nome

Só falta a relação com a outra sub-categoria, seria uma boa alternativa fazer assim ?
id | cat_pai | sub_cat | nome

Ou não seria necessário existir o campo cat_pai no 3º nível ?
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#2 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 25/05/2007, 14:39

Usando somente uma tabela você terá N níveis.

id | id_pai | nome

Exemplo:
1 | NULL | Linguagens
2 | 1 | Procedurais
3 | 2 | C

+ Linguagens
|-+ Procedurais
| |- C

Edição feita por: Eclesiastes, 25/05/2007, 14:41.

Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#3 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 25/05/2007, 15:08

Quando você fala parece tão fácil. :lol:


Edit---->

Me passou aqui pela cabeça, quando eu for fazer o cadastro da categoria, vou usar o seu exemplo de linguagens, se eu for montar assim a página:

Nova Categoria: |input|

Pertence a Categoria: Nenhuma | Linguagens | N Categorias
// Aqui se for = a nenhuma eu cadastro como NULL, ela é categoria

Pertence a Subcategoria: Procedurais | N Sub
// Se for uma sub-categoria já existente vai estar na lista e coloca como pai

Mas e no caso como eu faço a distinção se é sub-categoria nível 2 ou nível 3 ? Se eu somente listar sub-categorias que sejam != de NULL, vai retornar tudo, ae o 2º select ficaria com Procedurais e C juntos, sendo que é pra ser separado.

Edição feita por: bimonti, 25/05/2007, 15:18.

WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#4 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 27/05/2007, 10:29

Já que você está atualmente com 3 níveis somente, você poderia descrever isso com JOINs ao invés de executar varias queries recursivamente.

Exemplo:

CREATE TABLE /*!32300 IF NOT EXISTS*/ categorias (
  id int(10) unsigned NOT NULL auto_increment,
  id_pai int(10) unsigned ,
  nome varchar(30) NOT NULL DEFAULT '' ,
  PRIMARY KEY (id),
  INDEX Subcategoria (id_pai)
);

INSERT INTO categorias VALUES("1",NULL,"Linguagens");
INSERT INTO categorias VALUES("2","1","Procedurais");
INSERT INTO categorias VALUES("3","2","C");
INSERT INTO categorias VALUES("4","1","OO");
INSERT INTO categorias VALUES("5","1","Funcionais");
INSERT INTO categorias VALUES("6","5","Haskell");

Query:
SELECT
	pai.id,
	pai.nome AS Categoria,
	sub.nome AS Subcategoria,
	sub2.nome AS Subcategoria2
FROM categorias AS pai
	LEFT JOIN categorias AS sub
	ON sub.id_pai = pai.id
	LEFT JOIN categorias AS sub2
	ON sub2.id_pai = sub.id
WHERE pai.id_pai IS NULL
ORDER BY NULL

Executando a query teremos:
mysql> SELECT
	->	 pai.id,
	->	 pai.nome AS Categoria,
	->	 sub.nome AS Subcategoria,
	->	 sub2.nome AS Subcategoria2
	-> FROM categorias AS pai
	->	 LEFT JOIN categorias AS sub
	->	 ON sub.id_pai = pai.id
	->	 LEFT JOIN categorias AS sub2
	->	 ON sub2.id_pai = sub.id
	-> WHERE pai.id_pai IS NULL
	-> ORDER BY NULL;
+----+------------+--------------+---------------+
| id | Categoria  | Subcategoria | Subcategoria2 |
+----+------------+--------------+---------------+
|  1 | Linguagens | Procedurais  | C			 |
|  1 | Linguagens | OO		   | NULL		  |
|  1 | Linguagens | Funcionais   | Haskell	   |
+----+------------+--------------+---------------+
3 rows in set (0.00 sec)

Uma técnica de busca em árvore usando SQL podem ser vistas em: http://jan.kneschke....ojects/mysql/sp

Edição feita por: Eclesiastes, 27/05/2007, 10:30.

Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#5 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 30/05/2007, 10:07

Entendi o esquema. Dei uma olhada no artigo também, to meio sem tempo de ler a fundo agora, mas já imprimi e vou levar pra ler com calma em casa tomando um cerveja nesse frio ... ^^

Esse esquema de UNION sempre foi um problema nas minhas queries .... mas esse exemplo parece que usa muito bem o recurso, acho que agora vai...


Obrigado pela atenção Eclesiastes, depois eu mando pra você os espólios dessa batalha.


Edit------------------>

Eu estive lendo melhor sobre JOIN, e no site do mysql eu li sobre subqueries. Apesar de já conhecer o recurso não utilizei em ambientes de produção.

Li um trecho onde explica como reescrever consultas com subqueries para versões antigas do MySQL, e nos exemplos é usado JOIN. O que me leva a pergunta: Subquery é uma forma melhor de utilizar JOIN ?

Já vou deixar outras:
- Provavelmente algumas operações só podem ser realizadas com um ou outro, existe essa diferença ?
- A redução de memória e uso do disco é significativa para um sistema com provavelmente 500k registros ?


Procurei um pouco no google sobre subqueries, mas por enquanto o melhor material foi na comunidade do site mysql.com mesmo. Algum material bom para consulta ?

Edição feita por: bimonti, 30/05/2007, 15:28.

WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq