2010-10-02 8 views
1

Je sais que c'est une autre question sur ce sujet mais je suis un débutant complet dans le monde NoSQL donc j'adorerais avoir quelques conseils. Les gens de SO m'ont dit que MySQL pourrait être une mauvaise idée pour ce jeu de données, donc je demande cela. J'ai beaucoup de données dans le format suivant:MongoDB ou CouchDB ou autre chose?

TYPE 1

ID1: String String String ... 
ID2: String String String ... 
ID3: String String String ... 
ID4: String String String ... 

que j'espère convertir en quelque chose comme ceci:

TYPE 2

ID1: String 
ID1: String 
ID1: String 
ID1: String 
ID2: String 
ID2: String 

Ceci est le moyen le plus inefficace, mais je dois être en mesure de rechercher à la fois la clé et le v alue. Par exemple, mes questions se ressembler à ceci:

  • je pourrais avoir besoin de savoir ce que toutes les chaînes d'un ID donné contient, puis recouper la liste avec une autre liste obtenue pour un ID différent.
  • je pourrais avoir besoin de savoir ce que tous les ID contiennent une chaîne donnée

J'aimerais réaliser cela sans transformation de type 1 en type 2 en raison des besoins en espace pure, mais je voudrais savoir si l'MongoDB ou CouchDB ou quelque chose d'autre (quelqu'un a suggéré que NoSQL a donc commencé à googler et a trouvé ces deux sont très populaires) m'aiderait dans cette situation. Je peux tirer parti d'un cluster de 14 nœuds, mais j'aimerais avoir quelques conseils sur la base de données la mieux adaptée à cette utilisation. Aucune suggestion?

Quelques choses supplémentaires:

  • L'entrée sera essentiellement statique. Je vais créer de nouvelles données mais je ne modifierai aucune des données existantes.
  • L'ID est de 40 octets de longueur alors que les chaînes sont environ 20 octets
+0

Combien d'identifiants et de chaînes par ID attendez-vous? – methodin

+0

@methodin: Par ID, il pourrait y avoir environ 10 - 80000 chaînes. – Legend

+0

@methodin: Oh et aussi, dans Type-1, j'ai environ 2 millions d'enregistrements. Si je convertis cela en Type-2, le nombre va jusqu'à 4 milliards. – Legend

Répondre

3

MongoDB vous permettra de stocker ces données efficacement dans le type 1. En fonction de votre utilisation, il ressemblera à un entre eux (données en JSON):

tableau de chaînes

{ "_id" : 1, "strings" : ["a", "b", "c", "d", "e"] }

Jeu de KV Strings

{ "_id" : 1, "s1" : "a", "s2" : "b", "s3" : "c", "s4" : "d", "s5" : "e" }

Sur la base de vos questions, je serais probablement utiliser la méthode Array of Strings. Voici pourquoi:

je pourrais avoir besoin de savoir ce que toutes les chaînes un ID donné contient puis recouper la liste avec une autre liste obtenue pour un ID différent.

C'est facile, vous obtenez une recherche de valeur clé pour l'ID.Dans le code, il ressemblerait à quelque chose comme ceci:

db.my_collection.find({ "_id" : 1});

je pourrais avoir besoin de savoir ce que tous les ID contiennent une chaîne donnée

De même facile:

db.my_collection.find({ "strings" : "my_string" })

Ouais c'est aussi simple que ça. Je sais que "cordes" est techniquement un tableau, mais MongoDB reconnaîtra l'élément comme un tableau et passera en boucle pour trouver la valeur. Docs pour ce are here.

En prime, vous pouvez indexer le champ "chaînes" et vous obtiendrez un index sur le tableau. Ainsi, la découverte ci-dessus aura une performance relativement rapide (avec le compromis évident que l'indice sera très grand).

En termes de mise à l'échelle, un cluster à 14 nœuds peut être presque trop puissant. Toutefois, Mongo prend en charge les ensembles de partitionnement automatique et de réplication. Ils travaillent même ensemble, voici un membre blog post from a 10gen pour vous aider à démarrer (10gen fait Mongo).

+0

Merci pour l'explication détaillée. – Legend

Questions connexes