2011-06-02 7 views
3

Vous vous demandez comment certains des plus expérimentés (ou toute personne ayant une meilleure idée que moi) traiterait de mon scénario de modélisation particulier ...Modélisation Question pour RavenDB (ou d'autres bases de données orientées doc)

J'ai un typique " Catégorie -> SubCategory -> TertiarySubCategory "scénario et je ne suis pas sûr si je suis mappage correctement. Je suis en train de cartographier ceci directement sur une route MVC puisque le corbeau semble se prêter bien à cela. Dans la catégorie finale (qui peut être au premier, deuxième ou troisième niveau, il y aura une liste d'éléments associés uniquement à ce niveau d'une catégorie.) Nous pourrions avoir quelque chose comme:

Catégorie de niveau unique: '/ Politique/»

Deuxième catégorie de niveau: 'Politique/gens' ou 'Politique/Sites'

Tri niveau catégorie: 'sports/Pro/volley-ball' ou 'sports/Collège/Football'

Dans un SGBDR traditionnel, c'est facile avec les clés primaires/étrangères + quelques jointures ... alors, je me demande comment je pourrais gérer avec Raven?D'après ce que j'ai lu, devrais-je stocker l'intégralité de l'URI ou de la clé 'sports/pro/volleyball' dans une liste d'éléments qui en relèvent?

à savoir -

public class CategoryItem 
{ 
    public string FriendlyName {get;set;} // Volleyball or Pro Volleyball 
    public string CategoryURI {get;set;} // i.e. - "/sports/pro/volleyball/" 
    public string content {get;set;} // i.e. - "Who is the best Pro Volleyball Athlete?" 
    public List<string> Comments {get;set;} 
} 

// then we could store something like this: 

var survey1 = new CategoryItem(); 
survey1.CategoryURI = "/sports/pro/volleyball/" 
survey1.Content = "Who is the best female pro volleyball player?"; 
survey1.Comments.Add(new Comment("Misty May")); 

var survey2 = new CategoryItem(); 
survey2.CategoryURI = "/sports/pro/volleyball/"; 
survey2.Content = "Who is the best male pro volleyball player?"; 
survey2.Comments.Add(new Comment("Some guy I don't kow"); 

// asuumes ravenSession was alreadyopened... 
ravenSession.Store(survey1); 
ravenSession.Store(survey2); 
ravenSessoin.SaveChanges(); 


//{ ...... etc ..... } 
//Then I can query by CategoryURI without needing joins (denormalization).... i.e. - 

var items = session.Query<CategoryItem>() 
       .Where(x => x.CategoryURI == "/sports/pro/volleyball/"); 

Ou devrais-je créer une liste des articles membre de la classe de catégorie réelle? Chaque élément aurait une liste de ses propres commentaires ... ce qui signifie que tout est stocké dans un seul document au sein de Raven - à savoir -

public class Category 
{ 
    public string FriendlyName {get;set;} // i.e. - "Volleyball" or "Pro Volleyball" 
    public string URI {get;set;} // i.e. - "/sports/pro/volleyball" which is the MVC path 
    public List<CategoryItem> Items {get;set;} 
} 

public class CategoryItem 
{ 
    public string Content {get;set;} 
    public List<string> Comments {get;set;} 
} 

var vballCat = new Category(); 
vballCat.FriendlyName = "Pro Volleyball"; 
vballCat.URI = "/sports/pro/volleyball/"; // equivalent to the MVC route 

var catItem = new CategoryItem(). 
catItem.Content = "Who is the best male pro volleyball player?"; 
catItem.Comments.Add("Misty May"); 
catItem.Comments.Add("Some Guy 1"); 
vballCat.Items.Add(catItem); 

ravenSession.Store(vballCat); 
ravenSession.SaveChanges(); 

..... maintenant une fois que je tire le chat-à-dire primaire - «/sports/pro/volley-ball/»J'ai tout ce que je dois déjà il

var items = session.Query<Category>() 
       .Where(x => x.URI == "/sports/pro/volleyball/"); 

{............. etc ............... }

Maintenant, je peux juste itérer à travers la collection d'articles et c'est collection de commentaires .... est-ce que cela utilise le chargement impatient? Que faire si j'ai eu un million de commentaires sous un item de catégorie? Quand je charge la catégorie principale, est-ce qu'elle charge tous les commentaires d'un million?!?

J'apprécierais toute aide que vous pouvez fournir. Désolé si cet exemple/question n'est pas clair ... Je vais essayer de clarifier quelque chose si vous en avez besoin. Merci encore!

Répondre

2

La réponse est que cela dépend de la taille de vos données et de votre scénario d'utilisation. Le premier exemple est utile si vous avez un grand nombre d'éléments et souhaitez accéder à des catégories sans ses éléments. Le second exemple est utile si vous accédez habituellement à la catégorie avec ses éléments, et la taille des éléments est limitée (notez que limité est encore élevé, plusieurs milliers ne me feraient pas cligner des yeux). Notez qu'il n'y a pas de chargement passionné/paresseux dans RavenDB, vous parlez d'un seul document par rapport à plusieurs documents, pas de relations entre les documents. Le document entier est chargé lorsque vous en avez besoin. Une autre chose à retenir est qu'il est généralement plus rapide d'interroger par identifiant que d'interroger. Cela signifie que si vous avez des identifiants qui ressemblent déjà beaucoup à des identifiants de documents, vous pouvez aussi leur donner les identifiants de document.

+0

Ok, c'est logique. Donc, dans le deuxième exemple, disons que j'ai une catégorie avec 500 éléments chacun avec 500 - 1000 commentaires, ce qui représente un total de 250k - 500k ...Qu'est-ce que tu penses? Utilisez la première option? – bbqchickenrobot

Questions connexes