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

MongoDB建模-如何使用非规范化模型实现这一点?,mongodb,denormalization,database,nosql,Mongodb,Denormalization,Database,Nosql,假设我有10000门课程,课程名称。还有10万用户报名参加各种课程。我的用户数据模型将包含以下内容 course: [ {courseName: 'Programming 101', cost: 0 }, {courseName: 'How to use stackoverflow', cost: 100 } ] 但是,如果我想更改课程名称,那就需要我更新已经分配了该课程的数千条用户记录。实现这一目标的最佳方式是什么?两个查询和两个表?这是nosql环境的一个弱点,还是这样做的有效方式?实际

假设我有10000门课程,课程名称。还有10万用户报名参加各种课程。我的用户数据模型将包含以下内容

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

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

实际上,我会做相反的事情。用户名不会经常更改

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

这就是我要做的:

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

事实上,我会做相反的事情。用户名不会经常更改

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

这就是我要做的:

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

基本上你有两个选择:

  • 从用户记录中引用课程id,而不是名称本身,然后执行客户端连接
  • 继续与学生一起存储完整的课程名称,并在需要时更新这些字段
  • 这实际上取决于您试图优化系统的内容,以及选择哪一个。如果你每学期只改变了十几个课程名称,选择2可能不会是个问题


    另外,要回答您关于这是nosql系统的一个弱点的问题,是的,这绝对是一个弱点。这根本不是像Mongo这样的nosql系统试图解决的问题类型。Mongo对某些问题很好,但对其他问题却很糟糕。我想说,保持课程和学生的数据库不是Mongo的强项之一。这是一个典型的关系数据模型,因此在Mongo中管理起来比在经典的RDBMS中更麻烦。

    基本上,您有两种选择:

  • 从用户记录中引用课程id,而不是名称本身,然后执行客户端连接
  • 继续与学生一起存储完整的课程名称,并在需要时更新这些字段
  • 这实际上取决于您试图优化系统的内容,以及选择哪一个。如果你每学期只改变了十几个课程名称,选择2可能不会是个问题


    另外,要回答您关于这是nosql系统的一个弱点的问题,是的,这绝对是一个弱点。这根本不是像Mongo这样的nosql系统试图解决的问题类型。Mongo对某些问题很好,但对其他问题却很糟糕。我想说,保持课程和学生的数据库不是Mongo的强项之一。这是一个典型的关系数据模型,因此在Mongo中管理起来比在经典的RDBMS中要麻烦得多。

    10000当然,100000用户,那么您就可以使用RDBMS了。如果你有100000所大学,每个大学有100000个用户(总共100亿个用户),那么你可能需要noSql…如果是这样,playOrm允许你在这种情况下非常容易地进行连接,因为你可以按大学分区(两个表),然后你可以简单地在“大学课程分区”上进行连接,然后“大学中的用户划分”。好吧,这是一种方法。

    10000个课程,100000个用户,然后你可以使用RDBMS。如果你有100000所大学,每个大学有100000个用户(总共100亿个用户),您可能需要noSql…如果是这样,playOrm允许您在这种情况下非常轻松地进行连接,因为您可以按大学分区(两个表),然后您可以简单地在“大学课程分区”和“大学用户分区”上进行连接“。好吧,这是一种方法。

    这是一个比我上面提供的更好的模型,但是如果用户名发生变化,那么我们的情况与下划线问题相同,即使这样,您仍然会有更好的结果。”。类的数量将大大低于用户的数量。这是数据非规范化时必须面对的问题。使用MongoDB,您可以使用查找和更新功能(请注意,为什么我还包括用户ID)。你需要经常运行一个批处理脚本来更新数据。一个用户最多只能注册十几个类。我认为你宁愿扫描10000个类,也不愿意扫描100000个用户。这是一个比我上面提供的更好的模型,但是如果用户名更改,那么我们的情况与下划线问题相同,即使这样,你仍然会有更好的结果。类的数量将大大低于用户的数量。这是数据非规范化时必须面对的问题。使用MongoDB,您可以使用查找和更新功能(请注意,为什么我还包括用户ID)。你需要经常运行一个批处理脚本来更新数据。一个用户最多只能注册十几个类。我想你宁愿扫描10000个类,也不愿扫描100000个用户。