如何学习NoSQL?
How You Should Go About Learning NoSQL
作者在twitter上总结:
1: 用 MongoDB. 2: 花20分钟学习Redis 3: 观察这个video理解Dynamo.
这篇文章主要是明确两个概念:
1.第二索引和Join问题,在关系数据库中,通常除了主索引主键primary key之外,还有第二个index。而NoSQL一般只有主键,没有第二索引,那怎么替换呢?
作者认为可以无需第二索引,以Score表为例子,有主键Id, LeaderboarId 和UserId以及Score四个字段。作者意思再创建另外一个表有两个字段:LeaderboardId 和 ScoreIds,表达属于同一个leaderboard所有Score。通过两次查询,首先根据LeaderboarId获得所有的 ScoreId集合,然后再在Score表中根据主键Id(ScoreId)获得其余字段。
在关系数据库中可能将ScoreIds看成一个数组,因而效率不太好,但是如果数据库引擎将其看成是一个整块对象(可以Push remove和切片slice),这个方案就不会那么夸张了,当然,不可否认第二索引也许更好些。
第二个需要明确的是joins,虽然有些NoSQL支持第二索引有些其他不支持,但是他们几乎都认为joins是狗屎。
为什么呢?因为joins导致数据库切分sharding无法实施,Sharding是大多数NoSQL可伸缩的方案。
以score为例,leaderboard的1 3 5 7 9的score数据也许在服务器1,而服务器2包含 leaderboard的2 4 6 8 10数据,一旦你这样开始切分你的数据,join将不会起作用。比如要通过join Scores,userId和Users.Id获得UserName,因为在不同服务器上,就无法获得。
那么我们如果处理无join(joinless)世界呢?在你自己应用程序中使用join类似功能,比如通过二次查询,你首先获得所有scores数据,然后,通过再通过查询Users表获得UserName集合。增加代码必要的复杂性才能进行水平伸缩。
作者在该文还谈了具体几个NoSQL的特点,待续。
[该贴被banq于2011-08-16 09:58修改过]