我想将 SQL Server DB 的所有特性和功能迁移到 Mongo DB,但我被外键概念卡住了,我知道 NoSQL Dbs 中没有概念外键,但我想连接和存储表,如下所示,请分享您的想法和想法如何实现这一目标。我在 SQL Server 中有三个名为AR_Cities、AR_Flights和AR_FlightAvail的表,我需要迁移并存储到 MongoDB,如何使用外键概念/规范化表结构存储这些数据。
请提出您的想法,
我想将 SQL Server DB 的所有特性和功能迁移到 Mongo DB,但我被外键概念卡住了,我知道 NoSQL Dbs 中没有概念外键,但我想连接和存储表,如下所示,请分享您的想法和想法如何实现这一目标。我在 SQL Server 中有三个名为AR_Cities、AR_Flights和AR_FlightAvail的表,我需要迁移并存储到 MongoDB,如何使用外键概念/规范化表结构存储这些数据。
请提出您的想法,
最有效的存储方式是将其存储为两个单独的表,将城市信息嵌套到航班中是一个坏主意,这可能会导致大量重复信息,从而产生更新等问题。
与@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
对所有相关的城市/航班信息进行范围查询。
我也是 MongoDB 的新手,起初我发现很难以面向文档的方式思考。当我想到同样的问题时,我做了一些谷歌搜索,发现 Mongo 中有一个 DBRef 的概念。因此,您可以使用它来参考其他文档,尽管它可能会降低性能。顺便说一句,这些问题可能与MongoDB 规范化、外键和加入有关,因此您也可以在那里找到更多信息。您还可以在此处了解有关 Mongo 数据库参考的更多信息。
另请注意,数据库概念不支持任何完整性,如外键,它只是引用另一个对象的一种方式。
希望能帮助到你!