总体而言,我对 Azure 表和 NOSQL 还不熟悉。
我目前在 Azure 表中拥有一个大约有 60,000 行的表。其中包含职位空缺,列有 ID(RowKey)、雇主(PartitionKey)、职位、地区、类别等列。
当网站上的某人执行搜索时,请求将发送到外部匹配系统。然后匹配系统将返回适用的职位。匹配引擎返回每个职位的 ID 和雇主。
搜索可能包含 10 个不同的雇主,涵盖 300 个职位。如果我使用的是 SQL Server 数据库,我只需在 ID 上创建一个“IN”子句,该 ID 将成为主键,以便从我的表中选择这些作业。
对于 Azure 表,推荐的方法是使用 PartitionKey(我已在其上创建了雇主),因此我的计划是向表中的每个雇主发出查询,然后合并结果,最后在传递到之前进行排序用户界面。
我的问题是我无法运行诸如“WHERE Employer =”MyEmployer”AND ID IN (1,2,3,4,5,6)之类的查询。
实现这一目标的最佳方法是什么?我不希望雇主的所有工作都返回,因为我可能不会全部使用它们。我希望根据我收到的 ID 从某个雇主处获得某些工作。
我认为这应该很简单,但到目前为止事实证明很棘手!
最佳答案
My problem here is that I can't run a query such as "WHERE Employer = "MyEmployer" AND ID IN (1,2,3,4,5,6).
您当然可以执行 IN
查询,尽管语法会有点不同。假设您使用 REST API 并使用 ODATA 语法编写查询,您将使用以下内容:
(PartitionKey eq 'MyEmployer' and (RowKey eq '1' or RowKey eq '2' or RowKey eq '3' or RowKey eq '4' or RowKey eq '5' or RowKey eq '6')
您需要考虑的一些事项:
- 这将导致完整的分区扫描。如果分区中的实体数量较少,这可能不是问题,但随着实体数量的增加,这可能会成为问题。
- 由于查询在请求中作为查询字符串传递到表服务,因此查询中可以包含的
or
子句数量有限。如果我没记错的话,查询字符串的最大长度是 1024 个字符。 - 您可能需要考虑并行触发许多单个查询,其中每个查询将针对单个实体,例如
PartitionKey eq 'MyEmployer' 和 RowKey eq '1'
。
最后,您可能想阅读存储团队的这篇博文:http://blogs.msdn.com/b/windowsazurestorage/archive/2010/11/06/how-to-get-most-out-of-windows-azure-tables.aspx 。这将为您提供非常好的见解。
关于Azure 表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26323283/