Amazon SimpleDB - 有没有办法列出域中的所有属性?

时间:2010-05-05 11:16:51

标签: c# dns attributes amazon-simpledb

我正在使用C#和Amazon的AWSSDK库来测试SimpleDB中的一些东西。到目前为止一切顺利。

但是,我试图找到一种巧妙的方法来检索适用于域的所有属性。这被证明是棘手的,无需检索项目,显然我可以获得属性列表。但是如果我在域中有100,000个项目怎么办?假设“人员”域中的前70,000个项目具有:

FirstName,LastName,Address

然后我点击了一个

的项目

FirstName,LastName,Address,Phone

然后我在80,000大关附近击中另一个物品:

FirstName,LastName,电子邮件,电话

在上面的示例中,对于Person Domain,我如何获得包含以下内容的列表:

FirstName,LastName,Address,Email,Phone

...没有执行一些荒谬的选择陈述?

非常感谢!

1 个答案:

答案 0 :(得分:2)

对于包含许多项目的域,您应该能够使用随机抽样方法获得高度准确的属性列表。这是一些C#-ish伪代码:

int domainCount = "select count(*) from Person";
int avgSkipCount = domainCount/2500;
int processedCount = 0;
string nextToken = null;
Set attributeNames;

do
{
  int nextSkipCount = Random.Next(0, avgSkipCount*2);
  string nextToken = "select count(*) from Person limit " + nextSkipCount;
  var countRequest = new SelectRequest
  {
    NextToken = nextToken,
    SelectExpression = "select count(*) from Person limit " + nextSkipCount
  };
  var countResponse = SimpleDb.Select(countRequest);
  nextToken = countResponse.NextToken;
  processedCount += countResponse.Count;

  var getRequest = new SelectRequest 
  {
    NextToken = nextToken,
    SelectExpression = "select * from Person limit 1"
  };
  var getResponse = SimpleDb.Select(getRequest);
  nextToken = getResponse.NextToken;
  processedCount++;

  attributeNames.Add(getResponse.AttributeNames);

} while (domainCount > processedCount);

这取决于您可以使用从select count(*)查询返回的NextToken来跳过SimpleDB中的记录。 Mocky撰写了an excellent explanation of how to accomplish this。我已经解释了how to accomplish efficient paging like this with Simple Savant

对于大多数实际应用来说,大多数数据集都能提供99%的准确率。统计理论认为2500的样本大小可以为任何大小的数据集提供有效的精确度,因此这种方法可以扩展到数百万个项目。

这显然不太理想,因为它仍然需要大量的查询,但如果您的数据集的属性变化数量相对有限,您应该能够以更小的样本量完成同样的事情。