Многопользовательская система с последовательностями (в Azure)

Я пытаюсь использовать самое элегантное решение или самую легкую библиотеку, чтобы попытаться создать последовательности для определенных записей. Это будет многопользовательская система, размещенная в Azure с использованием SQL Azure. Все арендаторы будут использовать одну и ту же базу данных. Это приложение ASP MVC4.

И арендатор А, и арендатор Б добавляют два разных Расхода. Каждая запись получит уникальный идентификатор (возможно, INT или GUID), который будет использовать система, однако для каждой записи требуется идентификатор, читаемый человеком, который является int, который также увеличивается для каждого клиента. Почему? Было бы неплохо, если бы у каждого арендатора был свой собственный возрастающий номер, к которому он мог бы относиться. Подумайте, возможно, о номере счета-фактуры.

Например,
Арендатор A добавляет расходы. PKEY = 1 / Sequence = 1
Арендатор B добавляет расходы. PKEY = 2 / Sequence = 1
Арендатор A добавляет расходы. PKEY = 3 / Последовательность = 2

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

Есть ли другой метод или, возможно, библиотека, которые могут помочь в этой ситуации?


person Matty Bear    schedule 03.09.2013    source источник


Ответы (2)


У меня есть мультитеннантное приложение, работающее в Azure / SQL Azure. Я в основном делаю то, что вы говорите. Например, у меня есть схема вроде

Business Table
BusinessId - autoinc
Name

Client Table
ClientId - autoinc
BusinessId
Name

Затем бизнес-идентификатор используется в предложении WHERE в операциях SQL for и CRUD, чтобы гарантировать, что возвращаются только правильные данные. Я создал несколько вспомогательных методов, чтобы упростить эту задачу. Если вы правильно индексируете, я не верю, что должно быть слишком много проблем с производительностью, я никогда их не испытывал. Многие настройки моего приложения также кэшируются в памяти, чтобы облегчить загрузку базы данных.

person Craig    schedule 03.09.2013

Я использовал несколько иной подход. Вы можете обернуть это в хранимую процедуру ...

Он использует последовательности, но динамически создает их при создании нового клиента.

declare @Value int = null
Declare @Company_code varchar(10) = '00' -- Some value to indicate the tenant
Declare @SeqSchema varchar(20) = 'dbo'
Declare @SeqName varchar(50) = 'TestSequence_' + @Company_code
Declare @SeqFullName varchar(200) = quotename(@SeqSchema) + '.' + quotename(@SeqName)
Declare @Sql nvarchar(500)

if not exists (select object_id from sys.objects where object_id = OBJECT_ID(@SeqFullName) and type = 'SO')
Begin
	set @Sql = '
		CREATE SEQUENCE ' + @SeqSchema + '.' + @SeqName + @Company_code + ' as int
			START WITH 1
			INCREMENT BY 1
			MINVALUE 1
			MAXVALUE 999999
			NO CYCLE'

		exec sp_executesql @Sql
End

set @Sql = N'Set @Value = NEXT VALUE FOR ' + @SeqFullName
exec sp_executesql @Sql, N'@Value int output', @Value output;
print @Value

person James Harvey    schedule 20.04.2017