Миграция БД SQL Server в MongoDB
Я хочу перенести все функции и функции БД SQL Server в БД Mongo, но я застрял с концепцией внешнего ключа, я знаю, что нет концепции Foreign Key в NoSQL Dbs, но я хочу подключить и сохранить таблицы, как показано ниже, Пожалуйста, поделитесь своими мыслями и идеями, как этого добиться. У меня есть три таблицы с именами AR_Cities, AR_Flights и AR_FlightAvail в SQL Server, которые мне нужно перенести и сохранить в Mongo DB. Как хранить эти данные с помощью концепции внешнего ключа / структуры нормализованной таблицы.
Пожалуйста, предложите свои идеи,
2 ответа
Самый эффективный способ сохранить это в виде двух отдельных таблиц, было бы плохой идеей вложить информацию о городе в полет, что может вызвать массовое дублирование информации, создание проблемных областей для обновления и т. Д.
В отличие от связанного вопроса @Maksym, я бы НЕ сказал, что нормализация не рекомендуется, так как поощряется встраивание самодостаточных родительских данных, таких как многие-многие идентификаторы отношений.
В качестве примера хорошего способа хранения отношений можно использовать только ObjectIds вместо более сформированной версии DBRef. Так, например, рейсы, которые посещают 5 городов в пути, будут выглядеть так:
{
_id: ObjectId,
cities: [
ObjectId(),
ObjectId(),
ObjectId(),
ObjectId(),
ObjectId()
]
}
Конечно, ваш документ может выглядеть немного более сложным, потому что вам, вероятно, нужно также рассчитать время посадки и статус (задержан / отменен и т. Д.), Однако, это показывает основную концепцию. В вашем приложении вы будете принимать _id
s из городских документов и добавить затем к записи полета. Таким образом, вы можете получить все города на этот рейс, как:
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 здесь.
Также обратите внимание, что концепция БД не поддерживает какую-либо целостность, такую как внешний ключ, это просто способ ссылки на другой объект.
Надеюсь, поможет!