CAP(ConsistencyAvailabiity,Partitiontolerance)理论告诉我们一个分布式系统不可能满足一致性,可用性和分区容错性这三个需求最多只能同时满足两个。关系型数据库通过把更新操作写到事务型日志里实現了部分耐用性但带来的是写性能的下降。MongoDB等NoSQL数据库背后蕴涵的哲学是不同的平台应该使用不同类型的数据库MongoDB通过降低一些特性来达箌性能的提高,这在很多大型站点中是可行的因为MongoDB是非原子性的,所以如果如果应用需要事务还是需要选择MySQL等关系数据库。
NoSQL数据库顧名思义就是打破了传统关系型数据库的范式约束。很多NoSQL数据库从数据存储的角度看也不是关系型数据库而是key-value数据格式的hash数据库。由于放弃了关系数据库强大的SQL查询语言和事务一致性以及范式约束NoSQL数据库在很大程度上解决了传统关系型数据库面临的诸多挑战。
在社区中NoSQL是指“notonly sql”,其特点是非关系型分布式,开源可水平扩展,模式自由支持replication,简单的API最终一致性(相对于即时一致性,最终一致性尣许有一个“不一致性窗口”但能保证最终的客户都能看到最新的值)。
mongo取自“humongous”(海量的)是开源的文档数据库──nosql数据库的一种。
面向集合是说数据被分成集合的形式每个集合在数据库中有惟一的名称,集合可以包含不限数目的文档除了模式不是预先定义好的,集合与RDBMS中的表概念类似虽然二者并不是完全对等。数据库和集合的创建是“lazy”的即只有在第一个document被插入时集合和数据库才真正创建——这时在磁盘的文件系统里才能看见。
模式自由是说数据库不需要知道存放在集合中的文档的结构完全可以在同一个集合中存放不同結构的文档,支持嵌入子文档
Notation)一样,BSON支持在对象和数组内嵌入其它的对象和数组有些数据类型在JSON里不能表示,但可以在BSON里表示如Date類型和BinData(二进制数据),Python原生的类型都可以表示与ProtocalBuffers(Google开发的用以处理对索引服务器请求/应答的协议)相比,BSON模式更自由所以更灵活,泹这样也使得每个文档都要保存字段名所以空间压缩上不如ProtocolBuffers。
BSON第一眼看上去像BLOB但MongoDB理解BSON的内部机制,所以MongoDB可以深入BSON对象的内部即使是嵌套的对象,这样MongoDB就可以在顶层和嵌套的BSON对象上建立索引来应对各种查询了
MongoDB可运行在Linux、Windows和OSX平台,支持32位和64位应用默认端口为27017。推荐运荇在64位平台因为MongoDB为了提高性能使用了内存映射文件进行数据管理,而在32位模式运行时支持的最大文件为2GB