Ir ao conteúdo
  • Cadastre-se

Relacionamento de tabelas no Mysql?


leonine

Posts recomendados

Pessoal, estou precisando fazer uma relação de tabelas no MYSQL.

São duas tabelas: id_localidade, id_galeria e id_comentario.

A relação é a seguinte: sempre que for acessado a página localidade (contém a id_localidade) serão exibidos os dados presentes nas duas tabelas, galeria e comentário, de acordo com a localidade escolhida no banco de dados. Se não estou enganado, preciso de ajuda numa RELAÇÃO 1 para MUITOS.

Link para o comentário
Compartilhar em outros sites

Não sei se entendi bem, mas não seria isso:

TABELA:..... LOCALIDADE

CAMPOS:..... LOCODI -- PK

INDEX:...... LOCODI

UNIQUE.KEY:. LOCODI

TABELA:..... GALERIA

CAMPOS:..... LOCODI -- FK

............ GACODI

INDEX:...... LOCODI + GACODI

UNIQUE.KEY:. LOCODI,GACODI

TABELA:..... COMENTARIO

CAMPOS:..... LOCODI -- FK

............ COCODI

INDEX:...... LOCODI + COCODI

UNIQUE.KEY:. LOCODI,COCODI

Obs/Dica: Iniciei os campos com LO, indicando que é LOcalidade, GA, indicando que é GAleria e CO indicando que é COmentário

Obs: Courier New do fórum não é Courier New ^^

Link para o comentário
Compartilhar em outros sites

Ola, eu diria que você tem que postar a estrutura de sua tabela.. só parte dela fica ruim de ajudar.

Ai está a estrutura da tabela:

Tabela LOCALIDADES:

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

CREATE TABLE `localidades` (

`id_localidade` int(3) NOT NULL auto_increment,

`localidade` tinytext NOT NULL,

`descricao` mediumtext NOT NULL,

`fotoUM` tinytext NOT NULL,

`fotoDois` tinytext NOT NULL,

`fotoTres` tinytext NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

Tabelas anuncios

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

CREATE TABLE `anuncio_localidade` (

`id_anuncio` int(11) NOT NULL,

`nome_anuncio` tinytext NOT NULL,

`descricao_anuncio` mediumtext NOT NULL,

`imagem` tinytext NOT NULL,

`tel` tinytext NOT NULL,

PRIMARY KEY (`id_anuncio`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1;

GALERIA DE FOTOS

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

CREATE TABLE ` fotos_localidades` (

`id_foto_local` int(11) NOT NULL auto_increment,

`descricao_foto` tinytext NOT NULL,

`titulo` tinytext NOT NULL,

`foto_um` tinytext NOT NULL,

`foto_dois` tinytext NOT NULL,

`foto_tres` tinytext NOT NULL,

PRIMARY KEY (`id_foto_local`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

COMENTARIOS

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

CREATE TABLE `comentario_local` (

`id_coment_local` int(11) NOT NULL auto_increment,

`nome` tinytext NOT NULL,

`data` tinytext NOT NULL,

`comentario` longtext NOT NULL,

`email` tinytext NOT NULL,

PRIMARY KEY (`id_coment_local`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

OBS.:

Todas as tabelas (comentario, galeria e anuncio) estarão relacionadas com a tabela LOCALIDADES.

Link para o comentário
Compartilhar em outros sites

  • Moderador

Olá amigo, pelo que percebi sua tabela localidades é a principal, mas nao vejo ali nenhum relacionamento. e nem há como relacionar pois terás que ter 3 campos INT na tabela localidades para receber as ID das tabelas que se relacionam com ela.

ainda na tabela localicades tens que ter 3 índices do tipo INDEX para que haja um relacionamento e todas suas tebelas devem ser do tipo INNODB, só que ali você esta usando MyISAM. o tipo MyISAM é um pouco mais rápido nas consultas mas nao suporta o controle de relacionamentos.

você ate pode abstrarir dados sem os relacionamentos.. mas é bem mais complicado.. e de cabeça agora eu nao sei te dizer como ficaria a consulta.

então minha sugestao é que você restruture sua tabela pra tipo INNODB, crie os 3 campos INT em localidades, crie 3 índices e faça o relacionamento. depois disso.. a consulta fica mais simples.. e podendo ate criar uma VIEW que fica ate mais fácil ainda de abstrair dados de varias tabelas porque ai você trabalha com os dados a nivel de tabela.. ou seja, você cria um tipo de tabelao que contem os dados abstraidos(lembrando que esta tabela é só um espelho, ou seja, nao dá pra fazer inserçoes ou deletes, para isso a manipulaçao fica na original)

Link para o comentário
Compartilhar em outros sites

Olá amigo, pelo que percebi sua tabela localidades é a principal, mas nao vejo ali nenhum relacionamento. e nem há como relacionar pois terás que ter 3 campos INT na tabela localidades para receber as ID das tabelas que se relacionam com ela.

ainda na tabela localicades tens que ter 3 índices do tipo INDEX para que haja um relacionamento e todas suas tebelas devem ser do tipo INNODB, só que ali você esta usando MyISAM. o tipo MyISAM é um pouco mais rápido nas consultas mas nao suporta o controle de relacionamentos.

você ate pode abstrarir dados sem os relacionamentos.. mas é bem mais complicado.. e de cabeça agora eu nao sei te dizer como ficaria a consulta.

então minha sugestao é que você restruture sua tabela pra tipo INNODB, crie os 3 campos INT em localidades, crie 3 índices e faça o relacionamento. depois disso.. a consulta fica mais simples.. e podendo ate criar uma VIEW que fica ate mais fácil ainda de abstrair dados de varias tabelas porque ai você trabalha com os dados a nivel de tabela.. ou seja, você cria um tipo de tabelao que contem os dados abstraidos(lembrando que esta tabela é só um espelho, ou seja, nao dá pra fazer inserçoes ou deletes, para isso a manipulaçao fica na original)

Ok! Deixa eu ver se entendi: criarei 3 campos INT (com os respectivos nomes das ID's das tabelas relacionadas?) e depois nesses mesmos campos criados, eu crio INDICES em cada um deles ou terei que criar novos campos com função de INDICE?

Link para o comentário
Compartilhar em outros sites

  • Moderador

nao, os indices sao criados justamente para poder fazer o relacionamento.

quando você ve a estrutura de sua tabela... mais a baixo você verá um campo Criar um índice em... e do lado um botao EXECUTAR

ali você adiciona o indice.. este indice deve ser do tipo INDEX o nome pode ser qualquer um... e selecionar na lista ali qual o campo INT você quer criar o indice. o tamanho você nao precisa por. e clica em executar.

faça isso com os 3 campos... depois você pode ir em designer e criar o relacionamento na seguinte ordem:

clique no icone de ligar, e clique primeiro na chave primária.. e depois na chave estrangeira(cerquinha azul) e selecionar e selecionar ON CASCADE nos dois campos..

Link para o comentário
Compartilhar em outros sites

nao, os indices sao criados justamente para poder fazer o relacionamento.

quando você ve a estrutura de sua tabela... mais a baixo você verá um campo Criar um índice em... e do lado um botao EXECUTAR

ali você adiciona o indice.. este indice deve ser do tipo INDEX o nome pode ser qualquer um... e selecionar na lista ali qual o campo INT você quer criar o indice. o tamanho você nao precisa por. e clica em executar.

faça isso com os 3 campos... depois você pode ir em designer e criar o relacionamento na seguinte ordem:

clique no icone de ligar, e clique primeiro na chave primária.. e depois na chave estrangeira(cerquinha azul) e selecionar e selecionar ON CASCADE nos dois campos..

Ok! Entendi! Agora, qual programa você está utilizando para administrar seus bancos de dados. Estou usando o phpMyAdmin.

Link para o comentário
Compartilhar em outros sites

  • Moderador

bom.. você pode fazer manualmente também:

CREATE TABLE `localidades` (

`id_localidade` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,

`localidade` tinytext NOT NULL,

`descricao` mediumtext NOT NULL,

`fotoUM` tinytext NOT NULL,

`fotoDois` tinytext NOT NULL,

`fotoTres` tinytext NOT NULL,

) ENGINE = InnoDB;

agora me pergunto.. porque você começa o auto increment em 2 nesta tabela?

Link para o comentário
Compartilhar em outros sites

Fiz como indicou, mas o sistema continua exibindo a tabela como se fosse MYLSAM ao invés de INNOB.

Veja:

phpmyadmin.jpg

Eu ainda estou fazendo testes no banco de dados (criando relações...) por isso que ainda não pensei fazer qualquer tipo de ação para otimizá-lo. Mas, vou guarda sua dica.

Link para o comentário
Compartilhar em outros sites

Veja agora se é assim que deve ser a tabela localidades:

CREATE TABLE `243542`.table1(

id_localidade INT(11) NOT NULL AUTO_INCREMENT,

anuncio INT(11) DEFAULT NULL,

comentario INT(11) DEFAULT NULL,

galeria INT(11) DEFAULT NULL,

localidade TINYTEXT CHARACTER SET ascii COLLATE ascii_general_ci DEFAULT NULL,

descricao TINYTEXT CHARACTER SET ascii COLLATE ascii_general_ci DEFAULT NULL,

fotoUM TINYTEXT DEFAULT NULL,

fotoDois TINYTEXT DEFAULT NULL,

fotoTres TINYTEXT DEFAULT NULL,

PRIMARY KEY (id_localidade),

INDEX IX_table1_anuncio (anuncio),

UNIQUE INDEX UK_table1_comentario (comentario),

UNIQUE INDEX UK_table1_galeria (galeria)

)

ENGINE = INNODB;

Link para o comentário
Compartilhar em outros sites

Pronto! Fiz o relacionamento. Agora a criação dos formulários para preenchimento das tabelas tem algum critério?

Por exemplo: Constumo fazer meus formulários através do "Insert Record do Dreamweaver CS4". Quero saber se tem que fazer alguma ligação entre as paginas que enviarão dados para as tabelas localidades, galeria, anuncio e comentários.

Abaixo o código do banco de dados:

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

-- phpMyAdmin SQL Dump

-- version 3.3.9

-- http://www.phpmyadmin.net

--

-- Servidor: localhost

-- Tempo de Geração: Jan 16, 2012 as 11:51 PM

-- Versão do Servidor: 5.5.8

-- Versão do PHP: 5.3.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--

-- Banco de Dados: `243542`

--

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

--

-- Estrutura da tabela `localidades`

--

CREATE TABLE IF NOT EXISTS `localidades` (

`id_localidade` int(11) NOT NULL AUTO_INCREMENT,

`anuncio` int(11) DEFAULT NULL,

`comentario` int(11) DEFAULT NULL,

`galeria` int(11) DEFAULT NULL,

`localidade` tinytext,

`descricao` tinytext,

`fotoUM` tinytext,

`fotoDois` tinytext,

`fotoTres` tinytext,

PRIMARY KEY (`id_localidade`),

KEY `IX_localidades_anuncio` (`anuncio`),

KEY `IX_localidades_comentario` (`comentario`),

KEY `IX_localidades_galeria` (`galeria`)

) ENGINE=InnoDB DEFAULT CHARSET=ascii AUTO_INCREMENT=1 ;

--

-- Extraindo dados da tabela `localidades`

--

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

--

-- Estrutura da tabela `anuncio_localidade`

--

CREATE TABLE IF NOT EXISTS `anuncio_localidade` (

`id_anuncio` int(11) NOT NULL AUTO_INCREMENT,

`nome_anuncio` tinytext,

`descricao_anuncio` tinytext,

`imagem` tinytext,

`tel` tinytext,

`valor` tinytext,

`id_localidade` int(11) DEFAULT NULL,

PRIMARY KEY (`id_anuncio`)

) ENGINE=InnoDB DEFAULT CHARSET=ascii AUTO_INCREMENT=1 ;

--

-- Extraindo dados da tabela `anuncio_localidade`

--

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

--

-- Estrutura da tabela `comentario_local`

--

CREATE TABLE IF NOT EXISTS `comentario_local` (

`id_coment_local` int(11) NOT NULL AUTO_INCREMENT,

`nome` tinytext,

`comentario` tinytext,

`data` tinytext,

`email` tinytext,

`id_localidade` int(11) DEFAULT NULL,

PRIMARY KEY (`id_coment_local`)

) ENGINE=InnoDB DEFAULT CHARSET=ascii AUTO_INCREMENT=1 ;

--

-- Extraindo dados da tabela `comentario_local`

--

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

--

-- Estrutura da tabela `fotos_localidades`

--

CREATE TABLE IF NOT EXISTS `fotos_localidades` (

`id_foto_local` int(11) NOT NULL AUTO_INCREMENT,

`titulo` tinytext,

`descricao_foto` tinytext,

`foto_um` tinytext,

`foto_dois` tinytext,

`foto_tres` tinytext,

`id_localidade` int(11) DEFAULT NULL,

PRIMARY KEY (`id_foto_local`)

) ENGINE=InnoDB DEFAULT CHARSET=ascii AUTO_INCREMENT=1 ;

--

-- Extraindo dados da tabela `fotos_localidades`

--

--

-- Restrições para as tabelas dumpadas

--

--

-- Restrições para a tabela `anuncio_localidade`

--

ALTER TABLE `anuncio_localidade`

ADD CONSTRAINT `FK_anuncio_localidade` FOREIGN KEY (`id_anuncio`) REFERENCES `localidades` (`id_localidade`) ON DELETE CASCADE ON UPDATE CASCADE;

--

-- Restrições para a tabela `comentario_local`

--

ALTER TABLE `comentario_local`

ADD CONSTRAINT `FK_comentario_local` FOREIGN KEY (`id_coment_local`) REFERENCES `localidades` (`id_localidade`) ON DELETE CASCADE ON UPDATE CASCADE;

--

-- Restrições para a tabela `fotos_localidades`

--

ALTER TABLE `fotos_localidades`

ADD CONSTRAINT `FK_fotos_localidades` FOREIGN KEY (`id_foto_local`) REFERENCES `localidades` (`id_localidade`) ON DELETE CASCADE ON UPDATE CASCADE;

Link para o comentário
Compartilhar em outros sites

  • Moderador

cara.. é por essas e outras que eu sempre digo.. nunca use ferramentas como dreamweaver que facilitam ou fazem coisas por você.. depois você acaba dependente da ferramenta. o que você precisa saber é a manipulaçao de querys SQL

acostume-se a sempre que fizer um banco e seus relacionamentos.. teste as consultas diretamente no banco para saber se retorna alguma coisa. se funcionar, muito bem, é só aplicar na linguagem.

sim com certeza tem criterios seria algo do tipo:

SELECT

anuncio_localidade.nome_anuncio, anuncio_localidade.descricao_anuncio,

anuncio_localidade.imagem, anuncio_localidade.tel,

anuncio_localidade.valor, comentario_local.nome,

comentario_local.comentario, comentario_local.data,

comentario_local.email, fotos_localidades.titulo,

fotos_localidades.descricao_foto, fotos_localidades.foto_um,

fotos_localidades.foto_dois, fotos_localidades.foto_tres

FROM localidades

INNER JOIN anuncio_localidade ON anuncio_localidade.id_anuncio = localidades.anuncio

INNER JOIN comentario_local ON comentario_local.id_coment_local = localidades.comentario

INNER JOIN fotos_localidades ON fotos_localidades.id_foto_local = localidades.galeria

WHERE id_localidade = $idLocalidade

(coloquei com a varialvel do php. pra testar no banco troque a variavel $idLocalidade pelo numero da ID que você quer testar)

bom eu nao entendi muito o jeito que você fez suas tabelas.. mas o id da localidade esta amais nas tabelas. nao precisa. você precisa que sua tabela localidade receba as ID das outras apenas.

outra dica importante. sempre use nome de tabelas no singular, e se for nome composto use o camel case como por exemplo: fotoLocalidade, anuncioLocalidade.. enfim..

nao te garanto que a consulta que eu fiz ali vá funcionar.. pois nao consegui importar o dump que você colocou.

Link para o comentário
Compartilhar em outros sites

Veja se o banco de dados está ok agora:

-- phpMyAdmin SQL Dump

-- version 3.4.5

-- http://www.phpmyadmin.net

--

-- Servidor: localhost

-- Tempo de Geração: 20/01/2012 às 23h13min

-- Versão do Servidor: 5.5.16

-- Versão do PHP: 5.3.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

SET time_zone = "+00:00";

--

-- Banco de Dados: `243542`

--

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

--

-- Estrutura da tabela `anuncio_localidade`

--

CREATE TABLE IF NOT EXISTS `anuncio_localidade` (

`id_anuncio` int(11) NOT NULL AUTO_INCREMENT,

`anuncio_nome` tinytext,

`anuncio_descricao` tinytext,

`anuncio_imagem` tinytext,

`anuncio_tel` tinytext,

`anuncio_valor` tinytext,

PRIMARY KEY (`id_anuncio`)

) ENGINE=InnoDB DEFAULT CHARSET=ascii AUTO_INCREMENT=1 ;

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

--

-- Estrutura da tabela `comentario_local`

--

CREATE TABLE IF NOT EXISTS `comentario_local` (

`id_coment_local` int(11) NOT NULL AUTO_INCREMENT,

`coment_nome` tinytext,

`coment_comentario` tinytext,

`coment_data` tinytext,

`coment_email` tinytext,

PRIMARY KEY (`id_coment_local`)

) ENGINE=MyISAM DEFAULT CHARSET=ascii AUTO_INCREMENT=1 ;

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

--

-- Estrutura da tabela `fotos_localidades`

--

CREATE TABLE IF NOT EXISTS `fotos_localidades` (

`id_foto_local` int(11) NOT NULL AUTO_INCREMENT,

`foto_titulo` tinytext,

`foto_descricao` tinytext,

`foto_foto` tinytext,

PRIMARY KEY (`id_foto_local`)

) ENGINE=InnoDB DEFAULT CHARSET=ascii AUTO_INCREMENT=3 ;

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

--

-- Estrutura da tabela `localidades`

--

CREATE TABLE IF NOT EXISTS `localidades` (

`id_localidade` int(11) NOT NULL AUTO_INCREMENT,

`id_anuncio` int(11) NOT NULL,

`id_foto_local` int(11) NOT NULL,

`id_coment_local` int(11) NOT NULL,

`localidade` tinytext,

`descricao` tinytext,

`fotoUM` tinytext,

`fotoDois` tinytext,

`fotoTres` tinytext,

PRIMARY KEY (`id_localidade`),

KEY `index_foto_local` (`id_foto_local`),

KEY `index_anuncio` (`id_anuncio`),

KEY `index_comentario` (`id_coment_local`)

) ENGINE=InnoDB DEFAULT CHARSET=ascii AUTO_INCREMENT=6 ;

--

-- Restrições para as tabelas dumpadas

--

--

-- Restrições para a tabela `localidades`

--

ALTER TABLE `localidades`

ADD CONSTRAINT `localidades_ibfk_6` FOREIGN KEY (`id_coment_local`) REFERENCES `localidades` (`id_localidade`),

ADD CONSTRAINT `localidades_ibfk_4` FOREIGN KEY (`id_anuncio`) REFERENCES `localidades` (`id_localidade`),

ADD CONSTRAINT `localidades_ibfk_5` FOREIGN KEY (`id_foto_local`) REFERENCES `localidades` (`id_localidade`);

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...
  • Moderador
A aba design do phpmyadmin não aparece se você estiver usando o wamp, pelo que testei ela assim como outras só aparece se você estiver usando o xampp.

Não, isso não é uma questão de programa, mas sim questão de versão do phpmyadmin. todos os phpmyadmin com versão mais antiga possuem o modo designer.

POr exemplo eu uso a versão 5.3 do easyphp e tem o modo designer no phpmyadmin. Já na versão mais recente não possui..

Link para o comentário
Compartilhar em outros sites

Não, isso não é uma questão de programa, mas sim questão de versão do phpmyadmin. todos os phpmyadmin com versão mais antiga possuem o modo designer.

POr exemplo eu uso a versão 5.3 do easyphp e tem o modo designer no phpmyadmin. Já na versão mais recente não possui..

Posso estar muito errado, mas tenho que discordar. Bem, eu baixei as ultimas versões que encontrei dos dois programas diretamente do site do desenvolvedor. o wamp 2.2 e o xampp 1.8.1. Como você pode ver nas imagens a versão do phpmyadmin presente no xampp é até mais atual do que a presente no wamp e mesmo assim conta com a função design. Porém, outro ponto é que o wamp, ou melhor, o phpmyadmin que acompanha o wamp pode fazer as mesmas relações mesmo sem ter o modo design. Para isso, basta clicar em estrutura da tabela e na opção que aparece em baixo "ver relações", em portugues. Ao clicar nessa opção aparecem todos campos que pemintem a criação de relações, assim como a inserção de parametros. As 2 primeiras imagens são do wamp e as 2 ultimas do xampp. Obs: eu não sei se é a versão do phpmyadmin que acompanha, ou se é algum outro programa que vem no pacote que permite utilizar o modo design.

post-956121-13884964817679_thumb.jpg

post-956121-13884964818211_thumb.jpg

post-956121-13884964818647_thumb.jpg

post-956121-13884964818996_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!