Join SQL - Codeigniter + SQL Server

05/02/2020

0

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.
Felipe Butslof

Felipe Butslof

Responder

Posts

05/02/2020

Alec Candia

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
Responder

05/02/2020

Felipe Butslof

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



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 ?
Responder

06/02/2020

Kleber Santos

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



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?
Responder

06/02/2020

Felipe Butslof

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



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 ?


Responder

06/02/2020

Felipe Butslof

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



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,
Responder

06/02/2020

Alec Candia

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



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
Responder

07/02/2020

Kleber Santos

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



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
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar