Do que vale autoincremento se não é autodecremento?
Estou trabalhado com o FB em um sistema com 40 tabelas que estou importando uma a uma do meu cliente (Access: do cliente).
Cada tabela possui um campo integer chave primária e lógico, auto incremento também...
Sei também que em cada tabela, se eu eliminar o campo auto incremento eu poderei usar outro campo tipo string como chave primária...
Hipoteticamente sabemos que, se postarmos 3 registros será gerado o: 1-2-3 (incremento)
Agora, se deletarmos o ítem 2 fica: 1-3, ou seja, forma-se uma sequência disforme e não é realizada uma reordenção numérica: Deveria ficar 1-2. E para existir uma reordenção ... só com um scan na base toda... tarefa que está radicalmente descartada à ser feita, pelo simples motivo de ter que percorrer toda a Base...
Gostaria de conselhos sobre isso...
Cada tabela possui um campo integer chave primária e lógico, auto incremento também...
Sei também que em cada tabela, se eu eliminar o campo auto incremento eu poderei usar outro campo tipo string como chave primária...
Hipoteticamente sabemos que, se postarmos 3 registros será gerado o: 1-2-3 (incremento)
Agora, se deletarmos o ítem 2 fica: 1-3, ou seja, forma-se uma sequência disforme e não é realizada uma reordenção numérica: Deveria ficar 1-2. E para existir uma reordenção ... só com um scan na base toda... tarefa que está radicalmente descartada à ser feita, pelo simples motivo de ter que percorrer toda a Base...
Gostaria de conselhos sobre isso...
Nerdex
Curtidas 0
Respostas
Lucianopimenta
07/03/2005
Ola Nerdex,
Essa dúvida eh muito comum. Imagine que o banco faça o que vc quer, reordenar para 1-2, os registros 1-2-3 quando vc deletar o 2, por exemplo. Mas e se essa tabela fizer referencia a outra e esse código for uma chave estrangeira em outra tabela, a reordenação tbm deverá ocorrer nessas tabelas, ou seja, muito processamento.
Então sempre será melhor vc ter uma tabela com os registros 1-3-4-6-7-9, mas que está relacionada corretamente com outras.
Espero ter sido claro pra responder a sua dúvida.
Essa dúvida eh muito comum. Imagine que o banco faça o que vc quer, reordenar para 1-2, os registros 1-2-3 quando vc deletar o 2, por exemplo. Mas e se essa tabela fizer referencia a outra e esse código for uma chave estrangeira em outra tabela, a reordenação tbm deverá ocorrer nessas tabelas, ou seja, muito processamento.
Então sempre será melhor vc ter uma tabela com os registros 1-3-4-6-7-9, mas que está relacionada corretamente com outras.
Espero ter sido claro pra responder a sua dúvida.
GOSTEI 0
Maurício Santos
07/03/2005
Olá!!!
Qual a real necessidade de se aproveitar um número já excluido?
Maurício
Qual a real necessidade de se aproveitar um número já excluido?
Maurício
GOSTEI 0
Nerdex
07/03/2005
Agradeço tua resposta caro Luciano... (ex-colega da UNIFRA)... daee
Maurício para mim é uma questão de indexação, qualidade, harmonia e performance... concordo claramente de que um número já excluído não é mais aproveitável... mas praticamete, eu não gosto da idéia da existência de um queijo suíço ou um HD com dados completamente fragmentado...
Acredito que o auto-incremento cai bem para aplicações no comércio: Tipo emissão de nota fiscal e vendas de produtos. Fatos que certamente não serão eliminados... e se for, somente em um balanço anual... de uma loja, no caso... entende...
Maurício para mim é uma questão de indexação, qualidade, harmonia e performance... concordo claramente de que um número já excluído não é mais aproveitável... mas praticamete, eu não gosto da idéia da existência de um queijo suíço ou um HD com dados completamente fragmentado...
Acredito que o auto-incremento cai bem para aplicações no comércio: Tipo emissão de nota fiscal e vendas de produtos. Fatos que certamente não serão eliminados... e se for, somente em um balanço anual... de uma loja, no caso... entende...
GOSTEI 0
Beppe
07/03/2005
Claro que dá pra repovoar os buracos, basta manter uma tabela com os IDs excluídos, usando generator apenas se ela estiver vazia.
GOSTEI 0
Bruno Belchior
07/03/2005
cinceramente discarto o auto incremento do Firebird (até porque todos sabemos que na verdade não há auto-incremento mas sim uma emulação criada...) tenho minha classe especial feita somente para tratar chaves primárias que uso como auto-incremento em um campo VarChar, mas nem por isso livro-me da desordenação dos índices visto que tbm não vou varrer todo o BD para reorganizar...
GOSTEI 0
Bon Jovi
07/03/2005
Crie um campo a parte fazendo o q quiser com ele.
CREATE TABLE TABELA
(
ID_TABELA DECIMAL(5) NOT NULL PRIMARY KEY, /* nunca alterar */
NUM_ORDEM DECIMAL(5) NOT NULL UNIQUE /* reorganize a vontade */
)
CREATE TABLE TABELA
(
ID_TABELA DECIMAL(5) NOT NULL PRIMARY KEY, /* nunca alterar */
NUM_ORDEM DECIMAL(5) NOT NULL UNIQUE /* reorganize a vontade */
)
GOSTEI 0
Carlosrm
07/03/2005
Beppe,
obrigado. Sua sugestão foi ótima também para mim!
carlosrm :wink:
obrigado. Sua sugestão foi ótima também para mim!
carlosrm :wink:
GOSTEI 0
Nerdex
07/03/2005
[size=18:82c70c5d2f]Valew Beepe...! - Repovoar IDs excluídos é a idéia dá hora![/size:82c70c5d2f]
Solução simples, amigável e importantíssima...
Solução simples, amigável e importantíssima...
GOSTEI 0
Bruno_orderby
07/03/2005
Galera.....
particularmente não gosto de escluir meus dados da tabela, pro isso tenho sempre um campo chamado excluido do tipo char que altero pra S ou N se o registro foi ´deletado´ pelo usuario ou não, e para visualização dos dados pra não ficar lento não exibo tabelas apenas as views.....
Assim sempre mantenho integridade, com a opção de uma futura restauração em dados que o cliente queira novamento sem ter de fazer backup......
Abraço......
particularmente não gosto de escluir meus dados da tabela, pro isso tenho sempre um campo chamado excluido do tipo char que altero pra S ou N se o registro foi ´deletado´ pelo usuario ou não, e para visualização dos dados pra não ficar lento não exibo tabelas apenas as views.....
Assim sempre mantenho integridade, com a opção de uma futura restauração em dados que o cliente queira novamento sem ter de fazer backup......
Abraço......
GOSTEI 0