NoSQL精粹
进度
P40
笔记
影响NoSQL论文:Bigtable-2005,Dynamo-2007
关系型数据库并不是设计给集群用的。
CQL和SQL类似,但是差别很大。
NoSQL不使用SQL。
图数据库设计不是为了在集群上运行。分布模型和关系模型类似,但是数据模型却不同。
混合持久化观点:不同场景使用不同的存储方式。
选择NoSQL主要两个原因:1 数据量大,数据访问效率高,必须放到集群。 2 更方便数据交互方式提高程序开发效率。
选择NoSQL不一定是数据量大。阻抗失谐也是原因之一。
表和行在关系模型中叫 关系和元组。
关系模型和聚合模型。如何划分聚合边界,取决于如何操作数据,描述了应用程序使用数据方式。
键值:聚合不透明,必须获取全部聚合才行 文档:聚合透明,所以可以灵活访问数据,可以通过聚合字段查找,获取部分聚合。 列族:聚合分为列族,
列族:两级映射,get(id,"name")。和列存数据库不一样,如C-store,
列存(某一列),c-store支持关系型,column store,nosql之前就有了。 列族(一组列):bigtable,column family database
cassandra 行只能出现在同一个列族里面,列族可以包括超列,列里面可以嵌套列,cassandra中的supercolumn对应bigtable里面列族。
图数据库:重视关系,
宽行(许多列,每行不一样)和窄行(很少列,相同行较多)。
无模式的灵活性适用于聚合内部,聚合边界改动了,也会和关系型一样复杂。
关系型不存在聚合结构,所以可以用不同方式访问数据。聚合结构本质是查询结构。聚合结构定了,那么查询模式很有限。
程序需要处理和聚合结构不一样的查询:物化视图。关系型里面叫视图。
cassandra没有丰富的查询语言,所以设计数据模型适合,优化列和列族,以提高读取速度。CQL不支持join和subquery,where子句也很简单。
对比
关系型 | Riak(KV) | MongoDB(Document) | Cassnadra(Column Family) |
---|---|---|---|
数据库实例 | Riak集群 | MongoDB实例 | Cluster |
模式 schema | namespace | database | keyspace |
表 | Bucket | Collection | column family |
行 | key-value | document | row |
列 | field | column | |
rowid | key | _id | rowkey |
join | DBRef | ||
存储 | 字节 | BSON,XML,JSON | |
结构 | 一维hash table | JSON | 多维hash table |
适合场景 | 会话信息,用户配置,购物车,关键字查询,无法通过属性查询 | 接近关系型查询模型,事件记录,内容管理系统,博客平台,用户评论,用户注册,配置,面向web的文档,网站分析,实时分析,PV,UV,电商:产品和订单,灵活的模式 | 事件记录,博客"tag","link","category",计数器,查询模式提前可知 |
不适合场景 | 数据建关系,含有多项事务,查询数据,操作多个关键字 | 多项复杂事务,跨文档原子操作,灵活持续变化的聚合结构, | ACID,聚合(SUM,AVG),早期技术方案无法确定查询模式,查询模式变化,列族也要变化,改变查询模式比改变数据模式代价高 |