来自Microsoft Azure文档:
Elastic Scale支持以下.Net框架类型作为分片 键:
- 整数
- 长
- GUID
- 字节[]
- 日期时间
- 的入库时间
- DATETIMEOFFSET
为什么不支持字符串?
答案 0 :(得分:2)
如上面的海报所示,无约束字符串是索引数据库中内容的低效方法(分片映射存储在SQL数据库中)。在引擎盖下,弹性数据库客户端库(EDCL)将所有支持的类型规范化为byte [],并在数据库的分片映射中使用它。如果将字符串转换为支持的类型之一,则可以有效地将字符串用作键。
您可以在WingtipSaaS sample application中看到这一点,它使用场地名称作为关键字。我们选择将名称转换为整数键(为了演示和探索目的,更容易在代码中跟踪整数值),但可能已经在byte []处停止了。使用名称的UTF8编码的MD5哈希完成转换。下面的PowerShell代码来自Get-TenantKey函数,由多个管理脚本使用。您可以在客户端应用程序中找到C#等效项。样本在这里:(https://github.com/Microsoft/WingtipSaaS)。以下功能位于... \ Learning Modules \ Common \ CatalogAndDatabaseManagement.psm模块中。
$normalizedTenantName = $TenantName.Replace(' ', '').ToLower()
# Produce utf8 encoding of tenant name
$utf8 = New-Object System.Text.UTF8Encoding
$tenantNameBytes = $utf8.GetBytes($normalizedTenantName)
# Produce the md5 hash which reduces the size
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$tenantHashBytes = $md5.ComputeHash($tenantNameBytes)
# Convert to integer for use as the key in the catalog
$tenantKey = [bitconverter]::ToInt32($tenantHashBytes,0)
答案 1 :(得分:1)
美好的一天,
这些.Net框架类型可用作分片键 你如何使用自由文本作为分片键(我不是说你不能说它与使用INT不一样,并且在一般情况下可能会复杂得多)?
支持使用String来与Elastic Scale一起使用,但它不能作为分片的唯一键。例如,字符串可以映射到NVARCHAR(MAX),出于相同的原因,不支持作为主键。如果您尝试创建它,您将收到错误:
Column ...的类型无法用作索引中的键列。
用于"决定"的分片键存储值的位置(在哪个共享数据库中)。例如,您可以配置范围分片映射,并选择1到100之间的所有值都将存储在数据库A中,所有100到200之间的值将存储在数据库B中,依此类推。自由弦不适合这种性质。
理论上,您可以说您希望在字符串上使用范围但在大数据系统中没有意义,而Elastic Scale是基于Azure SQL数据库的大数据系统的解决方案。
我希望这澄清问题: - )