Nano Hash - криптовалюты, майнинг, программирование

Коллекции Mongo без схемы и C#

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

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

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

Изменить: стоит отметить, что эти проблемы, очевидно, существуют и в реляционных базах данных, но я специально прошу стратегии по смягчению проблемы с использованием баз данных без схемы и, в частности, Mongo. Спасибо!


  • Хороший вопрос. Я думаю, что это скорее проблема со строго типизированными языками, такими как C#, где любое изменение модели нарушит сопоставление между существующими документами и классом модели. В более динамичных языках, таких как Python, вы можете обращаться с каждым документом скорее как с набором свойств, который действительно не имеет схемы. Затем вы можете проверить наличие определенных атрибутов (которые можно добавить или удалить в любое время). Возможно, использование ключевого слова C# dynamic и ExpandoObjects — это то, что нужно. Очевидно, что ваш код по-прежнему должен будет обрабатывать изменения, внесенные в схему с течением времени, но он будет более гибким. 02.09.2011
  • Отличная идея. Я как бы удалил динамическое ключевое слово, которое используется для утиного набора текста, но я думаю, что здесь есть несколько очень интересных применений. После небольшого поиска: (scottw.com/mongodb-dynamics) я посмотрю на это еще немного. 02.09.2011
  • Вот почему я люблю stackoverflow. 13 просмотров и уже два отличных предложения! 02.09.2011

Ответы:


1

Миграция схемы с помощью MongoDB на самом деле намного менее болезненна, чем, скажем, с SQL-сервером.

Добавить новое поле легко, старые записи будут поступать с нулевым значением, или вы можете использовать атрибуты для управления значением по умолчанию [BsonDefaultValue("abc", SerializeDefaultValue = false)]

Атрибут [BsonIgnoreIfNull] также удобен для исключения объектов, которые имеют значение null, из документа при его сериализации.

Удалить поле также довольно просто, вы можете использовать [BSonExtraElements] (см. документы), чтобы собрать и сохранить их, или вы можете использовать [BsonIgnoreExtraElements], чтобы просто выбросить их.

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


PS, поскольку вы также заинтересованы в использовании динамического с Mongo, вот experiment Я пробовал в этом направлении. А вот обновленный пост с полным сериализатором. и десериализатор для динамических объектов.

02.09.2011
  • Спасибо за предложения. Я бы предпочел не засорять свою модель домена специфическими атрибутами Mongo, но, похоже, я также могу использовать эту функцию в ClassMap. Я посмотрю на это еще немного. Сейчас все более болезненно, потому что я нахожусь на ранней стадии разработки, и мой домен намного более изменчив, чем обычно. На данный момент я просто удаляю коллекции, так как это проще, чем иметь дело с несоответствием схемы. 02.09.2011
  • Это правильно - вы можете либо использовать атрибуты, либо, если вы предпочитаете, чтобы ваши классы были "чистыми POCO", у драйвера также есть карты классов. 02.09.2011
  • Карты классов были бесценны, так что обязательно взгляните на них. Возможность регистрировать генераторы ключей\идентификаторов на уровне драйвера и вообще не размечать свою модель также бесценна, если вы не хотите привязываться к ключам string\guid. 09.09.2011
  • @TimothyStrimple Я поделился вашим сочувствием по поводу того, что не хочу засорять мою модель домена специфическими атрибутами Mongo. Я много борюсь с этим, в конце концов я сдался, потому что специфические атрибуты монго делают его очень гибким и простым в использовании. 06.10.2011
  • @atbebtg Мне удалось сделать это без использования атрибутов Mongo для объектов моего домена. Я использовал функциональность BsonClassMap, чтобы добавить детали в репозиторий. mongodb.org/display/DOCS/ 06.10.2011
  • @TimothyStrimple Я проверю это. Спасибо, удачи 06.10.2011
  • Я думаю, вам нужно добавить поле для каждого документа, если вы ищете по этому полю? 21.01.2012

  • 2

    Моя текущая мысль по этому поводу состоит в том, чтобы использовать ту же реализацию, что и в реляционной базе данных. Иметь коллекцию версий базы данных, в которой хранится текущая версия базы данных.

    Мои репозитории будут иметь минимальную требуемую версию, необходимую для точной сериализации и десериализации элементов коллекций. Если текущая версия БД ниже требуемой версии, я просто выбрасываю исключение. Затем используйте миграции, которые выполнят все преобразования, необходимые для обновления коллекций до требуемого состояния для десериализации и обновления номера версии базы данных.

    02.09.2011

    3

    В языках со статической типизацией, таких как C#, всякий раз, когда объект где-то сериализуется, затем изменяется его исходный класс, а затем он десериализуется обратно в новый класс, вы, вероятно, столкнетесь с проблемами где-то по ходу дела. Это довольно неизбежно, будь то MongoDB, WCF, XmlSerializer или что-то еще.

    Обычно у вас есть некоторая гибкость с параметрами сериализации, например с Mongo вы можете изменить имя свойства класса, но по-прежнему сопоставлять его значение с тем же именем поля (например, используя атрибут BsonElement). Или вы можете указать десериализатору игнорировать поля Mongo, у которых нет соответствующего свойства класса, используя атрибут BsonIgnoreExtraElements, поэтому удаление свойства не вызовет исключения, когда старое поле загружается из Mongo.

    Однако в целом для любых изменений структурной схемы вам, вероятно, потребуется перезагрузить данные или запустить сценарий миграции. Другой альтернативой является использование динамических переменных C#, хотя это на самом деле не решает основную проблему, вы просто получите меньше ошибок сериализации.

    02.09.2011

    4

    Я использую mongodb чуть больше года, хотя и не для очень больших проектов. Я использую csmongo от Hugo или форк здесь. Мне нравится динамический подход, который он вводит. Это особенно полезно для проектов, в которых структура базы данных изменчива.

    02.09.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..