我的主要问题是哪种方法更快。

一些简报

我正在使用 Mozilla 开发一个应用程序。

我有一个模块,可以捕获一些数据并将其存储在数据库中。数据间歇性地出现。不存储重复项。为了讨论起见,我们可以假设一个表只有一列,我们将该列命名为“关键字”。因此,如果我们获得数据库中已有的关键字,我们就不会再次存储它。是的,我们已将此列设置为主键并使其唯一。:)

我的查询是:

1)在将这些新数据插入数据库之前,我应该进行数据库调用并检查关键字是否存在吗?如果不存在将其放入数据库吗?就像是:

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

或者

2)我只是插入并让数据库处理条件,有效地让它抛出一个异常,我捕获了该异常。

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

我知道捕获异常而不做任何事情是不好的!所以我不是在寻找什么是好的,什么是坏的:)。我想了解的是哪种方法最快。(特别是与 Mozilla、JavaScript 和 SQLite 相关的内容,但也欢迎一般性评论!)

旁注: SQL。 我使用的语法仅用于说明目的。您可能会假设我创建 SQL 语句、执行它们并获取结果,或者假设它是一个 JavaScript 库调用,它完成了所有脏工作。

这个问题有点像这个:

我应该检查代码中的数据库约束还是应该捕获数据库抛出的异常

但我想具体了解与性能相关的差异,因为我正在开发的应用程序需要尽可能快(哪个应用程序不需要?;))

有帮助吗?

解决方案

只需告诉您的数据库忽略重复项(仅适用于强制执行唯一值的列):

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

或创建一个忽略重复项的列。

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

除了忽略之外,还有这些冲突条款:

ROLLBACK
ABORT
FAIL
IGNORE
REPLACE

欲了解更多信息,请阅读 有关 SQLite 冲突子句的页面INSERT 语句的文档.


至于使用异常或检查值是否存在是否更快:引发异常时成本高昂,不引发异常则成本为零。这意味着,如果您预计有许多重复项,请使用检查,如果只有少量关键字重复,请使用异常。毕竟, 例外应该是例外。

其他提示

不知道这个问题的Mozilla浏览器/ JavaScript的部分的细节,但还有第三个选项“插入或替换”。它实现你想要的不重复什么,摆脱的需要在代码中,以检查是否该行已经存在。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top