多くの項目を持つドメインに対して、ランダム サンプリング アプローチを使用して、非常に正確な属性のリストを取得できるはずです。C# っぽい疑似コードを次に示します。
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 は、これを達成する方法について優れた説明を書いています。そして、このような効率的なページングを Simple Savant で実現する方法を説明しました。
これにより、ほとんどのデータセットで 99% の精度が得られ、ほとんどの実世界での使用に十分なはずです。統計理論によると、サンプル サイズが 2500 の場合、どのサイズのデータ セットでも実質的に同じ精度が得られるため、この方法は数百万のアイテムにも適用できます。
依然として多数のクエリが必要なため、これは明らかに理想的ではありませんが、データ セットの属性バリエーションの数が比較的限られている場合は、はるかに小さいサンプル サイズで同じことを達成できるはずです。