Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Tabela SQLite com lista

Pessoal boa tarde. Poderia me ajudar? Estou com o objetivo de montar um banco de dados SQLite para um serviço webservice. Consigo montar as tabelas com objetos estáticos, porém não consigo quando o objeto da classe é dinâmico. Vide exemplo.

Classe - Usuario

private String id;

private String nome;

private String email;

Classe - Grupo

private String id;

private String nome;

private List < Usuario> usuarioList;

◘ Nesta última classe a lista de usuários é dinâmica, ou seja tem um número variável de usuários.

◘ A dúvida é se construiria uma tabela única para grupo com linhas variáveis ou juntar tabelas diferentes - Grupo + Usuário para montar o objeto grupo. Como desconheço os mecanismos para tal, preciso de ajuda.

◘ Poderia construir uma tabela de usuarios com o id do grupo para poder consultá-la quando desejar e montar List < Usuario> . Dai seriam tabela única de usuários para cada grupo. Ou seja, as tabelas seriam dinâmicas e não as linhas das tabelas. Acha que daria certo?

Outra dica seria foreign key. Qual seria a melhor solução? Teria uma aula aqui na Alura sobre esta questão?

6 respostas

Não junte as tabelas grupo e usuário, elas são conceitualmente entidades diferentes e se você fizer isso, vai acabar causando redundância no seu banco.

Tabela única de usuários para cada grupo também não faz sentido.

Faça uma coluna grupo na tabela usuários que aponta para os registros de grupo.

No momento da consulta faça um JOIN entre as tabelas.

Um bom curso para aprender as melhores práticas de modelagem é: Curso Modelagem de Banco de Dados Relacional: Índices e Normalização https://cursos.alura.com.br/course/modelagem-banco-relacional

Mas um usuário pode participar de vários grupos. Então adicionaria na tabela usuario colunas dinamicamente a medida que fosse montando grupos e depois o JOIN para montar a tabela grupo? Estas colunas também seria eliminadas dinamicamente, se, nos grupos, os usuários fossem retirados?

Então seriam dois métodos com cursores? - Um para montar as listas dos usuários com os índices de colunas dos grupo e outro para montar os outros atributos da classe grupo. Seria assim?

Já tô agradecendo pela atenção.

Então, mas do jeito que você colocou a relação ficou como 1 para N, e não N para N.

Nesse caso, então se um usuário pode ter vários grupos isso torna a relação N para N (vários para vários).

O melhor a se fazer é criar uma tabela auxiliar, que chamamos de tabela relacional. Essa tabela contém obrigatoriamente as duas chaves estrangeiras e opcionalmente uma chave primária. (geralmente eu coloco a chave primária).

Então ficaria assim: Tabelas usuarios, grupos e usuario_grupo.

Exemplo de select:

SELECT * 
FROM usuarios u
LEFT JOIN usuario_grupo ug ON ug.usuario = u.chave
LEFT JOIN grupos g ON ug.grupo = g.chave

Caro Robson agradeço pela atenção. Pelo que vejo você entendeu minha dúvida. Mas ainda não entendi a sintaxe que me passou. Para compreender esta relação N para N ( projeto que estou trabalhando é um WhatsApp clone). Em que aula posso aprender este exemplo que me passou? Minha bagagem é SQLite com tabelas estáticas.

solução!

Eu ainda não olhei, mas parece que o curso de MySQL tem bastante coisa legal. Como SQLite e MySQL, ambos usam SQL, a solução seria bem parecida.

O curso de JPA também tem umas facilidades que te ajudaria.

Oi Robson, se você puder especificar o curso gostaria de fazê-lo. Ok?

Outra dúvida: como vou trabalhar o cursor para construir meus objetos da classe grupo com este mecanismo? Já existe este esclarecimento na aula? Desculpe a insistência, pois, por enquanto, não conheço pessoas na área. Daí minha soluções estão sendo virtuais.