Как моделировать такие структуры, как семейные деревья, в базах данных документов

Я изучал базы данных документов, в частности RavenDb, и все примеры ясны и понятны. Я просто не могу найти ни одного примера, где бы мы заранее не знали, сколько уровней имеет данная структура. В качестве примера, как бы вы сохранили генеалогическое древо, учитывая следующий класс:

public class Person{
     public string Name {get;set;} 

     public Person Parent {get;set;}
     public Person[] Children {get;set;}
}

В большинстве примеров, которые я видел, мы ищем совокупный корень и превращаем его в документ. Просто здесь не так очевидно, что такое совокупный корень и граница.


person Rune Hammerskov    schedule 20.06.2010    source источник
comment
Руна, пожалуйста, отметьте ответ как принятый, если это возможно.   -  person Peter    schedule 21.09.2010


Ответы (2)


Я предполагаю, что для RavenDb вам нужно будет сохранить идентификаторы в своем объекте:

public class Person {
    public string Name { get; set; }
    public string ParentId { get; set; }
    public string[] ChildrenIds { get; set; }
}

Проверьте эту страницу, особенно внизу, для получения дополнительной информации: http://ravendb.net/documentation/docs-document-design

person Peter    schedule 21.06.2010
comment
Верно, это тоже была моя первая склонность. Но, как говорится, это в некотором смысле противоречит основным идеям, лежащим в основе баз данных документов. Запрос данных, смоделированных таким образом, может быть очень медленным по сравнению с более агрегированными документами. Я ищу менее очевидные стратегии. - person Rune Hammerskov; 22.06.2010
comment
Я разместил это в группе Google RavenDb (groups.google.com/group/ravendb /browse_thread/thread/). Я ожидаю, что вы должны получить ответ в ближайшее время. - person Peter; 23.06.2010
comment
Я думаю, это частично зависит от того, что вы считаете своим совокупным корнем. Например, является ли обычная операция вытягиванием конкретного человека и всех его потомков до определенного уровня, т.е. до 3 поколений? Если это так, вы можете сохранить это как свой документ. Общий принцип RavenDB заключается в том, что запись стоит дорого, а чтение дешево. Таким образом, документ должен стоять сам по себе. - person Matt Warren; 23.06.2010

Айенде только что опубликовал сообщение в блоге, который отвечает на это.

person Matt Warren    schedule 23.06.2010
comment
Только что видел это в RSS-канале :) Решение денормализации данных требует, чтобы вы точно знали, что вам нужно везде в вашем пользовательском интерфейсе, но я думаю, что для большинства сценариев я бы использовал именно этот метод. - person Rune Hammerskov; 24.06.2010
comment
Да, хороший момент, но я думаю, что понимание этой части является основным отличием RavenBD от RDMS. Кроме того, вы можете использовать индексы, чтобы сидеть поверх документов, чтобы вытащить другие представления. - person Matt Warren; 25.06.2010
comment
Чтобы упростить любые обновления, вы можете использовать операции на основе наборов (см. groups.google. com/group/ravendb/browse_thread/thread/), поэтому вы можете использовать индекс для непосредственного обновления документов, а не извлекать их с сервера, модифицировать и отправлять обратно. Также вы можете ИСПРАВИТЬ документы, см. http://www.ravendb.net/documentation/docs-http-api-patch. - person Matt Warren; 25.06.2010