Qual Melhor Modo De Pesquisar Se Tem Duplicados Para Inserir?
#1
Posted 09/07/2008, 18:16
Estou com um pequeno "problema".
Estou fazendo um sistema de varredura interna que pega alguns dados e cadastra no banco, porém os dados não podem ser duplicados.
Em teoria é fácil fazer isto, porém queria saber o modo mais ágil de faze-lo, principalmente pq o campo que não pode duplicar é do tipo TEXT, ou seja, não posso setar como unique ou chave primária.
Meu amigo me falou de uma função de update que insere também caso não exista.
Pesquisei e encontrei a função REPLACE, só que não achei ela útil pois precisa do numero identificador.
Acabei de pensar que o numero identificador pode ser o campo text todo, mas ai ele deletaria e inseriria denovo certo?
Isso não se torna meio lendo?
Outro modo que pensei seria cadastrar numa tabela tudo que ele achar pela frente.
Depois manda agrupar por esse campo TEXT para ficar unicos e depois manda inserir na tabela limpa se o campo não existir lá.
O que sugerem?
Obrigado =]
#2
Posted 09/07/2008, 18:20
a) Quantos registros?
Inseridos com que freqência?
c) Existe concorrência?
d) Qual o volume de dados desse TEXT?
e) Seus testes com UNIQUE geraram uma lentidão de que tamanho?
#3
Posted 09/07/2008, 19:21
Pode chegar a mais de 1 milhão de registros mais a frente.
Inseridos direto (na rotina vou fazer pra a cada 30 pesquisados e filtrados ou 1000 pegos para pesquisar depois, executar a rotina de inserção).
Até onde sei não existe concorrência.
Os dados são links. Como existem links com mais de 255 caractéres, char ou varchar não tem como por.
Não posso por UNIQUE pois campos tipo Blob não aceitam isso ;~
#4
Posted 09/07/2008, 20:11
Maaaas como eu sei que você não vai gostar da idéia e pode até me apedrejar ( ), vou tentar dte ajudar com MySQL mesmo!
Campo Blob? Pq?
O que vai só de 0 a 255 é o CHAR, que é diferente de VARCHAR, que vai de 0 a 65535 (desde a versão 5.0.3)
Até onde eu sei você até pode usar um BLOB como índice... veja o que diz o manual:
Mas como você vai usar VARCHAR, que é um formato muito melhor ( ), não vai ter problemas!BLOB and TEXT columns also can be indexed, but a prefix length must be given.
Se você vai ter muita movimentação aí, talvez fosse legal colocar esse índice em uma tablespace separada (mas não no mesmo HD, claro )
#5
Posted 09/07/2008, 22:54
Mais fácil o meu chefe fazer isto hehe
Assim, primeiro que no pc só tem mysql, depois que ficar tudo calmo e deixarem eu mexer, vou por linux na máquina e vejo se ponho isto xD
Postgree não é mais lento?
Não sabia que agora aceitava varchar maior que 255, ficou perfeito então xD
prefix lenght seria o que? Eu tentei por um tamanho definido e não dava =x~
Agora sobre a tablespace não sei muito sobre isso.
A princípio ele quer algo rápido para já começar a trazer resultados, porém não quero fazer algo ruim que depois de defeito, por isso resolvi perguntar aqui.
Qual seria o melhor modo de usar o sistema que mencionei?
Botando esse campo como chave primária, única e quando for inserir mandar ignorar erros (caso seja duplicata)?
Ou criar um banco temporário que cadastra tudo duplicado mesmo e no final da varredura, ele manda inserir tudo ta tabela temporaria dentro da tabela filtrada onde o campo link é diferente dos outros?
To querendo o máximo de desempenho possível sem comprometer a qualidade também xD
Obrigado =]
#6
Posted 10/07/2008, 09:40
Depende... se você for usar um banco sem integridade nenhuma e quiser jogar fora a confiabilidade dos seus dados... sim! Postgres será mais lento. Mas na maioria dos casos, nada significativamente mais lento... e com isso quero dizer: nada que o seu usuário vá perceber.
Mas a medida que você precisa de escalabilidade, o PostgreSQL vai ganhando força pois é naturalmente um banco mais robusto.
Eu não sou louco de ficar recomendando PostgreSQL para usuários de MySQL, pois o MYSQL é um bom banco e melhorou MUITO na versão 5! Mas cada tecnologia tem ambientes aos quais se adapta melhor e vice-versa.
A questão é que quando você precisa de mais robustez (o que parece ser o seu caso), eu recomendo outro SGBD, pois o MySQL ainda tem alguns problemas de escalabilidade...
Recomendo o PostgreSQL por ser um banco Open Source, 100% Free e que roda sim em Windows (assim como em Linux e outros SOs)!
Bem, feita a minha propaganda.... rs...
Definição de tablespace
Se vai ser UNIQUE ou PRIMARY depende da sua modelagem.
Prefix length são os bytes que ele vai usar no índice.
Eu criaria um índice e trataria o erro no Front-end.
Ok ?
#7
Posted 10/07/2008, 13:59
Quem sabe mais a frente eu faça isso. Tem que ver se o hospedeiro tem postgree (deve ter), locaweb xP~
CREATE TABLE links (
id_link BIGINT NOT NULL AUTO_INCREMENT,
link VARCHAR(2000) NOT NULL,
data_cadastro DATE NULL,
visitado SMALLINT UNSIGNED NULL,
PRIMARY KEY(id_link, link)
)
TYPE=InnoDB;
CREATE TABLE spikes (
id_spike BIGINT NOT NULL AUTO_INCREMENT,
link VARCHAR(2000) NOT NULL,
titulo VARCHAR(2000) NOT NULL,
data_cadastro DATE NOT NULL,
PRIMARY KEY(id_spike, link)
)
TYPE=InnoDB;
CREATE TABLE visitas (
id_visita BIGINT NOT NULL AUTO_INCREMENT,
links_link VARCHAR(2000) NOT NULL,
id_link BIGINT NOT NULL,
data_visita DATE NULL,
PRIMARY KEY(id_visita),
INDEX visitas_FKIndex1(id_link, links_link)
)
TYPE=InnoDB;
Erro
consulta SQL:
CREATE TABLE links(
id_link BIGINT NOT NULL AUTO_INCREMENT ,
link VARCHAR( 2000 ) NOT NULL ,
data_cadastro DATE NULL ,
visitado SMALLINT UNSIGNED NULL ,
PRIMARY KEY ( id_link, link )
) TYPE = InnoDB;
Mensagens do MySQL : Documentação
#1071 - Specified key was too long; max key length is 767 bytes
Se eu não por como único ou chave primária ai da. Droga x.x
Edição feita por: GreyWolf, 10/07/2008, 14:02.
#8
Posted 11/07/2008, 14:04
Puts cara, parece que eu tô te sacaneando, mas... acabei de testar no PostgreSQL e funcionou sem problemas! rs...
Meus conhecimentos em MySQL não chegam a esse ponto, mas vou dar uma estudada no seu caso e ver o que pode ser feito... fiquei curioso! Blz?
-----
Pelo que eu pesquisei, os índices nas tabelas Innodb têm o limite de 767 e nas MyISAM 1024.
bem, foi o que eu constatei. Se REALMENTE for isso, é uma pena para o MySQL...
#9
Posted 11/07/2008, 14:19
Agora que me lembrei =x
Não tem um "phpmyadmin" para o postgree?
#10
Posted 11/07/2008, 14:26
#11
Posted 11/07/2008, 14:27
Tirando o pgadmin ali.
Outro probleminha.
Uso o dbdesigner para modelagem de dados, acabei de exportar o sql para testar lá e é diferente.
O que pode ser feito? x.x
Valeu pela ajuda =]
#12
Posted 11/07/2008, 14:39
Eu não vou poder te ajudar muito com isso.
Existe SIM uns trecos...
Existem scripts pra conversão e uns "adaptadores" pra fazer o DBDesigner funcionar pra Postgres... mas tem que dar uma googleada!
#13
Posted 11/07/2008, 14:51
Divertido até
Ueh, tava vendo
Ele ficou como chave primária e tem para adicionar como chave unica. Chave primaria jah nao eh unica? xP
#14
Posted 11/07/2008, 15:00
Toda chave primária é única, mas nem toda chave única é uma chave primária...
Um exemplo... cadastro de clientes!
Vamos supor que você tem um campo numérico sequencial (id) que seja a PK desse cara, mas queira que o campo CNPJ seja uma chave única. É isso. Pegou?
Ah, vc podia postar aqui a solução do DBDesigner... pode ajudar outras pessoas no futuro
#15
Posted 11/07/2008, 15:21
Na hora de exportar ele aparece vários SGDB xD
Ei, instalei o postgree na maquina do lado mas não consigo acesar ela do meu outro pc o.O
Tenteo listen_addresses = 'localhost', '*'
mas não deu certo, nem inicia o treco =x
1 user(s) are reading this topic
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)