MongoDB建模 - 如何使用非规范化模型实现这一目标?

时间:2012-06-29 18:20:18

标签: mongodb denormalization database nosql

假设我有10,000门课程名称。注册各种课程的100,000名用户。我的用户数据模型将包含类似......

的内容
course: [
{courseName: 'Programming 101',
cost: 0
},
{courseName: 'How to use stackoverflow',
cost: 100
}
 ]

但如果我想更改课程名称,则需要我更新已经分配了该课程的数千个用户记录。实现这一目标的最佳方法是什么?有两个表的两个查询?这是nosql环境的弱点,或者这样做的有效方法是什么?

3 个答案:

答案 0 :(得分:2)

基本上你有两个选择:

  1. 从用户记录中引用课程ID而不是名称本身,然后进行客户端连接。
  2. 继续与学生一起存储完整的课程名称,并在需要时更新这些字段。
  3. 这实际上取决于您尝试针对您选择的系统优化系统。如果你每学期最终只更改十几个课程名称,那么选项2可能不会成为问题。

    另外,回答你关于这是nosql系统的弱点的问题,是的,这绝对是一个弱点。这完全不是像Mongo试图解决的nosql系统那样的问题。 Mongo对于某些问题很有用,但对其他问题则非常糟糕。我想说保留一个课程和学生数据库并不是Mongo的强项之一。这是一个典型的关系数据模型,因此在Mongo中管理比在经典RDBMS中管理更麻烦。

答案 1 :(得分:1)

实际上,我会反过来做。用户名称不会经常更改。

最好让用户参加该课程并说“嘿!我的名字错了,你能改变吗?”如果您有不同的班级名称,那么用户将无法找到您的班级。

这就是我要做的事情:

courses: [
  { coursename: 'Programming 101',
    cost: 0,
    registered: [
      {id: 11, name: 'John Doe'},
      {id: 12, name: 'Lumber Jack'}
    ]
  }
]

答案 2 :(得分:0)

10,000个课程,100,000个用户,然后可以使用RDBMS。如果你有100,000所大学,每个拥有10万用户(总共100亿用户),你可能需要noSql ....如果是这样的话,playOrm允许你在那种情况下很容易地进行连接,因为你可以按大学划分(两个表)然后你可以简单地加入“universityA分区的课程”和“universityA分区的用户”。嗯,这是一种方法。