SQLite e Javascript: Verificação de existência de dados antes de inserir ou deixar SQLite lançar uma exceção
-
23-08-2019 - |
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;?))
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.