Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Criação de tabelas e select


hitech

Pergunta

Tenho as seguintes tabelas:

portais:

id_portal

nome_portal

canais_portais:

id_portal

id_canal

nome_canal

url_canal

usuarios

id_usuario

login

senha

canais_usuarios

id_usuario

id_canal

Na tabela canais_usuarios, um usuário poderá ter vários canais, assim como um canal poderá ter vários usuários. Desta forma, uma chave primária não funcionaria, pois não permite duplicidades.

Seria o caso de criar um campo auto_increment como chave primária para esta tabela? Este campo não seria usado, serviria apenas como índice.

Como faço o select para exibir o nome do canal e o nome do portal para determinado usuário que está logado, pois tenho o login na tabela usuarios, o id_canal na tabela canais_usuarios, o nome_canal na tabela canais_portais e o nome do portal na tabela portais, ou seja, uma informação em cada tabela.

Seria o caso de juntar tabelas, portais e canais_portais seria apenas uma tabela?

Obrigado,

Hitech

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Oi, 'hitech'!

Vamos analisar seu pedido.

Primeiro, gostaria que você observasse o anexo que enviei. É este o modelo de dadso descrito por você. Tem certeza disso?

Segundo: Em sua afirmação

Na tabela canais_usuarios, um usuário poderá ter vários canais, assim como um canal poderá ter vários usuários. Desta forma, uma chave primária não funcionaria, pois não permite duplicidades.

O correto é criar um índice para cada campo da tabela canais_usuarios eles trabalharão como foreign keys.

Se você está usando a engine InnoDB e a versão 5.x no servidor do banco, então aconselho a colocar constraints para controlar melhor os dados desta tabela

Terceiro: : Em sua pergunta

Seria o caso de criar um campo auto_increment como chave primária para esta tabela? Este campo não seria usado, serviria apenas como índice.

É besteira criar um campo sem serventia. Índices devem ser utilizados apenas quando estritamente necessários.

Quarto: O número do canal não se repete? Ou pode haver o mesmo número de canal para um portal diferente?

Se para a segunda pergunta a afirmativa é "sim", então o modelo está errado e haverá problemas em achar o usuário para o canal.

Quinto: Em sua pergunta:

Como faço o select para exibir o nome do canal e o nome do portal para determinado usuário que está logado, pois tenho o login na tabela usuarios, o id_canal na tabela canais_usuarios, o nome_canal na tabela canais_portais e o nome do portal na tabela portais, ou seja, uma informação em cada tabela.

A utilização de Joins é a chave para esta pergunta. Supondo que você esteja certo na criação de seu modelo, então a pesquisa seria assim:

SELECT c.nome_canal, p.nome_portal
FROM canais_portais c 
INNER JOIN portais p ON c.id_portal = p.id_portal
INNER JOIN canais_usuarios cnu ON c.id_canal = cnu.id_canal
INNER JOIN usuarios u ON cnu.id_usuario = u.id_usuario
WHERE u.login = xxxxxxx

Nota: para melhor performance e para evitar TABLE SCAN (varredura em todas as tabelas) você deve criar os seguintes índices (alguns já são primary key outros trabalharão como foreign key)

c.id_portal (foreign key na tabela canais_portais)

p.id_portal (já é primary key na tabela portais)

c.id_canal (já é primary key na tabela canais_portais)

cnu.id_canal (foreign key na tabela canais_usuarios)

cnu.id_usuario (foreign key na tabela canais_usuarios)

u.id_usuario (já é primary key na tabela usuario)

u.login (unique key - haverá somente um usuário para cada login)

Sexto: Em sua pergunta

Seria o caso de juntar tabelas, portais e canais_portais seria apenas uma tabela?

Você já estudou normalização de bancos de dados?

XXXXXXXXXXXX.pdf

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Denis,

Agradeço a atenção.

Sei o que quero, mas ainda não sei exatamente como fazer, pois é meu primeiro contato com banco de dados.

Estou desenvolvendo uma página de RSS, com alguns itens já pré-definidos. Desta forma, o usuário ao se logar, será exibida uma lista de portais com seus respectivos feeds e em outro espaço, uma lista com seus feeds.

Portal A

Feed 1

Feed 2

Feed 3

Portal B

Feed 1

Feed 2

Pensei então em duas possibilidades:

Opção 1:

Portal - Feed

A - 1

A - 2

A - 3

B - 4

B - 5

Opção 2:

Portal - Feed

A - 1

A - 2

A - 3

B - 1

B - 2

Considero a opção 2 melhor, mas como ficaria a chave primária, pois teria vários itens iguais no portal e também no Feed?

Pode haver tabela sem chave primária ou seria o caso de uma chave composta?

Continuando...

Opção 1:

Usuário - Feed

1 - 1

1 - 3

1 - 5

2 - 2

2 - 3

2 - 4

2 - 5

Opção 2:

Usuário - Feed

1 - A1

1 - A2

1 - B2

2 - A1

2 - A3

2 - B1

2 - B2

Novamente a segunda opção é melhor, mas como unir o id do portal com o id do feed?

Obrigado,

Hitech

Link para o comentário
Compartilhar em outros sites

  • 0

Funcionou, fiz da seguinte forma:

Na tabela canais_portais coloquei os seguintes campos:

id_portal

id_canal

nome_canal

url_canal

Defini id_portal e id_canal como chave primária. Desta forma, a cada mudança no id-portal, a contagem do id_canal reinicia.

Criei os índices de acordo com sua orientação e o select assim:

SELECT u.login, p.nome_portal, c.nome_canal

FROM canais_portais c

INNER JOIN portais p ON c.id_portal = p.id_portal

INNER JOIN canais_usuarios cnu ON c.id_canal = cnu.id_canal

AND c.id_portal = cnu.id_portal

INNER JOIN usuarios u ON cnu.id_usuario = u.id_usuario

WHERE u.login = 'hitech'

Muito obrigado Denis,

Hitech

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...