我正在使用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
...没有执行一些荒谬的选择陈述?
非常感谢!
答案 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的样本大小可以为任何大小的数据集提供有效的精确度,因此这种方法可以扩展到数百万个项目。
这显然不太理想,因为它仍然需要大量的查询,但如果您的数据集的属性变化数量相对有限,您应该能够以更小的样本量完成同样的事情。