Cassandra数据建模中要了解的最重要的事情:主键

使用关系数据建模,您可以从主键开始,但是RDBMS中的有效数据模型更多地是关于表之间的外键关系和关系约束。由于Cassandra无法使用JOIN,因此创建数据模型的复杂性要低得多。Apache Cassandra的复杂性折衷在于提前了解您的查询和数据访问模式。

1.简单主键:

例子: student_id是person的主键

create table person (student_id int primary key, fname text, lname text,
dateofbirth timestamp, email text, phone text );

2.复合键

  • C1:主键只有一个分区键,没有群集键。
  • (C1,C2):列C1是分区键,列C2是群集键。
  • (C1,C2,C3,...):列C1是分区键,列C2,C3等构成集群键。
  • (C1,(C2,C3,…)):与3相同,即C1列是分区键,C2,C3…列构成集群键。
  • (((C1,C2,...),(C3,C4,...))):列C1,C2作分区键,列C3,C4,…作群集键。

重要的是要注意,当复合键为C1,C2,C3时,第一个键C1成为分区键,其余键成为群集键的一部分。为了制作复合分区键,我们必须在括号中指定键,例如:((C1,C2),C3,C4)。在这种情况下,C1和C2是分区键的一部分,而C3和C4是群集键的一部分。

1.分区键

分区键的目的是识别存储该行的群集中的分区或节点。从群集读取或写入数据时,将使用一个名为Partitioner的函数来计算分区键的哈希值。该哈希值用于确定包含该行的节点/分区。

例如,分区键值范围在1000到1234之间的行可以驻留在节点A中,而分区键值范围在1235到2000之间的行可以驻留在节点B中,如图1所示。值为1233,则将其存储在节点A中。

2.集群键

集群键的目的是按排序顺序存储行数据。数据的排序基于列,这些列包含在集群键中。这种安排使使用聚类密钥检索数据变得高效。

例子1

CREATE TABLE user_videos ( userid uuid, added_date timestamp, videoid uuid, name text, preview_image_location text, PRIMARY KEY (userid, added_date, videoid) ) WITH CLUSTERING ORDER BY (added_date DESC, videoid ASC);
分区userid,集群键排序方式:added_date DESC, videoid ASC SELECT * FROM user_videos WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 LIMIT 10;

例子2

create table marks(stuid int,exam_date timestamp,marks float, exam_name text,
primary key (stuid,exam_date));

分区stuid,默认exam_date升序排序

SELECT * FROM user_videos WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 LIMIT 10;

该查询所要查询的是“用户上传的最后10部视频”,只需添加CLUSTERING ORDER BY子句即可实现非常快速,有用和高效的查询。

这可能看起来像是预先优化的,但是此添加功能启用的用例非常引人注目。

结论

Apache Cassandra的复杂性trade off在于提前了解您的查询和数据访问模式。(反模式的一种体现)

参考文章

https://dzone.com/articles/cassandra-data-modeling-primary-clustering-partiti

https://www.datastax.com/blog/2016/02/most-important-thing-know-cassandra-data-modeling-primary-key

Cassandra数据建模中最重要的事情:主键的更多相关文章

  1. Cassandra数据建模

    1.  概述 Apache Cassandra将数据存储在表中,每个表都由行和列组成.CQL(Cassandra查询语言)用于查询存储在表中的数据.Apache Cassandra数据模型基于查询并针 ...

  2. 译 - Cassandra 数据建模的基本规则

    Basic Rules of Cassandra Data Modeling 原文地址:http://www.datastax.com/dev/blog/basic-rules-of-cassandr ...

  3. 【JDBC】向数据表插入数据时,自动获取生成的主键

    数据表设计时,一般都会有一个主键(Key)(自己指定),有时也可以使用联合主键: 有许多数据库提供了隐藏列为表中的每行记录分配一个唯一键值(如:rowid): 当我们没有指定哪一列作为主键key时,数 ...

  4. 在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法

    在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法   ==========方法1: --------1. 选相应 ...

  5. SQLServer中查询表结构(表主键 、列说明、列数据类型、所有表名)的Sql语句

    SQLServer中查询表结构(表主键 .列说明.列数据类型.所有表名)的Sql语句 1.查询数据库中的所有表名称: SELECT name FROM SysObjects Where XType=' ...

  6. Oracle 数据库中序列结合触发器实现主键自增长

    一.数据表名称为T_OFFICE,其主键为PID(number类型) 二.首先为数据表的PID字段创建序列 序列名称:S_T_OFFICE_PID 序列详细内容: 三.创建相应的触发器 触发器名称:T ...

  7. sql语句查询数据库中的表名/列名/主键/自动增长值

    原文地址:http://blog.csdn.net/pukuimin1226/article/details/7687538 ----查询数据库中用户创建的表 ----jsj01 为数据库名 sele ...

  8. 通过 jdbc 分析数据库中的表结构和主键外键

    文章转自:http://ivan4126.blog.163.com/blog/static/20949109220137753214811/ 在某项目中用到了 hibernate ,大家都知道 hib ...

  9. Oracle中查询表字段基本信息、主键、外键(整理)

    背景 因为项目某些模块的数据结构设计没有严格按照某规范设计,所以只能从数据库中查询数据结构,需要查询的信息如下:字段名称.数据类型.是否为空.默认值.主键.外键等等. 在网上搜索了查询上述信息的方法, ...

随机推荐

  1. day1_python运算符

    运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算,今天我们暂只学习算数运算.比较运算.逻辑运算.赋值运算 ...

  2. hdu 1255 覆盖的面积 (Bruceforce)

    Problem - 1255 暴力统计覆盖超过一次的区域.1y. 代码如下: #include <cstdio> #include <cstring> #include < ...

  3. git pull 和git fetch区别?

    git:从远程分支获取最新的版本至本地有两个命令. git fetch 相当于从远程获取最新的版本至本地,但不会自动merge git pull 相当于从远程获取最新的版本并merge至本地

  4. js保存图片到手机相册

    /保存到相册 function savePic(){ var picurl= $("#picurl").attr("src"); //alert(picurl) ...

  5. 七个用于数据科学(data science)的命令行工具

    七个用于数据科学(data science)的命令行工具 数据科学是OSEMN(和 awesome 相同发音),它包括获取(Obtaining).整理(Scrubbing).探索(Exploring) ...

  6. Springboot 自定义多个404页面

    在Springboot中,可以通过修改配置.或者在static文件夹下添加error文件夹引入个性化的404模版.但是如果需要针对不同url地址规则,返回不同样式的404页面,则难以实现了.针对这个问 ...

  7. vue+element-ui 字体自适应不同屏幕

    项目背景:屏幕自适应问题,当在不同分辨率的屏幕上显示页面时,页面的字体需要根据屏幕大小来自适应,想到使用rem作为字体的单位 vue-cli脚手架下的index.html中写入以下js脚本 <s ...

  8. jstack简介

    jstack:Java进程中线程的堆栈信息跟踪工具 功能简介 jstack常用来打印Java进程/core文件/远程调试端口的Java线程堆栈跟踪信息,包含当前虚拟机中所有线程正在执行的方法堆栈信息的 ...

  9. 【t018】派对

    Time Limit: 1 second Memory Limit: 256 MB [问题描述] N头牛要去参加一场在编号为X(1≤X≤n)的牛的农场举行的派对(1≤N≤1000),有M(1≤M≤10 ...

  10. tf.train.string_input_producer()

    处理从文件中读数据 官方说明 简单使用 示例中读取的是csv文件,如果要读tfrecord的文件,需要换成 tf.TFRecordReader import tensorflow as tf file ...