Поддержка баз данных - хорошая или плохая практика?

Ищете какое-то представление о том, является ли процедура Upsert (вставка или если существует, а затем обновление) считается плохой практикой в ​​программировании базы данных. Я работаю на SQL-сервере, если это имеет какое-либо значение.

В месте, где я работал несколько месяцев назад, резидентный DB-гуру изложил в недавно написанных стандартах кодирования db (большинство из которых я согласился), что Upserts следует избегать.

Я не могу понять логическую причину этого и считаю, что я сам разумно осознал хорошую практику программирования. Я думаю, что они полезны для прямого управления данными и помогают избежать избыточных номеров хранимых процедур.

Ищете какое-то понимание/дискуссию, которые помогут мне прийти к выводу об этом.

Спасибо.

Обновление В ответ на комментарии:

Конкретный контекст, на который я ссылаюсь, - это создание или обновление представления данных сущности домена в базе данных. Скажем, например, объект "Человек" существует как представление таблицы "Человек" в базе данных. Мне просто нужен механизм для создания нового Человека или обновления существующего. Здесь у меня есть возможность создать хранимую процедуру Upsert или две отдельные хранимые процедуры: одну для обновления и одну для вставки.

Любые преимущества или недостатки в любом виде?

Ответ 1

Основная проблема заключается в перезаписи существующей записи, когда намерение заключается в добавлении новой записи, поскольку все, что было выбрано в качестве дубликата, дублируется. Например, введите имя пользователя. Вы видите, что логин существует, поэтому вы обновляете, когда вы должны отбросить ошибку, что логин является дубликатом.

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

Ответ 2

Мне нравится программировать специально.

Либо я что-то создаю, и в этом случае я хотел бы, чтобы вставка терпела неудачу (дублировать), если там была сущность. Или, я обновляю то, что я знаю, есть, и в этом случае я бы хотел, чтобы обновление потерпело неудачу (чего на самом деле не происходит).

С upsert/merge это становится нечетким. Неужели я или не добился успеха? Я частично преуспел? Некоторые из значений в строке являются моими (из вставки), и некоторые из них были там раньше?

Сказав это, Upserts полезны (именно поэтому они были реализованы для начала), и запретить их было бы просто глупо. Это как запрет дорог, потому что преступники используют их, чтобы убежать от полицейских. Существует бесконечное число случаев, когда upserts являются единственным возможным способом делать вещи. И все, кто работал с синхронизацией данных между системами, это знают.

Ответ 3

Зависит от того, о чем вы говорите. Данные? Ну, это зависит от процессов манипулирования данными или? Если мне нужно вставить OR update, то мне нужно это сделать. если речь идет о объектах схемы, похожих.

Ответ 4

Возражение в первом примере двух процессов - где второй процесс "воскресает" удаленную запись путем добавления нового с тем же ключом - действует только в конкретных случаях, которые могут возникнуть либо из-за плохого дизайна, либо из происходят, если процедура "upsert" записала запись с идентичным ключом или двумя отдельными процедурами, записала вставленную запись.

Если необходимо избегать идентичного ключа, во вставке используется ключ с автоматическим добавлением. Если идентичного ключа не нужно избегать, должен быть реализован хороший дизайн базы данных, чтобы избежать создания "phantom соединений". Например, в мире телекоммуникаций телефонные номера часто используются повторно и являются "уникальным" ключом. Они не могут быть первичным ключом, потому что человек № 2 может "наследовать" номер телефона, но, скорее всего, не "наследует" человека №1, просроченный неоплаченный счет или историю звонков и т.д. Таким образом, комбинация автоматически увеличивающего первичный ключ плюс даты обслуживания или другие уникальные отступы будут использоваться в любой логике соединения, чтобы предотвратить плохую цепочку данных.