Миграция БД SQL Server в MongoDB

Я хочу перенести все функции и функции БД SQL Server в БД Mongo, но я застрял с концепцией внешнего ключа, я знаю, что нет концепции Foreign Key в NoSQL Dbs, но я хочу подключить и сохранить таблицы, как показано ниже, Пожалуйста, поделитесь своими мыслями и идеями, как этого добиться. У меня есть три таблицы с именами AR_Cities, AR_Flights и AR_FlightAvail в SQL Server, которые мне нужно перенести и сохранить в Mongo DB. Как хранить эти данные с помощью концепции внешнего ключа / структуры нормализованной таблицы.

Пожалуйста, предложите свои идеи,

URL изображения:-

Изображение для таблиц авиакомпании

2 ответа

Решение

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

В отличие от связанного вопроса @Maksym, я бы НЕ сказал, что нормализация не рекомендуется, так как поощряется встраивание самодостаточных родительских данных, таких как многие-многие идентификаторы отношений.

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

{
    _id: ObjectId,
    cities: [
        ObjectId(),
        ObjectId(),
        ObjectId(),
        ObjectId(),
        ObjectId()
    ]
}

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

var d=db.flights.findOne({_id:ObjectId()});
var cities=db.cities.find({_id:{$in:d.cities}});

Это даст вам ваши отношения в очень простом смысле.

Что касается удержания отношений, то в самом MongoDB его нет. DBRef не является разрешенным отношением на стороне сервера. Это то, что вам придется обрабатывать вручную в вашем приложении, однако, я не думаю, что вам понадобятся каскадные удаления и т. Д. В этой системе, рейсы сохраняются навсегда, а городские данные многократно используются повторно.

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

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

Также обратите внимание, что концепция БД не поддерживает какую-либо целостность, такую ​​как внешний ключ, это просто способ ссылки на другой объект.

Надеюсь, поможет!

Другие вопросы по тегам