2011-06-02 54 views
3

想知道如何一些更有經驗(或者用一個更好的想法比我的人)將解決我的特殊造型的場景......建模質疑RavenDB(或其他文檔面向數據庫)

我有一個典型的「類別 - >子類 - > TertiarySubCategory「的情況下,我不知道我是否正確地映射出來。我將這個直接映射到MVC路由,因爲烏鴉似乎很適合這個。在最後一個類別(可以是第一,第二或第三級別)下,會有一個與只有該級別的項目相關聯的項目列表。因此,我們可能會有這樣的內容:

單級別類別:'/政治/」

第二級類別: '政治/人' 或「政治/網站的

三級別分類:體育版/專業版/排球'或 '體育/大學/足球'

在傳統的RDBMS中,通過主鍵/外鍵+幾個連接很容易...所以,想知道我將如何處理Raven?

從我讀過的內容中,我應該將整個'體育/職業/排球'URI或鑰匙存儲在它的項目列表中?

即 -

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/"); 

或者我應該創建實際的類類的列表項成員?每個項目將有它自己的評論列表...這意味着一切都存儲在其中烏鴉在一個文檔中 - 即 -

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(); 

.....現在我一次拉一次貓即 - 「/運動/親/排球/「我擁有我需要的一切

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

{.............等............... }

現在,我可以迭代Items集合,它是註釋的集合....這是否使用急切的加載?如果我在一個類別項目下有一百萬條評論,該怎麼辦?當我加載主類別時,它也會加載所有100萬條評論!?!?

我希望你能提供任何幫助。對不起,如果這個例子/問題不清楚......如果你們需要的話,我會試着澄清一下。再次感謝!

回答

2

答案是它取決於您的數據大小和您的使用情況。 如果您有大量項目並且想要訪問沒有項目的類別,第一個示例很有用。 如果您通常使用其項目訪問類別,並且項目大小有限(請注意,限制仍然很高,幾千個不會導致我眨眼),第二個示例非常有用。 請注意,在RavenDB中沒有這樣的事情,您正在談論單個文檔與多個文檔,而不是文檔之間的關係。整個文檔在您需要時加載。

要記住的另一件事是,通過id查詢通常比查詢快。這意味着,如果您的ID已經看起來非常像Document ID,那麼您最好讓它們成爲文檔ID。

+0

好的,有道理。因此,在第二個例子中,假設我有一個500個項目的類別,每個項目有500 - 1000個註釋,總計爲250k - 500k ...你怎麼看?使用第一個選項? – bbqchickenrobot 2011-06-02 21:40:12