我们将日志条目存储在 Azure 表存储中。我们存储以下属性:
日期- (日期时间(
- 租户 ID (长(
- 用户名(字符串(
- 严重性(整数 - 枚举错误 (0(、警告 (1(、信息 (2(、调试 (3((
- 。其他目前不重要的属性
有大量的日志条目,我们希望根据以下列快速查询日志:
- 日期(开始/结束(
- 租户 ID (等于(
- 严重性(从/到(
- 用户名(等于(
因此,我们将 rowKey 设计为 date + guid 以保证唯一性。现在我们需要设计分区键。我们需要能够根据租户 ID、用户名和严重性进行查询。所以我想我们需要让他们使用分区键。
以下格式:{严重性}-{租户 ID}-{用户名} 似乎是候选者(键的示例是 1-500-me@me.com 表示严重性:警告,租户 ID:500,用户:me@me.com(。例如,我想查询:
- 调试和信息严重性
这很好,因为我可以写PartitionKey >= 2 AND PartitionKey < 4
, - 它会减少其他严重性的所有结果。
但是,如果我需要增强 tenantId = 500 的此查询(因此仅适用于 tenantId 500 的调试和信息(,我需要编写PartitionKey >= 2-500 AND PartitionKey < 2-501 AND PartitionKey >= 3-500 AND PartitionKey < 3-501
所以这似乎是可能的,但查询变得更加复杂。我知道我只能进行基准测试来测试它的性能,但问题是是否有更好的 RowKey 和 PartitionKey 设计来实现更好的性能。
建议的方法是使用不同的分区键为同一数据添加多行。例如,如果您有以下数据:
日期: 2017-07-31
租户 ID: 3
严重性:2
用户名: me@me.com
以下是数据在表中的存储方式:
PartitionKey RowKey date tenantId severity user
----------------------------------------------------------------------
D|2017-07-31 GUID() 2017-07-31 500 2 me@me.com
T|500 GUID() 2017-07-31 500 2 me@me.com
S|2 GUID() 2017-07-31 500 2 me@me.com
U|me@me.com GUID() 2017-07-31 500 2 me@me.com
因此,当需要查询租户 ID 和严重性时,可以执行以下操作:
PartitionKey eq 'T|500' and severity eq 2
或
PartitionKey eq 'S|2' and tenant eq 500