Cassandra属于NoSQL数据库,NoSQL和传统关系型数据库不同,NOSQL偏好数据冗余,因为NoSQL一般无法做表关联查询。
(1) keySpace
基本上可以将Keyspace 理解成MySQL 之中的Database. 只不过Cassandra的”database” 包含了更多的内容:
- Replication Factor : 复制因数。 表示一份数据在一个DC 之中包含几份。常用奇数~ 比如我们项目组设置的replication_factor=3
- Replica placement strategy : 复制策略。 默认的是SimpleStrategy. 如果是单机架、单数据中心的模式,保持使用SimpleStrtegy即可。
下面是一个简单的通过CQL 语句创建一个新的keyspace的例子:
MySQL
1 2 |
CREATE KEYSPACE Keyspace name WITH replication = {‘class‘: ‘SimpleStrategy‘, ‘replication_factor‘ : 3}; 来源: http://www.flyml.net/2016/09/04/cassandra-tutorial-data-model/ |
(2) Column Family/Column
可以理解Column Family为MySQL的Table, 将Column 理解为MySQL之中的一条记录。所谓Column就是: A tuple with name, value and timestamp。之所以称之为Column Family, 是因为Cassandra 是一种列式数据库,因此将一组Column称为Column Family。.
比较有意思的是,Column 包含了Timestamp。 其作用主要是当有新数据覆盖的时候,不是直接将老数据从存储介质上删除,而是直接写入新的数据。 当需要查询的时候,通过key或者某种方式找到的所有Column,并去找Timestamp 最新的Column。 老数据会在一段时间之后自行删除。
可以使用下面的一句话概括:
Java
1 |
Map<RowKey, SortedMap<ColumnKey, ColumnValue>> |
首先Map结构,通过key来进行查询速度会非常快。 再加上内嵌的SortedMap, 可以进行顺序查找,速度也很快。 当然,如何快速的生成Key等就是另外一个topic
Cassandra 整体数据可以理解成一个巨大的嵌套的Map。只能按顺序一层一层的深入,不能跳过中间某一层~
(3)Super Column
已经被淘汰,可以不用关注
(4)Primary key
Primary key = Partition Key + [Clustering Key]
(5)Partition Key
其实就是指在Primary key 中的第一个列,如果想要用多个列就可以把这的多个列用小括号括起来。
http://docs.datastax.com/en/glossary/doc/glossary/gloss_partition_key.html
http://docs.datastax.com/en/cql/3.1/cql/cql_reference/refCompositePk.html 这里有一个例子,说的很清楚。
参考资料:
1)Data Modeling Concepts,http://docs.datastax.com/en/cql/3.1/cql/ddl/dataModelingApproach.html
2)Data modeling in 30 seconds http://docs.datastax.com/en/landing_page/doc/landing_page/dataModeling.html
3)[Cassandra教程] (四)使用Key的正确姿势,http://www.flyml.net/2016/09/05/cassandra-tutorial-right-way-to-use-key/