SQLite e Javascript: Verificação de existência de dados antes de inserir ou deixar SQLite lançar uma exceção

StackOverflow https://stackoverflow.com/questions/720656

Pergunta

A minha pergunta principal é qual abordagem é mais rápida.

Alguns coletiva

Estou desenvolvendo uma aplicação utilizando Mozilla.

Eu tenho este módulo onde eu capturar alguns dados e armazená-lo no banco de dados. Os dados vem em forma intermitente. Não há duplicatas devem ser armazenados. Para discussão bem podemos supor uma tabela com apenas uma coluna, e vamos nome que coluna é chamado 'palavra-chave'. Então, se temos uma palavra-chave que já está no banco de dados nós não armazená-lo novamente. E sim, temos que definir esta coluna como PRIMARY KEY e tornou UNIQUE. :)

A consulta que eu tenho é:

1) Antes de inserir estes novos dados no banco de dados, devo fazer uma chamada DB e verificar se a palavra-chave existe ou não; se não existe colocá-lo em DB? Algo como:

function insert_keyword(keyword)
{
   if(!SQL.exists(keyword))
   {
       SQL.insert(keyword);
   } 
}

ou

2) Eu só inserir e deixar o punho de banco de dados a condição, efetivamente deixando-lançar uma exceção, que eu captura.

function insert_keyword(keyword)
{
    try {
       SQL.insert(keyword);
    }
    catch (e)
    {
       // keyword exists!
    }
}

Eu sei que captura uma exceção e não fazer nada é mau! Então, eu não estou procurando o que é bom eo que é ruim :). O que eu quero entender é que abordagem poderia ser o mais rápido. (Especificamente em relação ao Mozilla, JavaScript e SQLite, mas comentários gerais são bem-vindas!)

notas laterais:. O SQL sintaxe que usei é apenas para fins de ilustração. Você pode supor que eu crie instruções SQL, executá-los e buscar o resultado, ou assumir que é uma chamada de biblioteca JavaScript que faz todo o trabalho sujo.

Esta questão é um pouco como este:

devo cheque de restrições DB no código ou devo pegar exceções lançadas por DB

Mas eu quero entender as diferenças de desempenho relacionados especificamente, como a aplicação que estou trabalhando necessidades para ser o mais rápido possível (que a aplicação não funciona;?))

Foi útil?

Solução

Apenas informe o seu banco de dados para ignorar duplicatas (funciona apenas para colunas que impõem valores originais):

INSERT OR IGNORE INTO table(keyword) VALUES("someWord");

ou criar uma coluna, que ignora as duplicatas.

CREATE TABLE someTable(keyword PRIMARY KEY ON CONFLICT IGNORE);

Em vez de ignorar também existem essas cláusulas de conflito:

ROLLBACK
ABORT
FAIL
IGNORE
REPLACE

Para obter mais informações, leia a página sobre cláusulas de conflito de SQLite e o documentação da instrução INSERT .


Como para se é mais rápido usando exceções ou verificando a existência de valores: As exceções são caros quando levantada e custo zero quando não levantada. Isto significa que se você espera ter muitas duplicatas usar o cheque e que apenas um pequeno número de palavras-chave são duplicados usar exceções. Afinal, exceções deve ser excepcional.

Outras dicas

Não tenho certeza sobre as especificidades da parte mozilla / javascript desta questão, mas há uma terceira opção 'inserir ou substituir'. Ele faz o que você quer sem duplicatas e se livrar da necessidade de check-in de código se a linha já existe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top