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
一对一关系是指两个表有一对一的对应关系。例如,学生只能注册一门课程,我想搜索某个学生注册了哪门课程。
因此在这种情况下,您的表格模式应该包含与该特定课程相对应的学生的所有详细信息,例如课程名称、学生学号、学生姓名等。
Create table Student_Course ( Student rollno int primary key, Student_name text, Course_name text, );
处理一对多关系 Cassandra
一对多关系是指两个表之间存在一对多的对应关系。
例如,一门课程可以有很多学生学习。我想搜索正在学习特定课程的所有学生。
因此,通过查询课程名称,我将获得许多正在学习特定课程的学生姓名。
Create table Student_Course ( Student_rollno int, Student_name text, Course_name text, );
我可以通过以下查询检索特定课程的所有学生。
Select * from Student_Course where Course_name='Course Name';
处理多对多关系 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 数据建模有一些规则。为了建立良好的数据建模,必须遵循这些规则。除了这些规则之外,我们还看到了三种不同的数据建模案例以及如何处理它们。
- 一对一关系是指两个表具有一一对应关系。
- 一对多关系是指两个表之间存在一对多的对应关系。
- 多对多关系意味着两个表之间存在多对多的对应关系。