可以使用 MongoDB 制作关系数据库吗?

Posted

技术标签:

【中文标题】可以使用 MongoDB 制作关系数据库吗?【英文标题】:Can one make a relational database using MongoDB? 【发布时间】:2011-12-29 02:19:09 【问题描述】:

我打算用 MongoDB 做一个学生管理系统。我将为学生准备一张桌子,另一张用于出勤记录。如下图所示,我可以在出勤表中使用钥匙进入学生表吗?怎么样?

【问题讨论】:

【参考方案1】:

MongoDB 背后的理念是消除(或至少最小化)关系数据。您是否考虑过将出勤数据直接嵌入到每个学生记录中?这实际上是 MongoDB 的首选设计模式,可以带来更好的性能和可扩展性。

如果您确实需要高度相关和规范化的数据,您可能需要重新考虑使用 MongoDB。

【讨论】:

如果您是 MongoDB 新手,他们的网站上有一个非常酷的小教程:mongodb.org(只需点击“试用”,然后在 shell 中输入 tutorial。) @MikeChristensen 目前,此建议不再有效。他们可能改变了他们的网站。 如果你开始使用嵌入式考勤的数据库,但是你需要显示每个班级的考勤情况,看起来遍历所有用户并提取特定日期和班级的考勤数据会非常低效? 我不是 Mongo 专家,但据我了解,Mongo 将在这些类型的查询上创建索引,因此它不必遍历所有个人用户。 SQL 会做同样的事情,只是数据更加分散。 我很困惑为什么这个答案排名很高。如果您需要在回答之前证明问题的合理性,这是一项微不足道的任务;在很多情况下,一个开发人员从公司继承代码,他们没有能力改变整个代码的架构,他们需要让代码做一些新的事情来满足另一个不使用你的特定团队的需求建筑学。既然这已经解决了,我们就没有尝试回答这个问题了。【参考方案2】:

答案取决于您打算如何使用这些数据。你真的有两个选择,嵌入考勤表,或者链接它。此处详细介绍了这些方法:http://www.mongodb.org/display/DOCS/Schema+Design

对于常见的用例,您可能会嵌入这个特定的集合,因此每个学生记录都有一个嵌入的“出勤”表。这会起作用,因为出勤记录不太可能在学生之间共享,并且检索出勤数据也可能需要学生信息。检索出勤数据很简单:

db.student.find(  login : "sean"  )

  login : "sean",
  first : "Sean", 
  last : "Hodges",
  attendance : [
     class : "Maths", when : Date("2011-09-19T04:00:10.112Z") ,
     class : "Science", when : Date("2011-09-20T14:36:06.958Z") 
  ]

【讨论】:

【参考方案3】:

是的。没有硬性规定。您必须查看嵌入或引用数据的优缺点。该视频肯定会有所帮助(https://www.youtube.com/watch?v=-o_VGpJP-Q0&t=21s)。在您的示例中,电话号码属性应该在同一个表中(在文档数据库中),因为一个人的电话号码很少更改。

【讨论】:

链接已失效 youtube.com/watch?v=9JZJsChpwKs 视频的新链接:标题:“MongoDB 教程 #15 - 关系数据”因此有人可以搜索链接是否再次失效。

以上是关于可以使用 MongoDB 制作关系数据库吗?的主要内容,如果未能解决你的问题,请参考以下文章

单个关系数据库无法满足高流量应用程序的需求?结果用一个MongoDB就搞定了……

【Python基础】mongodb存储文件的优缺点?

mongoDB表与表的关系及聚合管道查询

巨杉答疑巨杉数据库和mongodb有什么关系吗?

MongoDB

mongodb为啥比mysql快