Несколько лет назад я столкнулся с шаблоном обновления данных, который заключается в использовании так называемой хранимой процедуры UpSert. Хранимая процедура UpSert сочетает вставку новых строк с их обновлением. Вместо двух хранимых процедур, одной для вставки и одной для обновления, у вас просто есть одна, которая делает и то, и другое.

Преимущество заключается в том, что это приводит к коду приложения, которому не нужно заниматься определением того, существует конкретный объект или нет. Вместо того, чтобы писать код для определения того, существует ли конкретный объект в таблице или нет, а затем вызывать хранимую процедуру insert или update в зависимости от ситуации, вы просто вызываете UpSert и позволить хранимой процедуре UpSert определить, следует ли вставить или обновить таблицу.

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

Скрыть Развернуть

Скопировать код

-- =============================================
-- Author:		Dominic Burford
-- Create date: 21/09/2017
-- Description:	Upsert a user
-- =============================================
CREATE PROCEDURE [dbo].[Users_Upsert] 
	@username VARCHAR(128),
	@email VARCHAR(128)
AS
BEGIN
 
    -- are we inserting a new record or updating an existing one?
	SELECT ID FROM	Users
		WHERE Email = @email
 
	IF @@ROWCOUNT = 0
		BEGIN
			INSERT INTO Users
			(
				UserName,
				Email
			)
			VALUES
			(
				@username,
				@email
			)
		END
	ELSE
		BEGIN
			UPDATE Users
				SET UserName = @username,
				Updated = GETDATE()
				WHERE Email = @email
 
		END
END
 
GO

Этот шаблон также хорошо работает с API RESTful. Всякий раз, когда вы хотите вставить или обновить данные, вам не нужно писать код, который определяет, существует ли объект, а затем вызывает соответствующий POST. или PUT, ваш код всегда будет HTTP POST. Это приводит к гораздо более чистому и упрощенному коду. Он также хорошо работает с архитектурами служебной шины, где вас не волнует тип выполняемого обновления, поскольку это просто запрос к базе данных.

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

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