php mongodb lookup,mongodb的关联查询$lookup

使用MongoDB的第一件事情就是忘掉关系模型,充分利用反范式、冗余来达成最高的读写效率。你已经发现了现在的数据模型不好用,为什么不换个思路来解决问题?

决定数据模型的是你需要怎么使用这些数据。在不知道你打算怎么用这些数据的前提下,以下是一些按照常理的推测。

现在涉及的实体有3个:

teacher

student

class

其中:

teacher:class = 1:n

class:student = 1:n

对于1:n的情况,最常见的做法是把1冗余到n。比如学生可以是:

{

_id:ObjectId(123456789...),

name:'zhangsan',

age:20,

class: {

classId: ObjectId(123456789...),

number:10,

// 其他常用字段

}

}

当然你也可以不要class的详细信息,毕竟一个班的学生只用查一次班级信息。

{

_id:ObjectId(123456789...),

name:'zhangsan',

age:20,

classId: ObjectId(123456789...)

}

用的时候是不是会方便一些?

没错,冗余有可能会造成数据不一致,但是你真的会这么在乎一致性吗?通常的回答是不会。

比如如果班级信息如果要修改怎么办?那就会造成每个学生的班级信息都更新一遍,修改时压力会比较大操作比较复杂。但是别忘了你的系统大部分压力是来自读而不是写。班级修改的概率有多大?可能几个月不见得有一次。但是读班级的概率有多大?可能每天就有好多次。比较一下孰轻孰重不言而喻。

综上,使用MongoDB时不要用范式来约束自己,从性能,易用性来考虑就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值