Драйвер MongoDb С# поддерживает циклические ссылки?

Я рассматривал перенос небольшого побочного проекта для использования Mongo, так как использование Nhibernate для текущего сценария становилось все более и более трудоемким.

Сначала я попробовал NoRM, и у него была ветка, которая поддерживала циклические ссылки и работала нормально, однако я не могу найти никакой документации, указывающей, поддерживает ли ее официальный драйвер С#.

Ситуация и почему у меня есть циклическая ссылка, потому что у меня есть объект местоположения, который содержит список дорог, каждая дорога имеет ссылку на другое местоположение. Это очень похоже на простой набор узлов в навигаторе.

public class Location
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Road> Roads { get; set; }
}

public class Road
{
    public Location From { get; set; }
    public Location To { get; set; }
}

Теперь проблема в том, что у меня есть целый мир, построенный из этих объектов (у них больше свойств в реальном сценарии), и все они взаимосвязаны, однако, не имея возможности обрабатывать циклические ссылки, я не уверен, как я могу решить эту проблему, поскольку каждая дорога должна знать начальную и конечную точки.

Я знаю, что один компромисс состоит в том, чтобы просто избавиться от объекта местоположения и вместо этого иметь идентификатор, который ссылается на местоположение, но тогда мне нужно запрашивать каждое подместоположение по отдельности. Это делается только один раз, а затем сохраняется в памяти, так как есть огромная карта, содержащая все возможные местоположения и все возможные маршруты, поэтому между точками можно найти быстрые пути.

Возможно, расположение и дороги не подходят для хранения документов и могут храниться другим способом...


person Grofit    schedule 11.11.2011    source источник


Ответы (1)


Официальный драйвер С# вообще не поддерживает «ссылки». Значением поля может быть ObjectID, но концепция соединений или ссылок на самом деле не реализована в официальном драйвере C#.

Конечно, даже при «справочной» поддержке эти драйверы все равно будут выполнять несколько запросов.

Возможно, расположение и дороги не подходят для хранения документов и могут храниться другим способом...

Учитывая случаи, которые вы описали, я бы предложил взглянуть на базу данных графов. Есть несколько популярных, включая Neo4J, Trinity, sones' GraphDB и множество других.

person Gates VP    schedule 13.11.2011
comment
Спасибо за информацию. Будет ли это выполнять несколько драйверов на сервере и просто возвращать агрегированные результаты или фактически запускать отдельные запросы? Я думал, что это может быть первое, но у меня нет никаких фактических доказательств этого утверждения. Остальные объекты не являются циклическими и, кажется, идеально соответствуют идеалам хранения документов, но, поскольку этот случай начальной карты не соответствует, это может в конечном итоге нарушить сделку, или, как уже упоминалось, я просто храню этот бит реляционно, а другие биты на основе документа - person Grofit; 14.11.2011
comment
Это должно быть на стороне клиента, поскольку нет команды соединения на стороне сервера. Взгляните на базу данных графов, поскольку я понимаю, что они поддерживают различное базовое хранилище, поэтому вы можете получить все, что вам нужно. - person Gates VP; 15.11.2011