Jump to content


Photo

Qual Melhor Modo De Pesquisar Se Tem Duplicados Para Inserir?


  • Faça o login para participar
16 replies to this topic

#1 GreyWolf

GreyWolf

    Mestre

  • Usuários
  • 674 posts
  • Sexo:Não informado

Posted 09/07/2008, 18:16

Opa pessoal.

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 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 09/07/2008, 18:20

Estamos falando de:
a) Quantos registros?
B) 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 GreyWolf

GreyWolf

    Mestre

  • Usuários
  • 674 posts
  • Sexo:Não informado

Posted 09/07/2008, 19:21

Eia xD~

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 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 09/07/2008, 20:11

Então minha dica é: troque de SGBD. Use Postgres e seja Feliz! Você precisa de um banco mais robusto.

Maaaas como eu sei que você não vai gostar da idéia e pode até me apedrejar ( :P ), 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:

BLOB and TEXT columns also can be indexed, but a prefix length must be given.

Mas como você vai usar VARCHAR, que é um formato muito melhor ( :D ), não vai ter problemas!

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 :D )

#5 GreyWolf

GreyWolf

    Mestre

  • Usuários
  • 674 posts
  • Sexo:Não informado

Posted 09/07/2008, 22:54

Não vou te apedrejar xD
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 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 10/07/2008, 09:40

Se Postgres é mais lento?
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 (y)?

#7 GreyWolf

GreyWolf

    Mestre

  • Usuários
  • 674 posts
  • Sexo:Não informado

Posted 10/07/2008, 13:59

Poisé.
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 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 11/07/2008, 14:04

:ponder: hm

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! :D Blz?

-----

Pelo que eu pesquisei, os índices nas tabelas Innodb têm o limite de 767 e nas MyISAM 1024.
:ponder: bem, foi o que eu constatei. Se REALMENTE for isso, é uma pena para o MySQL...

#9 GreyWolf

GreyWolf

    Mestre

  • Usuários
  • 674 posts
  • Sexo:Não informado

Posted 11/07/2008, 14:19

Baixei o postgree xP
Agora que me lembrei =x

Não tem um "phpmyadmin" para o postgree?

#10 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 11/07/2008, 14:26

Sim, mas chama-se phppgadmin
E junto com o PostgreSQL vem um client chamado PgAdmin III...

#11 GreyWolf

GreyWolf

    Mestre

  • Usuários
  • 674 posts
  • Sexo:Não informado

Posted 11/07/2008, 14:27

É eu notei xD
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 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 11/07/2008, 14:39

Ish... rs...
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 GreyWolf

GreyWolf

    Mestre

  • Usuários
  • 674 posts
  • Sexo:Não informado

Posted 11/07/2008, 14:51

Consegui jah xD

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 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 11/07/2008, 15:00

Sim! Mas o contrário não é verdade :D
Toda chave primária é única, mas nem toda chave única é uma chave primária...
Um exemplo... :ponder: 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 (y)

#15 GreyWolf

GreyWolf

    Mestre

  • Usuários
  • 674 posts
  • Sexo:Não informado

Posted 11/07/2008, 15:21

Peguei o db designer fork xD
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




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq