Cassandra 具有简单数据库示例的数据模型

尽管 Cassandra 查询语言类似于 SQL 语言,它们的数据建模方法完全不同。

In Cassandra,糟糕的数据模型会降低性能,尤其是当用户尝试在 Cassandra。最好记住下面详述的几条规则。

Cassandra 数据模型规则

In Cassandra,写入并不昂贵。 Cassandra 不支持连接、分组、OR 子句、聚合等。因此,您必须以完全可检索的方式存储数据。因此,在对数据进行建模时,必须牢记这些规则 Cassandra.

最大化写入次数

In Cassandra,写入非常便宜。 Cassandra 针对高写入性能进行了优化。因此,请尝试最大化写入次数,以获得更好的读取性能和数据可用性。数据写入和数据读取之间存在权衡。因此,请通过最大化数据写入次数来优化数据读取性能。

最大化数据复制

数据非规范化和数据重复事实上 Cassandra磁盘空间并不比内存、CPU 处理和 IO 操作更昂贵。 Cassandra 是一个分布式数据库,因此数据复制提供了即时数据可用性并且没有单点故障。

Cassandra 数据建模目标

在建模数据时,您应该有以下目标 Cassandra:

均匀分布数据 Cluster

您希望每个节点上的数据量相等 Cassandra Cluster。数据根据分区键(即主键的第一部分)分布到不同的节点。因此,请尝试选择整数作为主键,以便在集群中均匀分布数据。

最小化查询数据时读取的分区数量

分区是一组具有相同分区键的记录。当发出读取查询时,它会从不同的分区的不同节点收集数据。

如果有多个分区,则需要访问所有这些分区来收集查询数据。

这并不意味着不应该创建分区。如果你的数据非常大,那么你就无法将如此大量的数据保存在单个分区上。单个分区会降低速度。

因此请尽量选择平衡的分区数量。

良好的主键 Cassandra

让我们举一个例子来找出哪个主键是好的。

这是 MusicPlaylist 表格。

Create table MusicPlaylist
    (
        SongId int,
        SongName text,
        Year int,
        Singer text,
        Primary key(SongId, SongName)
    );

在上面的例子中,表 MusicPlaylist,

  • Songid 是分区键,并且
  • SongName 是聚类列
  • 数据将根据 SongName 进行聚类。仅会使用 SongId 创建一个分区。MusicPlaylist 表中不会有任何其他分区。

由于主键不好,该数据模型的数据检索将会很慢。

这是另一个表 MusicPlaylist。

Create table MusicPlaylist
    (
        SongId int,
        SongName text,
        Year int,
        Singer text,
        Primary key((SongId, Year), SongName)
    );

在上面的例子中,表 MusicPlaylist,

  • Songid 和 Year 是分区键,并且
  • SongName 是聚类列。
  • 数据将根据 SongName 进行聚类。在此表中,每年将创建一个新分区。该年的所有歌曲都将位于同一节点上。此主键对于数据非常有用。

通过这个数据模型,我们的数据检索将会很快。

在模型中 Cassandra

在对查询进行建模时应牢记以下几点:

确定要支持的查询

首先,确定您想要什么查询。

比如你需要吗?

  • 加入
  • 通过...分组
  • 根据哪一列进行过滤等等。

根据您的查询创建表

根据您的查询创建表。创建一个满足您查询的表。尝试以需要读取最少数量的分区的方式创建一个表。

处理一对一关系 Cassandra

一对一关系是指两个表有一对一的对应关系。例如,学生只能注册一门课程,我想搜索某个学生注册了哪门课程。

因此在这种情况下,您的表格模式应该包含与该特定课程相对应的学生的所有详细信息,例如课程名称、学生学号、学生姓名等。

一对一关系 Cassandra
一对一关系 Cassandra

Create table Student_Course
    (
        Student rollno int primary key,
        Student_name text,
        Course_name text,
    );

处理一对多关系 Cassandra

一对多关系是指两个表之间存在一对多的对应关系。

例如,一门课程可以有很多学生学习。我想搜索正在学习特定课程的所有学生。

因此,通过查询课程名称,我将获得许多正在学习特定课程的学生姓名。

一对多关系 Cassandra
一对多关系 Cassandra

Create table Student_Course
    (
        Student_rollno int,
        Student_name text,
        Course_name text,
    );

我可以通过以下查询检索特定课程的所有学生。

Select * from Student_Course where Course_name='Course Name';

处理多对多关系 Cassandra

多对多关系意味着两个表之间存在多对多的对应关系。

例如,一门课程可以由多位学生学习,一位学生也可以学习多门课程。

多对多关系 Cassandra
多对多关系 Cassandra

我想要搜索正在学习特定课程的所有学生。另外,我想要搜索特定学生正在学习的所有课程。

因此在这种情况下,我将有两个表,即将问题分为两种情况。

首先,我将创建一个表格,您可以通过该表格找到特定学生的课程。

Create table Student_Course
    (
        Student_rollno int primary key,
        Student_name text,
        Course_name text,
    );

我可以通过以下查询找到特定学生的所有课程。

Select * from Student_Course where student_rollno=rollno;

其次,我将创建一个表格,通过该表格您可以找到有多少名学生正在学习某一门课程。

Create table Course_Student
    (
        Course_name text primary key,
        Student_name text,
        student_rollno int
    );

我可以通过以下查询找到特定课程的学生。

Select * from Course_Student where Course_name=CourseName;

RDBMS 和 Cassandra 资料建模

RDBMS Cassandra
以规范化形式存储数据 以非规范化形式存储数据
旧式数据库管理系统;结构化数据 宽行存储,动态;结构化和非结构化数据

总结

  • 数据建模 Cassandra 与其他不同 RDBMS 数据库.
  • Cassandra 数据建模有一些规则。为了建立良好的数据建模,必须遵循这些规则。除了这些规则之外,我们还看到了三种不同的数据建模案例以及如何处理它们。
  • 一对一关系是指两个表具有一一对应关系。
  • 一对多关系是指两个表之间存在一对多的对应关系。
  • 多对多关系意味着两个表之间存在多对多的对应关系。