Драйвер MongoDB C # - сериализация ссылок POCO?

В настоящее время я изучаю MongoDB. Насколько я понимаю, официальный драйвер C # может выполнять сериализацию и десериализацию POCO. Я еще не нашел информации о том, как сериализуется ссылка между двумя объектами. [Я говорю о чем-то, что было бы представлено как два отдельных документа со ссылками ID, а не встроенными документами.

Может ли механизм сериализации справиться с подобной ситуацией? (1):

class Thing {
    Guid Id {get; set;}
    string Name {get; set;}
    Thing RelatedThing {get; set;}
}

Или мы должны пожертвовать ООП и сделать что-то подобное? (2):

class Thing {
    Guid Id {get; set;}
    string Name {get; set;}
    Guid RelatedThing_ID {get; set;}
}

ОБНОВЛЕНИЕ:

Тогда еще пара связанных вопросов ...

а) Если сериализатор может справиться с ситуацией (1). Каков пример того, как это сделать без использования встраивания?

б) При использовании встраивания можно ли будет запрашивать все «Вещи», независимо от того, являются ли они «родительскими» или встроенными элементами? Как бы выглядел такой запрос?


person UpTheCreek    schedule 01.07.2011    source источник


Ответы (4)


Драйвер C # может обрабатывать сериализацию класса, содержащего ссылку на другой экземпляр самого себя (1). Тем не мение:

  1. Как вы уже догадались, он будет использовать встраивание для представления этого
  2. В графе объекта не должно быть круговых путей, иначе произойдет переполнение стека.

Если вы хотите сохранить его как отдельные документы, вам придется использовать второй класс (2) и выполнять несколько вставок.

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

https://docs.mongodb.com/manual/applications/data-models-tree-structures/

person Robert Stam    schedule 06.07.2011

Да, это вполне возможно.

Одна вещь, которую вы должны понимать о MongoDB и большинстве решений NoSQL, - это то, что объекты могут содержаться в других объектах. В случае MongoDB, по сути, если вы можете создать объект в JSON, то вы можете создать объект в MongoDB.

В общем, вы должны стремиться иметь "относительно" денормализованную структуру базы данных. Немного дублированных данных - это нормально, если вы не обновляете их часто.

person Earlz    schedule 01.07.2011


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

class Thing {
string Id {get; set;}
string Name {get; set;}
string RelatedThing {get; set;}}

Итак, упрощая, если бы Id был чем-то вроде "T00001" (или действительно T + GUID), вы могли бы легко получить набор вещей из Mongo запрашивает что-то вроде Id, начинается с T и настраивает объекты для них всех (или только для подмножества, которое, как вы знаете, содержит вашу ссылку, если это очень большой набор).

Вы знаете / ожидаете, что RelatedThing будет Thing, но это будет просто строка, когда она вернется из Mongo. Но если вы настроили объекты, как указано выше, вы могли бы эффективно использовать строку, как если бы это была ссылка на объект (в конце концов, это то, чем она является на самом деле, сделанная как бы «вручную»).

Это «свободный» способ сделать это, но, возможно, вам подойдет.

Может ли кто-нибудь увидеть в этом подходе какие-то подводные камни?

person FrugalTPH    schedule 13.11.2013