3

我正在尝试使用最优雅的解决方案或使用最轻的库来尝试为特定记录生成序列。这将是一个使用 SQL Azure 在 Azure 中托管的多租户系统。所有租户将共享同一个数据库。它是一个 ASP MVC4 应用程序。

租户 A 和租户 B 都添加了两种不同的费用。每条记录都将获得系统将使用的唯一 ID(可能是 INT 或 GUID),但是,每条记录都需要一个租户人类可读 ID,它也是一个整数,每个租户都会递增。为什么?对于每个租户来说,拥有他们自己可以关联的递增数字会很好。想想发票号码,也许。

例如,
租户 A 增加了费用。PKEY = 1 / Sequence = 1
租户 B 增加费用。PKEY = 2 / Sequence = 1
租户 A 增加费用。PKEY = 3 / 序列 = 2

一种解决方案是保留一个包含序列类型、租户 ID 和下一个值的表,并在我插入费用之前对其进行查询并增加它(使用相同的示例)。从长远来看,这似乎让我自己面对一些糟糕的数据库性能。

在这种情况下是否有另一种技术或图书馆可以提供帮助?

4

2 回答 2

1

我采取了稍微不同的方法。你可以把它包装成一个存储过程......

它使用序列,但在创建新租户时会动态创建它们。

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

于 2017-04-20T23:47:37.533 回答
0

我有一个在 Azure/SQL Azure 上运行的多租户应用程序。我基本上按你说的做。例如我有一个像

Business Table
BusinessId - autoinc
Name

Client Table
ClientId - autoinc
BusinessId
Name

然后在 SQL for 和 CRUD 操作的 WHERE 子句中使用业务 ID,以确保只返回正确的数据。我创建了一些辅助方法来简化此操作。如果您正确索引,我不认为应该有太多的性能问题,我从未遇到过任何问题。我的许多应用程序设置也缓存在内存中以减轻数据库负载。

于 2013-09-03T11:09:17.613 回答