读后感及使用MongoDB时的粗浅映像。
2013-01-11
###SQL和NoSQL表现区别:
1. 在数据库的结构上更倾向于多个树状集合,而不是SQL的库,表,列,数据的层级结构。
MongoDB的基本数据单位有库,文档及其数据,但实际上都可以当作一个树来看待,操作非常灵活便捷。
2. 没有按规律自增加1的ID,而使用唯一按顺序自增的ObjectId表示,这个特性保证了每个数据id的唯一性,比Sql的同一个表内唯一id要好,而且更利于数据分片。
3. 批量操作开销更小,每次批量操作只有一个消息头,而非SQL中每个列的操作都要带消息头。
4. 并发问题上:更新操作先到达服务器的先执行,所以最后的可能会覆盖以前所有的更新。
5. 增加了很多数据库自带函数,对ORM要求不高。
6. 天生分布式。自带数据分片和负载均衡功能。
7. 有游标的存在,相当于多个遍历中的指针和静止指针,在某些情况下,取数据的时候不用每次开始从头查询。
###笔记
1. "$inc"修改器增加(或减少)数字
db.test.update({查询条件},
{"$inc": {"previews": 1} })
2. "$set"修改器创建值或更新值。
3. "$unset"删除值。
4. 数组操作:"$push", "$ne", "$addToSet", "$pop", "$pull"。
5. upsert
6. 在查询中,$lt在内层文档,$inc则是外层文档的键,基本可以肯定,条件句是外层文档的键,而修改器是外层文档的键。
7. 不是非常必要时,避免使用$where子句,它们在速度上比常规查询慢很多,每个文档都要从BSON对象转化为JS对象后运行。
###小贴士
1. 使用更新修改器时"$"在Perl和PHP中会将字符串替换成变量,所以在这两门语言中要将"$"转义或设置为其它。
2. 进行单个更新前,如果查询条件匹配了多个文档——并更新多个文档时,数据库会报错。
###总结:
NoSQL更加灵活快捷,但没有SQL健壮,所以NoSQL更适用于互联网应用,而SQL适合传统软件。(当然,应以具体的项目需求而选择数据库。),大中型互联网项目可以结合两者。比如Log文件这类没有事务业务需求的数据很适合NoSQL。