SQLite и Javascript: проверка существования данных перед вставкой ИЛИ, позволяющая SQLite вызвать исключение - PullRequest
2 голосов
/ 06 апреля 2009

Мой основной вопрос: какой подход быстрее?

Некоторый брифинг

Я разрабатываю приложение, используя Mozilla.

У меня есть один модуль, где я собираю некоторые данные и сохраняю их в базе данных. Данные поступают с перерывами. Дубликаты не должны храниться. Для обсуждения мы можем предположить, что таблица содержит всего один столбец, и давайте назовем этот столбец именем «ключевое слово». Поэтому, если мы получим ключевое слово, которое уже есть в базе данных, мы не будем его снова хранить И да, мы установили этот столбец как ПЕРВИЧНЫЙ КЛЮЧ и сделали его УНИКАЛЬНЫМ. :)

У меня есть запрос:

1) Прежде чем вставлять эти новые данные в базу данных, я должен выполнить вызов БД и проверить, существует ли ключевое слово или нет; если его не существует, поместите его в БД? Что-то вроде:

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

OR

2) Я просто вставляю и позволяю базе данных обрабатывать условие, позволяя ей генерировать исключение, которое я ловлю.

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

Я знаю, ловить исключение и ничего не делать - это плохо! Поэтому я не ищу, что хорошо, а что плохо :). Я хочу понять, какой подход будет самым быстрым. (В частности, в отношении Mozilla, JavaScript и SQLite, но приветствуются общие комментарии!)

Sidenotes: Синтаксис SQL. , который я использовал, только для иллюстрации. Вы можете предположить, что я создаю операторы SQL, выполняю их и извлекаю результат, или предполагаю, что это вызов библиотеки JavaScript, который выполняет всю грязную работу.

Этот вопрос немного похож на этот:

Должен ли я проверять наличие ограничений в базе данных в коде или перехватывать исключения, генерируемые БД

Но я хочу понять различия, связанные с производительностью, так как приложение, над которым я работаю, должно быть максимально быстрым (какое приложение не?;))

Ответы [ 2 ]

6 голосов
/ 06 апреля 2009

Просто скажите вашей базе данных игнорировать дубликаты (работает только для столбцов, которые обеспечивают уникальные значения):

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

или создайте столбец, игнорирующий дубликаты.

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

Вместо игнорирования есть также следующие конфликтные предложения:

ROLLBACK
ABORT
FAIL
IGNORE
REPLACE

Для получения дополнительной информации прочитайте страницу о конфликтных предложениях SQLite и документацию оператора INSERT .


Что касается того, быстрее ли использовать исключения или проверять наличие значений: исключения являются дорогостоящими, когда возбуждаются, и нулевыми, если они не возбуждаются. Это означает, что если вы ожидаете, что будет много дубликатов, используйте проверку, и если только небольшое количество ключевых слов являются дубликатами, используйте исключения. В конце концов, исключения должны быть исключительными.

2 голосов
/ 06 апреля 2009

Не уверен насчет специфики mozilla / javascript части этого вопроса, но есть третий вариант «вставить или заменить». Он выполняет то, что вы хотите, без дубликатов и избавляет от необходимости проверять код, если строка уже существует.

...