【问题标题】:Migrate SQL Server DB to MongoDB将 SQL Server 数据库迁移到 MongoDB
【发布时间】:2013-09-25 12:40:59
【问题描述】:

我想将 SQL Server DB 的所有特性和功能迁移到 Mongo DB,但我被外键概念卡住了,我知道 NoSQL Dbs 中没有概念外键,但我想连接表并将表存储为如下所示,请分享您的想法和想法如何实现这一目标。我在 SQL Server 中有三个名为 AR_Cities、AR_FlightsAR_FlightAvail 的表我需要迁移并存储到 MongoDB,如何使用外键概念/规范化表结构存储这些数据.

请提出您的想法,

图片网址:-https://i.stack.imgur.com/nezP0.png

【问题讨论】:

    标签: sql-server mongodb mongo-collection nosql


    【解决方案1】:

    最有效的存储方式是将其存储为两个单独的表,将城市信息嵌套到航班中是个坏主意,这可能会导致大量重复信息,从而导致更新等问题的毛球。

    与@Maksym 的链接问题不同,我不会说不鼓励规范化,而是鼓励嵌入自包含父数据,例如多对多关系ID。

    存储关系的一个好方法是仅使用 ObjectIds 而不是 DBRefs 的更正式版本。因此,例如,一个在途中访问 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 查询.

    【讨论】:

    • 那么你想让我在没有任何 dbref 的情况下将数据提供到单独的表中吗?
    • @AkshayJoy 是的,使用对象 ID 字段而不是它们更小
    • 我没有得到对象ID的信息,如果你不介意你可以用示例结构编辑答案
    • 你说,我们不需要为这个 MongoDB 表单独的 CityId 对吧。?
    • @AkshayJoy 哦,你会的,我只是说你不应该使用 dbref,所以你有两个集合,有两个单独的 _id,一个是 cityId,另一个是 flightId
    【解决方案2】:

    我也是 MongoDB 的新手,起初我发现很难以面向文档的方式进行思考。当我想到同样的问题时,我做了一些谷歌搜索,发现 Mongo 中有一个 DBRef 的概念。因此,您可以使用它来参考其他文档,尽管它可能会降低性能。顺便说一句,这些问题可能与这个MongoDB normalization, foreign key and joining 重复,所以你也可以在那里找到更多信息。您还可以了解有关 Mongo 数据库参考的更多信息here

    另外请注意,DB 概念不支持像外键这样的完整性,它只是一种引用另一个对象的方式。

    希望对你有帮助!

    【讨论】:

    • 正如你所说的 DBref 导致性能,但告诉我实现这一目标的有效方法,
    • 最有效的方法是将所有数据存储在文档中,但在这种情况下,您的 AR_Flights 集合中将有多个 AR_Cities 副本,这在您的情况下可能不可接受。所以想想什么对你的项目更重要。此外,如果您真的需要所有这些关系人员,也许您不应该将其迁移到 Mongo 或至少保持原样,让 Mongo 仅用于一些您可以真正从 Mongo 中受益的特定数据
    猜你喜欢
    • 2017-09-07
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2017-02-10
    • 2018-08-01
    • 2023-03-05
    相关资源
    最近更新 更多