1

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

请提出您的想法,

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

航空公司表的图像

4

2 回答 2

1

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

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

存储关系的一个好方法是仅使用 ObjectIds 而不是 DBRefs 的更正式版本。因此,作为一个例子,在途中访问 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对所有相关的城市/航班信息进行范围查询。

于 2013-09-20T09:01:00.090 回答
0

我也是 MongoDB 的新手,起初我发现很难以面向文档的方式思考。当我想到同样的问题时,我做了一些谷歌搜索,发现 Mongo 中有一个 DBRef 的概念。因此,您可以使用它来参考其他文档,尽管它可能会降低性能。顺便说一句,这些问题可能与MongoDB 规范化、外键和加入有关,因此您也可以在那里找到更多信息。您还可以在此处了解有关 Mongo 数据库参考的更多信息。

另请注意,数据库概念不支持任何完整性,如外键,它只是引用另一个对象的一种方式。

希望能帮助到你!

于 2013-09-20T08:35:31.760 回答