2010-05-05 4 views
2

J'utilise C# et le formulaire de bibliothèque AWSSDK Amazon pour tester quelques éléments dans SimpleDB. Tout va bien jusqu'à présent.Amazon SimpleDB - Existe-t-il un moyen de répertorier tous les attributs d'un domaine?

Cependant, j'essaye de trouver une manière ordonnée de récupérer tous les attributs qui s'appliquent à un domaine. Cela s'avère difficile sans avoir à récupérer un objet, et évidemment je peux obtenir la liste des attributs alors. Mais que faire si j'ai 100.000 articles dans un domaine. Disons que les premiers 70.000 articles dans un domaine "Personne" ont:

FirstName, LastName, Adresse

Et puis je frappe un élément qui a

FirstName, LastName, Adresse, Téléphone

et puis je frappe un autre élément autour de la marque 80 000 qui a:

FirstName, LastName, Email, téléphone

Dans le exa ci-dessus mple, pour la personne du domaine, comment pourrais-je obtenir une liste qui contient:

FirstName, LastName, Adresse, Email, Téléphone

... sans effectuer un nombre ridicule d'instructions select?

Merci beaucoup!

Répondre

2

Vous devriez être en mesure d'obtenir une liste d'attributs très précise en utilisant une approche d'échantillonnage aléatoire pour les domaines comportant de nombreux éléments. Voici quelques C# pseudo-code 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); 

Cela dépend du fait que vous pouvez utiliser le NextToken retourné d'un select count (*) requête pour sauter des enregistrements dans SimpleDB. Mocky a écrit an excellent explanation of how to accomplish this. Et j'ai expliqué how to accomplish efficient paging like this with Simple Savant. Cela vous donnera une précision de 99% avec la plupart des ensembles de données qui devraient être assez bon pour la plupart des utilisations du monde réel. La théorie statistique indique qu'une taille d'échantillon de 2500 vous donne effectivement la même précision pour n'importe quel ensemble de données de taille, donc cette méthode évolue même pour des millions d'éléments. Ceci n'est évidemment pas idéal, car il nécessite encore un grand nombre de requêtes, mais vous devriez être capable d'accomplir la même chose avec une taille d'échantillon beaucoup plus petite si votre ensemble de données a un nombre relativement limité de variations d'attributs.

Questions connexes