2013-10-29 37 views
2

我知道它正在工作,但我想知道这是一个与PartitionKey和RowKey具有相同字符串的好习惯吗?使用相同的PartitionKey和RowKey

这种场景适用于所有物品都是唯一的单个表格,Customer表格中每行都有关于一个单一客户的信息。

我的意思是说,例如我会得到这个唯一的客户ID,我想用它来获得PartitionKey + RowKey的记录,所以返回将是快速的和单个项目。

您认为如何?

回答

15

这一定会让你的顾客快速查找。 RowKey可以是一个空字符串,因此如果您为每个客户都有独特的分区,您在技术上不必使PartitionKey和Rowkey匹配。

几件事情要注意这里:

  • 你放弃了加入客户批量或批量更新它们。由于只有同一分区中的实体可以批量处理,如果您有单个实体分区方案,则不会有批处理。鉴于你上面列出的,我不认为这会打扰你。
  • 任何针对partitionKey的范围查询(例如1到200之间的所有客户)最终可能跨越多个分区服务器,这使得查询效率非常低下。再说一次,如果你只想一个一个地看顾客,而不想分组,你应该没问题。可能想要考虑一下这种情况,即必须为系统中的每个客户添加一个属性,以及在需要时如何处理该属性(具有一组已知客户ID的多线程更新程序可能会很好,但你至少应该考虑一下)。
  • 请尽量避免仅追加模式。这意味着如果您的客户ID是连续的,那么当您添加它们时,它们最初将位于相同的分区服务器上。只有当它们中的一部分变热时,它们才会被移到另一台服务器上。最好做一个ID的散列并将其用作PartitionKey,如果你真的开始对它们进行攻击,这会使它们分散到多个分区服务器中。根据您的负载,您可能实际上看不到这一点。

查看How to get most out of Windows Azure Tables关于选择分区键的文章。你会看到我在这里所说的大部分内容(我从中学到的地方之一)还有更多。

+0

如果我明白你的观点是正确的,那么最好有一个共同的ID(例如GUID)作为分区键,然后行键将包含我唯一的客户ID和在这种情况下,我仍然可以通过partionkey + rowkey获得客户,但也可以使用批次? – user2818430

+0

我不会建议只保留一个PartitionKey(例如'Users'),因为这会破坏整个分区的目的。假设你有100000个用户,并将PartitionKey设置为'Users'和RowKey作为唯一的ID。当您搜索用户时,表服务将不得不扫描那些100000条记录来查找匹配的用户标识。在这种情况下,您最好保留唯一的ID作为PartitionKey。 HTH。 –

+0

不,我只是说你应该知道配料只能用于同一分区的实体。正如Gaurav指出,如果您将所有内容放在同一个分区中,您将对系统的可扩展性产生严重影响。只要您始终知道分区密钥,您为每个分区密钥提供单个客户的建议就是可行的。 – MikeWo

1

使用一致的字符串ID“0”,因为RowKey与双重PK具有相同的唯一性结果。 PK + 0 = PK + PK。

一个实用的解决方案正在考虑最常见的查询过程。您可以使用PartitionKey中的zip/pocode - 然后使用RowKey中的客户GUID。如果您的客户群均匀分布在全国各地。 PartitionKey不需要PrimaryKey ...