Вопрос по моделированию для RavenDB (или других doc-ориентированных баз данных) - PullRequest
3 голосов
/ 02 июня 2011

Интересно, как некоторые из более опытных (или кто-то с лучшей идеей, чем у меня) будут решать мой конкретный сценарий моделирования ...

У меня есть типичный сценарий "Категория -> Подкатегория -> TertiarySubCategory"и я не уверен, правильно ли я это планирую.Я сопоставляю это непосредственно с маршрутом MVC, так как ворон, кажется, вполне подойдет для этого.В последней категории (которая может быть на первом, 2-м или 3-м уровнях будет список элементов, связанных только с этим уровнем категории. Таким образом, мы можем иметь что-то вроде:

Категория одного уровня:'/ Политика /'

Категория второго уровня: «Политика / Люди» или «Политика / Веб-сайты»

Категория трехуровневая: «Спорт / Pro / волейбол» или «Спорт / колледж /»Футбол '

В традиционной СУБД это легко сделать с помощью первичных / внешних ключей + нескольких соединений ... так что, интересно, как бы я справился с 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/");

Или мне следует создать элемент списка элементов спискаФактический класс категории? Каждый элемент будет иметь список своих собственных комментариев ... это означает, что все хранится в одном документе в Raven - то есть -

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

..... теперь, когда я вытащу основной котт.е. - "/ спорт / про / волейбол /" у меня всеg Мне нужно уже под ним

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

{............. и т. д. ...............}

Теперь здесь я могу просто перебрать коллекцию Предметов и ее коллекцию комментариев .... Использует ли это нетерпеливую загрузку?Что если бы у меня было миллион комментариев под одной категорией?Когда я загружу основную категорию, она также загрузит все миллион комментариев!?!?

Буду признателен за любую помощь, которую вы можете оказать.Извините, если этот пример / вопрос неясен ... Я постараюсь уточнить что-нибудь, если вам это нужно.Еще раз спасибо!

1 Ответ

2 голосов
/ 03 июня 2011

Ответ в том, что это зависит от размера ваших данных и вашего сценария использования. Первый пример полезен, если у вас есть большое количество элементов и вы хотите получить доступ к категориям без их элементов. Второй пример полезен, если вы обычно получаете доступ к категории с ее элементами, а размер элементов ограничен (обратите внимание, что ограничение все еще велико, несколько тысяч не заставят меня моргнуть). Заметьте, что в RavenDB нет такой вещи, как рвение / отложенная загрузка, вы говорите об одном документе против нескольких документов, а не об отношениях между документами. Весь документ загружается, когда вам это нужно.

Еще одна вещь, которую нужно помнить, это то, что запрос по идентификатору обычно быстрее, чем запрос. Это означает, что если у вас есть идентификаторы, которые уже очень похожи на идентификаторы документов, вы также можете СДЕЛАТЬ им идентификаторы документов.

...