Join SQL - Codeigniter + SQL Server
Boa tarde!
Tenho uma tabela chamada (alertas), e dentro dessa tabela tenho uma coluna chamada (id_produto).
Na coluna id_produto pode ser guardado no mesmo registro diversos id''''s, que são separados por virgula.
Estou com problemas para poder selecionar o alerta e me trazer junto desses alertas, todos os produtos que contém esses id''''s guardados dentro da coluna id_produto.
A maior questão está sendo esse monte de id guardado na mesma coluna, estou utilizando SQL Server, junto do Codeigniter que é um framework em PHP.
OBS: A coluna id_produto é chave primaria na tabela produtos.
Tenho uma tabela chamada (alertas), e dentro dessa tabela tenho uma coluna chamada (id_produto).
Na coluna id_produto pode ser guardado no mesmo registro diversos id''''s, que são separados por virgula.
Estou com problemas para poder selecionar o alerta e me trazer junto desses alertas, todos os produtos que contém esses id''''s guardados dentro da coluna id_produto.
A maior questão está sendo esse monte de id guardado na mesma coluna, estou utilizando SQL Server, junto do Codeigniter que é um framework em PHP.
OBS: A coluna id_produto é chave primaria na tabela produtos.
Felipe Butslof
Curtidas 0
Respostas
Alec Candia
05/02/2020
Oi Felipe,
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
GOSTEI 0
Felipe Butslof
05/02/2020
Oi Felipe,
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
Boa noite!
É isso mesmo, os índices estão sendo separados por vírgula, infelizmente o projeto está sendo refeito apenas a parte PHP.
O projeto já é bem antigo, e optaram por manter o banco de dados.
Você acha que não tem alguma solução que de para resolver isto ?
GOSTEI 0
Kleber Santos
05/02/2020
Oi Felipe,
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
Boa noite!
É isso mesmo, os índices estão sendo separados por vírgula, infelizmente o projeto está sendo refeito apenas a parte PHP.
O projeto já é bem antigo, e optaram por manter o banco de dados.
Você acha que não tem alguma solução que de para resolver isto ?
Como foi falado, o correto é normalizar o BD.
Como que é o select que você está usando?
GOSTEI 0
Felipe Butslof
05/02/2020
Oi Felipe,
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
Boa noite!
É isso mesmo, os índices estão sendo separados por vírgula, infelizmente o projeto está sendo refeito apenas a parte PHP.
O projeto já é bem antigo, e optaram por manter o banco de dados.
Você acha que não tem alguma solução que de para resolver isto ?
Como foi falado, o correto é normalizar o BD.
Como que é o select que você está usando?
$this->db->select('alertas.alerta, alertas.alerta_en, usuarios.usuario, fabricantes.id_fabricante, alertas.ultima_atualizacao, marcas.marca, marcas.id_marca, fabricantes.fabricante, produtos.obs_exclusao, alertas.obs_interna, produtos.produto, alertas.tipo, alertas.data_ini, alertas.data_fim, alertas.ativo, alertas.id_alerta, alertas.id_produto');
Eu precisaria aqui neste join, trazer o nome dos produtos que tem relação com esses índices na coluna.
eu apenas estou conseguindo trazer, se tem apenas um índice na coluna id_produto da tabela alertas.
$this->db->join("produtos", "alertas.id_produto = CONCAT(',' , produtos.id_produto , ',')", "left");
será que realmente não tem nenhuma solução para fazer este join ?
GOSTEI 0
Felipe Butslof
05/02/2020
Oi Felipe,
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
Boa noite!
É isso mesmo, os índices estão sendo separados por vírgula, infelizmente o projeto está sendo refeito apenas a parte PHP.
O projeto já é bem antigo, e optaram por manter o banco de dados.
Você acha que não tem alguma solução que de para resolver isto ?
Como foi falado, o correto é normalizar o BD.
Como que é o select que você está usando?
$this->db->select(''alertas.alerta, alertas.alerta_en, usuarios.usuario, fabricantes.id_fabricante, alertas.ultima_atualizacao, marcas.marca, marcas.id_marca, fabricantes.fabricante, produtos.obs_exclusao, alertas.obs_interna, produtos.produto, alertas.tipo, alertas.data_ini, alertas.data_fim, alertas.ativo, alertas.id_alerta, alertas.id_produto'');
Eu precisaria aqui neste join, trazer o nome dos produtos que tem relação com esses índices na coluna.
eu apenas estou conseguindo trazer, se tem apenas um índice na coluna id_produto da tabela alertas.
$this->db->join("produtos", "alertas.id_produto = CONCAT('','' , produtos.id_produto , '','')", "left");
será que realmente não tem nenhuma solução para fazer este join ?
Os índices estão sendo armazenados desta maneira na coluna id_produto: ,2,,6,,9,,8,,4,
GOSTEI 0
Alec Candia
05/02/2020
Oi Felipe,
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
Boa noite!
É isso mesmo, os índices estão sendo separados por vírgula, infelizmente o projeto está sendo refeito apenas a parte PHP.
O projeto já é bem antigo, e optaram por manter o banco de dados.
Você acha que não tem alguma solução que de para resolver isto ?
Pois então, Felipe, a questão crucial é que tu está tentando "contornar" um problema que na verdade precisaria ser "resolvido".
Com o tempo e o aumento de índices no mesmo registro é provável de a situação saia de controle. Eu pensaria em rever isso imediatamente. Colocaria para os solicitantes do projeto essa necessidade de correção explicando desde a degradação de performance em consultas até o problema futuro de manutenção do banco de dados.
Dar ciência do problema que pode se agravar no futuro é também uma responsabilidade da gente, sejamos nós desenvolvedores ou DBA. Mas, enfim, eu não vejo, nesse cenário, uma solução mais acertada que a correção da lógica do teu índice.
Qualquer coisa, estamos junto. Te ajudo no que for possível.
Abraço,
Alec
GOSTEI 0
Kleber Santos
05/02/2020
Oi Felipe,
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.
Abraço
Boa noite!
É isso mesmo, os índices estão sendo separados por vírgula, infelizmente o projeto está sendo refeito apenas a parte PHP.
O projeto já é bem antigo, e optaram por manter o banco de dados.
Você acha que não tem alguma solução que de para resolver isto ?
Como foi falado, o correto é normalizar o BD.
Como que é o select que você está usando?
$this->db->select('alertas.alerta, alertas.alerta_en, usuarios.usuario, fabricantes.id_fabricante, alertas.ultima_atualizacao, marcas.marca, marcas.id_marca, fabricantes.fabricante, produtos.obs_exclusao, alertas.obs_interna, produtos.produto, alertas.tipo, alertas.data_ini, alertas.data_fim, alertas.ativo, alertas.id_alerta, alertas.id_produto');
Eu precisaria aqui neste join, trazer o nome dos produtos que tem relação com esses índices na coluna.
eu apenas estou conseguindo trazer, se tem apenas um índice na coluna id_produto da tabela alertas.
$this->db->join("produtos", "alertas.id_produto = CONCAT(',' , produtos.id_produto , ',')", "left");
será que realmente não tem nenhuma solução para fazer este join ?
Pelo que entendi você vai ter que tratar o conteúdo do alertas.id_produto na tua aplicação para depois pesquisar.
Uma sugestão:
Busque no BD o alertas.id_produto, que acredito que vai retornar uma String semelhante a essa "1,2,3,4,5,6,7", depois exploda na "," essa string com o PHP, que vai gerar um array de códigos, depois na tua query, você vai ter que fazer um for para poder percorrer esses códigos, mais ou menos assim:
for ($i=0; $i < qtdDeCodigos; $i++) {
$this->db->join("produtos", "alertas.id_produto = arrayDeCodigosExplodido[i]);
}
Provavelmente você vai ter que adaptar essa lógica, mas é para você ter uma ideia da complexidade que você está criando por não ter um BD normalizado
GOSTEI 0