我想将SQL Server数据库的所有特性和功能迁移到Mongo DB,但是我坚持使用外键概念,我知道NoSQL Dbs中没有Concept ForeignKey,但我想连接并将表存储为如下所示,请分享您的想法和想法如何实现这一目标。我在SQL Server中有三个名为 AR_Cities,AR_Flights 和 AR_FlightAvail 的表,我需要迁移并存储到MongoDB,如何使用外键概念/规范化表结构存储这些数据
请建议您的想法,
图片网址: - http://i.stack.imgur.com/nezP0.png
答案 0 :(得分:1)
最有效的存储方式是两个单独的表格,将城市信息嵌入到航班中是一个坏主意,这可能会导致大量重复的信息,从而产生更新等问题的毛球。
与@Maksym的链接问题不同,我不鼓励不鼓励规范化,而是鼓励嵌入包含父数据的自包含,例如许多关系id。
作为存储关系的好方法的一个示例是仅使用ObjectIds而不是更复杂的DBRef版本。因此,作为一个例子,在途中访问5个城市的航班将如下所示:
{
_id: ObjectId,
cities: [
ObjectId(),
ObjectId(),
ObjectId(),
ObjectId(),
ObjectId()
]
}
当然,您的文档可能看起来有点复杂,因为您可能也需要估计着陆时间和状态(延迟/取消等),但是,这显示了基本概念。在您的申请中,您将获取城市文件的_id
个,然后添加到航班记录中。通过这种方式,您可以获得该航班的所有城市:
var d=db.flights.findOne({_id:ObjectId()});
var cities=db.cities.find({_id:{$in:d.cities}});
这将在非常基本的意义上给你你的关系。
至于关系持有,MongoDB本身没有。 DBRef不是服务器端解析关系。这是你必须在你的应用程序中手动处理的东西,但是,我不认为你需要在这个系统中进行级联删除等,航班永久存储,城市数据可以重复使用多次。
因此,这个系统实际上并不需要查找JOIN,这在应用程序本身中很容易使用每个相关记录的延迟加载,对所有关联的城市进行远程$in
查询/航班信息。
答案 1 :(得分:0)
我也是MongoDB的新手,我发现很难以文档为导向思考。当我想到同样的问题时,我做了一些谷歌搜索,发现在Mongo中有一个DBRef的概念。因此,您可以使用它来引用其他文档,尽管它可能会降低性能。顺便说一下,这个问题可能是这个问题的重复MongoDB normalization, foreign key and joining所以你也可以在那里找到更多的信息。您还可以了解有关Mongo数据库参考here的更多信息。
另请注意,DB概念不支持外键等任何完整性,它只是一种引用另一个对象的方法。
希望它有所帮助!