博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cassandra – 数据结构设计概念和原则
阅读量:7115 次
发布时间:2019-06-28

本文共 2446 字,大约阅读时间需要 8 分钟。

hot3.png

当我们设计一个关系型数据库时,着手点是系统中的对象(Entities),再为对象加上属性描述,从而转换为表设计。在关系型数据库中我们不会考虑表的行,因为确定表的字段名称之后,数据逐行写入,数据库会管理行数据空间。

宽行还是窄行(Wild Rows or Skinny Rows)

但在Cassandra里,我们必须在设计时考虑列族的行数,这取决于定义的列的数目。通常会有两种选择:

  • 宽行(Wild Rows):在每行中包含数量巨大(通常会达到百万 级之多)的列,但只有很少的行数;

  • 窄行(Skinny Rows):比较像关系型数据库的使用方法,有少量较为固定的列,使用不同、不断增加的行来存储。

列排序(Column Sorting)

Cassandra不支持查询语言,也不支持查询时使用Order By对数据进行排序,排序是需要设计时考虑。在定义列族时,可以包含一个名为CompareWith的元素,这个元素决定了此列族的排序规则。Cassandra提供的排序支持以下几种数据类型,包含了字符、字节、数字和日期时间:AsciiType, BytesType, LexicalUUIDType, Integer Type, LongType, TimeUUIDType, or UTF8Type.

设计原则(Design Principles)

Cassandra的数据结构设计与关系型数据库完全不同,核心有三大设计原则:物化视图、无值列和复合键。

物化视图(Materialized View)

在关系型数据库中,我们通常会使用Where条件查询表的部分结果集,比如我们设计了Users表,有一个City字段,然后使用Where City = 'New York'来进行查询。

SELECT * FROM USERS WHERE CITY = "New York"

在Cassandra中,我们会直接创建一个新的列族名为CityUsers,以City为行名称,列为所有在这个City中的Users.

$ create column family CityUser;$ set CityUsers["NewYork"]["UserID"] = "1, 2, 3, 4";

这在Cassandra里是一种非常普遍和常见的设计,物化视图为查询而设计一份映射数据,而不是从原始数据中去寻找。

无值列(Valueless Column)

以上面的Users/CityUsers为例,我们设计了行名为City,列为Users的列族,因为数据是从Users列族中映射过来的,其实我们并不需要为列指定内容,它可以直接引用Users表中的数据。

复合键(Aggregate Key)在《》为大家介绍过复合键的用法,在Cassandra中,大量使用复合键也是设计原则之一。 在设计Cassandra数据结构时,应当牢牢把握的两点:

  • 从查询开始:Cassandra不是为对象而设计,而是为查询而设计。先看看系统中需要的查询是什么样的,再着手设计;

  • 系统时间:因为Cassandra的列结构包含时间戳,所以你必须考虑从不同客户端过来的时间格式,有必要指定一个统一的标准时间,当然,这将带来本地时间转换问题。

数据设计示例(Data Design Sample)

需求

  • 查询指定地区的酒店

  • 查询指定酒店的信息,包括名称和所在地区

  • 查询酒店附近有趣的地点

  • 查询指定日期区间可预订的房间

  • 查询房间的评分

  • 提交客户信息预订房间

关系型数据库设计

Cassandra数据结构设计

设计思路:

  1. 创建数据库结构;

  2. 创建酒店和附近场所的数据结构。酒店是普通列族,附近场所是超级列族;

  3. 查询指定地区的酒店,使用第二簇索引完成;

  4. 查询一个酒店,然后查询附近场所;

  5. 预订酒店时,向Reservation列族写入行数据。

Cassandra.yaml

keyspaces:  - name: Hotelier    replica_placement_strategy: org.apache.cassandra.locator.RackUnawareStrategy     replication_factor: 1    column_families:      - name: Hotel         compare_with: UTF8Type      - name: HotelByCity         compare_with: UTF8Type      - name: Guest         compare_with: BytesType      - name: Reservation         compare_with: TimeUUIDType      - name: PointOfInterest         column_type: Super        compare_with: UTF8Type         compare_subcolumns_with: UTF8Type      - name: Room        column_type: Super        compare_with: BytesType         compare_subcolumns_with: BytesType      - name: RoomAvailability        column_type: Super        compare_with: BytesType         compare_subcolumns_with: BytesType

本文参考自《Cassandra: The Definitive Guide》

原文链接:

转载于:https://my.oschina.net/silentriver/blog/182814

你可能感兴趣的文章
什么是交换机端口镜像及其工作原理
查看>>
ubuntu 安装 Wireshark
查看>>
java fatal error log
查看>>
安装OpenKM
查看>>
SQL SERVER 正则替换
查看>>
一个PHP小程序
查看>>
Echarts 动态获取数据进行图表的展示
查看>>
ansible命令基础
查看>>
【转】LINUX-APACHE服务的配置
查看>>
LVM的管理命令
查看>>
安装WSUS服务器
查看>>
线程安全与可重入函数的区别与联系
查看>>
vim使用记录
查看>>
php中 curl模拟post发送json并接收json
查看>>
简析J2EE应用程序数据库类设计模式
查看>>
十二周三次课 (3月14日)
查看>>
Hadoop子项目介绍
查看>>
【Interface&navigation】系统栏变暗(50)
查看>>
php判断用户输入验证码是否正确
查看>>
hbase hive整合
查看>>