2011-04-11 9 views
1

J'ai une liste des emplacements, qui actuellement dans MySQL a une hiérarchie au-dessus comme ça Continent> Pays> Département/Région/État> Provence> Lieu. Si je devais stocker ces emplacements dans un magasin NoSQL (comme CouchDB). Aurais-je simplement stocker le continent comme objet de premier niveau et le reste comme des tableaux d'enfants pour ce continent. Ensuite, utilisez map/reduce pour créer les différentes vues pour les pays, les comtés, etc. Est-ce la structure recommandée pour ce type de données? Cela rendrait le document de chaque continent très grand?Documents NoSQL pour les données relationnelles (emplacements)

{ 
    name: "Europe", 
    type: "CONTINENT", 
    countries: [ 
    { 
     name: "England" 
     counties: [...] 
    } 
    ] 
} 

Répondre

4

Ceci est seulement une suggestion et une spéculation de ma part, mais je pense que je peux avoir une bonne idée. (Je recommande également fortement la recherche en GeoCouch pour les données de type emplacement.)

Si vous voulez vous poursuivre, vous pouvez stocker chaque emplacement avec tous les niveaux de détails stockés sous forme d'attributs:

{ 
    "continent": "North America", 
    "country": "United States", 
    "state": "Texas", 
    "city": "Houston" 
} 

Je viens des États-Unis, alors j'utilise ce que j'utiliserais normalement pour déterminer mon emplacement. (J'ai remarqué que vous avez utilisé provence, comté, etc., qui peut facilement être intégré dans ce modèle)

Quoi qu'il en soit, la fonction de vue ressemblerait à ceci:

function (doc) { 
    emit([doc.continent, doc.country, doc.state, doc.city], null); 
} 

Cette sortie vue volonté:

{ 
    "key": ["North America", "United States", "Texas", "Houston"], 
    "value": null 
} 

Maintenant, je sais que ce sont des données redondantes, car elles sont stockées comme ça pour chaque emplacement. C'est bon, nous avons affaire à NoSQL, il n'y a pas besoin de continuer à penser en relation. (C'est pourquoi vous cherchez une autre solution comme CouchDB)

De toute façon, vous pouvez utiliser le paramètre de vue group_level pour "descendre" dans vos emplacements. En utilisant group_level=1 vous obtiendrez un résultat de vue groupé par Continent. group_level=2 va regrouper par pays, group_level=3 va regrouper par État, etc

L'utilisation d'une fonction de réduction peut vous obtenir des comptes et d'autres statistiques pour chacun de ces regroupements. J'espère que ça aide!

+0

Joli merci. Une autre question si je peux. Que faire si chaque zone a des données sur cette zone. Par exemple pour l'Angleterre, nous avons des informations textuelles sur la zone de surf. Idéalement, nous ne mettrions pas à jour tous les documents contenant l'Angleterre si nous changions le texte? – Gcoop

+0

Vous pourriez avoir un type de document séparé qui n'a que continent et pays, alors vous pourriez utiliser une vue séparée pour introduire ce type de document. –

+0

Merci pour votre aide. Vos solutions créent une structure relationnelle quelconque? Pas que ce soit un problème, mais c'est ce que vous suggérez? – Gcoop

Questions connexes