引用知乎的回答
https://www.zhihu.com/question/20059632
上文说如果数据集比较简单,没有Join,MongoDB会非常棒。没错。但这不意味着如果数据复杂就不行。相反,这时需要重新设计数据schema (模式、架构、结构),把相关的内容放到一个document里,这是与关系型数据库追求的三范式最不一样的地方。比如一篇文章的评论不算太多,最多几百个,就可以把评论放到数组(array)里,作为文章这一document的一部分。是的,数组(array)是支持的,查询数组元素也非常自然。这样的好处是在读取文章这一document时,一个页面上所有需要的数据都有了,读硬盘(内存)的次数少了,自然就快,相比之下,关系型数据库Join就麻烦很多了。
MongoDB这样的NoSQL会火的根本原因,是许多用户不必需关系型数据库的特性,有时候还带来了限制。我从以上特性中选几个谈谈。
Document-oriented.《MongoDB in Action》中举了扩展或自定义属性的例子。比如电子商务网站的产品除了预设的价格,id等,因具体产品不同有许多自定义属性,产品这个表应该怎么设计?就算一类产品大致相似,也有独特的属性,比如LCD和LED显示器的产品特性就不一样。这个问题有一些解决方案,比如 Entity-attribute-value Modelhttp://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model但是这些方案都很复杂,这时,schemaless的优点就显现出来了。
Easy scalability. 当数据规模大到一个机器装不下了,或者一台机器数据读写负载太高,需要使用cluster的时候,关系型数据库的partitioning, sharding要复杂的手工处理。MongoDB可以自动按照用户给定的sharding key把数据分片,并且动态地平衡各个机器的数据量。
Rich query language. 这是关系型数据库擅长的地方,也是用户所希望的,而有的key-value数据库只把value当作一个binary blob,比如Voldemort,只能通过key查询。简言之,不通用。MongoDB内部也是按key-value存的,但是支持各种查询,并且可以建各种索引,提供了易用与高性能。
MongoDB不适用的应用场景
在某些场景下,MongoDB作为一个非关系型数据库有其局限性。MongoDB不支持事务操作,所以需要用到事务的应用建议不用MongoDB,另外MongoDB目前不支持join操作,需要复杂查询的应用也不建议使用MongoDB。
作者:姜健
链接:https://www.zhihu.com/question/20059632/answer/110863218
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论