• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

HolyMurderer

Lógica para corrigir id's vazios

11 mensagens neste tópico

Boas!

Ando aqui a pensar em como fazer uma lógica optimizada para corrigir id's que têm que estar ordenados, quando existirem id's no meio que tenham sido eliminados.

No caso estou a usar PostgreSQL e vou criar um trigger com uma função que faça essa verificação e correcção. Como não gosto de ter a papinha feita, até porque se aprende mais a marrar nas paredes (salvo seja :) ) gostaria que me ajudassem a optimizar a minha lógica, apenas :)

A minha lógica:

- Fazer um select * para um cursor

- Abrir cursor

- ver se existe id 1

-- caso não exista, agarrar no 1º record encontrado e atribuir-lhe id 1

-- Caso exista, continuar

LOOP (enquanto records por actualizar forem encontrados)

- somar 1 ao último id atribuido

- procurar o próximo registo por actualizar

- atribuir o novo valor ao id do record encontrado

FIM DE LOOP

- Retornar resultado

Que fariam vocês neste caso? É que esta lógica actualiza TODOS os registos, vendo 1 a 1. Será a melhor escolha? Ou há alguma alternativa?

Obrigado e um abraço

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto é um tópico recorrente aqui no p@p.

Isso não se deve fazer, na verdade vais estar a dar cabo da integridade de uma base de dados ao fazer isso.

Se se apaga um id, fica apagado, não há azar.

Por que é que precisas dos ids todos seguidos? Se andares a mudar ids então o id não serve para absolutamente nada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dei id's como exemplo. No caso é uma tabela que tem uma coluna chamada ord (vem de order), que tem outra chamada fileformat_id (foreign key para a tabela fileformat, coluna id), além do normal id, em que, dentro de cada fileformat_id, tenho que colocar os ord de 1 até X. Ou seja, só vou actualizar os ord, onde o fileformat_id = Y.

Se eu tiver order 1, 2, 3, 4 e 5, e alguém apagar o 3, fico com order 1, 2, 4 e 5. A ideia seria corrigir o 4 e o 5 de forma a ficarem 1, 2, 3 e 4.

Isto tudo tem a ver com a ordem dumas colunas dentro dum CSV. Tudo está a funcionar, excepto se o user eliminar alguma coluna, a ordem dos seguintes fica com buracos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Essa ordem é baseada em quê?

Na data de inserção? É que nesse caso mais vale usar um timestamp.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, é mesmo para escolher a ordem das colunas. O user escolhe a ordem das colunas (ex: nome, idade, sexo, profissão).

Inicialmente é feita por ordem de inserção, baseada no último valor de order + 1. Depois, o user pode eliminar colunas, ou ordená-las, entre elas. Tudo isso está feito, no interface web que desenvolvemos. Só falta mesmo uma função que será chamada por um trigger, ao fazer-se delete a alguma row nessa tabela, para colocar todos na ordem certa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, é mesmo para escolher a ordem das colunas. O user escolhe a ordem das colunas (ex: nome, idade, sexo, profissão).

Isto é algo que apenas à aplicação diz respeito e não à base de dados, é algo que teriam de implementar na aplicação que usa a base de dados, não faz sentido estar a mexer na base de dados para obter esse tipo de ordem.

Posso estar a perceber mal o que pretendes, mas não estou a ver onde é que é necessário andar a mexer registos na base de dados para fazer esse tipo de funcionalidade.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto é algo que apenas à aplicação diz respeito e não à base de dados, é algo que teriam de implementar na aplicação que usa a base de dados, não faz sentido estar a mexer na base de dados para obter esse tipo de ordem.

Posso estar a perceber mal o que pretendes, mas não estou a ver onde é que é necessário andar a mexer registos na base de dados para fazer esse tipo de funcionalidade.

A ideia seria fazer um trigger na DB, que ao ser eliminado algum registo, corra uma função que verifica e alinha todos os orders do fileformat_id corrente. Assim, sempre que alguém mexer nos dados, seja dessa página ou de alguma outra origem, tudo se mantém actualizado. e ordenado.

Ando aqui a tentar fazer uma função, mas algo está mal na sintaxe e ainda não percebi bem o quê... Sei apenas que é nas declarações de variáveis:

DECLARE
cur1 CURSOR FOR SELECT ord FROM fileformat_column WHERE fileformat_id = current_fileformat;
columns_list integer;
current_order integer;

BEGIN
current_order := 1;
OPEN cur1;

LOOP
	FETCH cur1 INTO columns_list;
	EXIT IF NOT FOUND;

	IF (columns_list != current_order)
	{
		UPDATE fileformat_column SET ord = current_order WHERE CURRENT OF cur1;
	}		

	current_order := current_order + 1;
END LOOP;

CLOSE cur1;

COMMIT;
END;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu tambem acho que estás a misturar lógica aplicacional a lógica da base de dados. Porque não guardar antes a ordem que cada utilizador usa em configurações (podem ser guardadas na prórpria base de dados) e depois quando apresentas os dados usares esses dados.

É que andares a mexer na tua base de dados assim à bruta parece-me meio caminho andado para uma carrada de problemas.

Só os meus dois centimos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Compreendo o que estão a dizer, mas esta ordem não depende de user para user. Isto é algo a ser administrado por um admin. É só 1 user que faz essa alteração. Podem ser mais pessoas, mas é só 1 user de acesso. Caso fossem mais, seria uma questão aplicacional, mas desta forma preferimos fazer através da DB directamente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E se esse utilizador decidir uma ordem, e meio segundo depois decidir outra? O que acontece ao processo de ordenação? Quanto tempo leva? E que impacto tem nos utilizadores da BD?

Não digo que não tenha de ser feito na BD, mas ainda não compreendi porque é que se estão a virar para o uso de triggers quando a camada aplicacional possui mais recursos para esse tipo de serviços, e é, inclusive algo que só a ela lhe diz respeito.

Mas não estou a ajudar muito, quanto ao problema do trigger, lamento mas triggers só usei em Oracle e toda essa sintaxe me é estranha.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes dar um exemplo de como deve funcionar ? É que ainda não entendi o que queres fazer!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora