最有效的存储方式是将其存储为两个单独的表,将城市信息嵌套到航班中是一个坏主意,这可能会导致大量重复信息,从而产生更新等问题。
与@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
对所有相关的城市/航班信息进行范围查询。