Mongodb实战(1)
我们知道Mongodb是不支持事务操作的,而传统的关系数据库中多表的事务处理是很平常的事,因此在从关系数据库向mongodb的转换过程中就需要转换思路,重新设计你的数据模型。现有一个项目,需求是对内部局域网里的计算机进行管理,实现对主机的监控和日常操作的审计。项目组刚开始选择的数据库是mongodb,但在设计数据模型时,还是按照传统的关系数据库的思维方式,结果就遇到了多个collection的原子更新问题。例如,有两个collection——部门collection、主机collection,要求在删除部门时同步删除部门里的所有主机,这在关系数据库中使用事务很容易实现,但在mongodb里则不行。项目组遇到了很多这样的问题后,只好又改回了使用关系数据库。那mongodb能否支持原子操作呢?
Mongodb是一种文档型数据库,document里可以存储任何类型的数据,甚至可以存储嵌套的document,因此我们可以把部门和主机放到一个collection里,这样就不会有多个collection的原子更新问题。例如,我们可以这样设计部门collection:
{
DepartmentId : “1”,
DepartmentName : “dep1”,
Host:
[
{
HostId : “1”,
HostName : “host1”
},
{
HostId : “2”,
HostName : “host2”
}
]
}
在部门collection的document里建立一个host field,这个field是数组类型的,数组中放置主机信息document,可以放置任意多个这样的主机,这样删除一个部门就能同步删除部门里的所有主机,实现了原子操作。可以看出关系数据库里是把主-详细信息分别放到两个表里,而mongodb的思路是放到一个collection里。
至于如何对数组里的数据进行增、删、改、查,我会在后续的博客里结合图客网的实际使用情况进行详细讲解。