#database #performance
#База данных #Производительность
Вопрос:
Предположим, у меня есть таблица с именем bookLibrary, в которой уникальный идентификатор книги связан с несколькими библиотеками (по их уникальному идентификатору). Если вы получаете обновление для книги в виде массива библиотек, в которых найдена книга, каков наиболее эффективный подход к обновлению таблицы bookLibrary.
В настоящее время я просто удаляю все строки, относящиеся к книге, и добавляю новую связь (строку) для каждой библиотеки в массиве, который я получаю. Это кажется немного радикальным, но оно выполняет свою работу и гарантирует, что в таблице нет повторяющихся строк.
Альтернативным подходом было бы извлечь все строки для книги и просмотреть каждую строку, то есть (1) действительна ли строка (книга все еще находится в библиотеке x), (2) какие строки необходимо вставить (были ли добавлены новые библиотеки для книги x), и (3) какие строки остаются неизменными.
Это тривиальная проблема с простым решением, но подобная проблема заставляет меня часто задумываться об эффективности, и я также хочу убедиться, что досадных ошибок (например, повторяющихся строк) можно избежать как можно больше.
Комментарии:
1. У меня была такая же проблема в недавнем приложении, над которым я работал. Мое решение было таким же, как и ваше, удаляя все ссылки, а затем добавляя все строки, соответствующие строкам, обратно в таблицу. (мне это тоже кажется радикальным) В качестве альтернативы, хотя легко избежать дублирования, проверив, существует ли комбинация перед вставкой, гораздо сложнее эффективно найти, какие строки все еще действительны, чтобы удалить недопустимые
2. Добавьте уникальный индекс, и тогда вы сможете избавить себя от беспокойства о дубликатах…
Ответ №1:
любой подход будет работать. Я бы выбрал опцию «удалить, а затем повторно вставить», если только при таком подходе не было доказанного узкого места в производительности, поскольку он проще с точки зрения сервера. Кроме того, нет никакой гарантии, что загрузка строк и выполнение сравнений на стороне сервера будут лучше, поскольку вам нужно загрузить строки, выполнить вычисления в коде, а затем повторно сохранить до n строк.
Итак, чтобы ответить на ваш вопрос, вам нужно будет выполнить некоторое профилирование, чтобы увидеть, как складываются подходы. Многое будет зависеть от количества строк, количества столбцов в строках, используемого sql и, возможно, от того, как инструкции sql отправляются на сервер.
Что касается надежности, можно уменьшить количество ошибок при любом подходе с помощью обширных тестов. Я думаю, что подход «удалить, а затем повторно вставить» также проще для тестирования.