Cassandra中的数据建模

在关系数据模型中,我们为域中的每个对象建模关系/表。 对于Cassandra,情况并非如此。本文将详细介绍在Cassandra中进行数据建模时需要考虑的所有方面。 以下是Cassandra数据建模的粗略概述。

资料建模

从上图可以看出, 概念数据建模和应用程序查询是构建模型时要考虑的输入。 对于任何建模(无论是关系数据库还是Cassandra),概念数据建模都是相同的,因为它更多地是关于从实体,关系及其属性方面获取所需系统功能的知识(因此而得名-ER模型)。

考虑以下有关病理实验室门户的示例。 通过此病理实验室门户,实验室可以向同意进行建议的所有测试的门户进行注册。 此外,它还允许患者(用户)在门户网站上注册,以通过他/她选择的实验室预订测试约会。 这是概念模型的相关部分,将在Cassandra中进行数据建模:

资料建模

Cassandra中的数据建模是查询驱动的。 因此,下一步是确定需要支持的应用程序级查询。 对于所举的示例,以下是我们感兴趣的查询列表:

  • 问题1:通过指定的注册号获取实验室详细信息?
  • 问题2:按预订顺序获取给定实验室要处理的所有待处理订单?
  • 问题3:通过用户的电子邮件ID /电话号码查看用户的详细信息?
  • 问题4:获取指定时间段内用户的所有挂单?

映射规则:列出应用程序查询后,将应用以下规则将概念模型转换为逻辑模型。

  • 规则1:列出我们将在其上执行基于相等性的查询的属性。 例如:按注册编号查找实验室。
  • 规则2:列出在上一步中列出的查询中必须使用的基于范围的属性。
  • 规则3:应用程序感兴趣的结果是否有排序? 例如:返回用户按其姓名升序/降序排序?

从概念模型和查询中,我们可以看到仅在第一季度使用了实体“实验室”。 由于Q1基于等式,因此只能从映射规则中应用规则1。 因此,“实验室”表可以设计如下:

create table lab_detail(registration_number text, name text, address text, primary key(registration_number));

实体“用户”已在第三季度使用。 该查询指定通过电子邮件ID或电话号码获取用户详细信息。 在关系数据库中,我们可以使用电子邮件ID /电话号码之一作为标识符创建单个用户表。 如果表中的数据很大,则可以在非标识符列上创建索引以加快数据检索速度。 但是在Cassandra中,这是以不同的方式建模的。 我们可以使用2个表来解决这个问题:

create table users_by_email(email text primary key, phone_number text, first_name text, last_name text, address text);
create table users_by_phone(phone_number text primary key, email text, first_name text, last_name text, address text);

当我们要基于不属于主键的列查询表时,可以使用二级索引 。 但是在表上创建二级索引时必须小心。 不建议在许多情况下使用它们:

  1. 在高/低基数列上创建索引时,这无济于事。 如果我们根据用户标题(Mr / Mrs / Ms)进行索引,则最终将在索引中形成大量分区。
  2. 同样,如果我们在电子邮件ID上创建索引,因为大多数电子邮件ID是唯一的,在这种情况下,最好创建一个单独的表。
  3. 同样,我们不应该在大量更新的列上创建索引。 如果生成的墓碑比压缩过程可以处理的高得多,这些索引可能会产生错误。

如我们所见,二级索引不适合我们的用户表,最好创建一个满足应用程序目的的其他表。 请注意, 数据复制在Cassandra数据建模中非常普遍。 但是出于性能原因,我们应该限制我们愿意复制多少数据。 现在,创建不同表的问题在于,需要注意可能的数据一致性异常。

  • 如果更新在一个表中成功而在另一个表中失败,该怎么办?
  • 如何使两个表中的数据保持一致,以便在两个表中为用户查询数据都能获得相同的结果?

尽管Cassandra不支持参照完整性,但是有一些方法可以解决这些问题- 批次和轻量交易 (LWT) 。 请注意,与关系数据库一样,Cassandra中的批处理未用于提高性能。 此处的批处理用于实现操作的原子性,而异步查询用于提高性能。 批处理操作的不正确使用可能由于协调器节点上的更大压力而导致性能下降。 更多关于此这里 。 当需要在写入之前执行读取时,LWT可用于实现数据完整性(要写入的数据取决于已读取的数据)。 但是,据说LWT查询比常规查询慢很多倍。 使用LWT时,需要特别小心,因为它们的伸缩性不好。

实现此目的的另一种方法是使用实例化视图 。 它们解决了应用程序维护多个引用相同数据的表同步的问题。 为了保持数据与基本表一致,Cassandra代替了应用程序维护这些表,而是负责更新视图。 结果,为了保持这种一致性,写操作将受到很小的性能损失。 但是,一旦创建了物化视图,我们就可以像对待其他任何表一样对待它。 既然我们已经了解了视图,那么我们可以重新考虑先前的users_by_phone设计:

create table users_by_email(email text primary key, phone_number text, first_name text, last_name text, address text);
create materialized view users_by_phone as
select * from users_by_email where phone_number is not null and email is not

null and primary key(phone_number, email);

注意,“不为空”约束必须应用于主键中的每一列。 因此,到目前为止,我们已经在应用程序工作流程中解决了Q1和Q3。 现在剩下第二和第四季度了:

  • 问题2:按预订顺序获取给定实验室要处理的所有待处理订单?
  • 问题4:获取指定期间内用户的所有挂单?

在一种情况下,必须由用户获取订单详细信息,而在另一种情况下,必须由实验室获取订单详细信息。 在关系数据库中,我们将订单,用户和实验室建模为不同的关系。 使用读取数据的JOIN查询可以在这些关系上实现Q2和Q4。 由于无法进行读取级别连接,因此必须在Cassandra中以不同的方式进行建模。 必须完成数据非规范化才能实现此用例。 作为非规范化的一部分,数据将被复制。 但是,如前所述,Cassandra的经验法则之一就是不要将数据复制视为一件坏事。 与时间相比,我们基本上会在空间上进行权衡。 由于以下原因, Cassandra宁愿在写入时联接而不是在读取时联接。

  • 可以通过向群集添加更多节点来扩大数据复制的规模,而联接则无法处理大量数据。
  • 同样,数据复制允许具有恒定的查询时间,而分布式联接对协调器节点施加了巨大压力。 因此,它建议写时连接而不是读时连接。 由于实验室和用户完全是两个不同的实体,因此可以使用两个不同的表对这些查询进行建模。

Cassandra的一般建议是尽可能避免客户端加入。 因此,我们使用逻辑模型中的表(orders_for_user)和视图(orders_for_lab)从概念模型中对“订单”实体进行建模,就像之前所做的那样。 创建支持Q4的表时,必须考虑映射规则#1(基于平等的属性:user_id)和#2(基于范围的属性:booking_time)。 将列order_id和test_id作为主键的一部分添加,以支持该行的唯一性。

create table orders_for_user(user_id text, order_id text, lab_id text, test_id text, booking_time timestamp, amount_paid double, primary key(user_id, booking_time, order_id, test_id));

同样,可以根据映射规则#1(基于平等的属性:lab_id)和#3(属性的聚类顺序:booking_time)对视图进行建模

create materialized view orders_for_lab as
select * from orders_for_user where lab_id is not null and order_id is not

null and test_id is not null and user_id is not null primary key(lab_id,
booking_time, test_id, order_id, user_id) with clustering order by(booking_time asc, order_id asc, test_id asc, user_id asc);

最后要考虑的一点是,建模数据时不要让分区大小变得太大。 可以将新字段添加到分区键以解决此不平衡问题。 例如:如果某些实验室与其他实验室相比订单过多,则会通过将更多的负载分配给集群中的几个节点来在其中创建不平衡的分区。 为了解决这个问题,我们可以添加一个bucket-id列,将每个实验室1000个订单分组到一个分区中。 通过这种方式,负载在群集的所有节点之间平均分配。

翻译自: https://www.javacodegeeks.com/2019/05/data-modeling-cassandra.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

485串口光纤转换器产品介绍

光纤转换器是RS-232/422/485串行数据通过光纤的远距离传输,可以完成串口到光纤的转换,并且可以延长串行通信信号的传输距离。接下来我们就跟随飞畅科技的小编一起来详细了解下光纤转换器的转换类别有哪些?一起来看看吧! 光纤转换器…

什么是485转光纤?485光纤转换器功能特点及技术参数详解

RS485转光纤转换器实现一路RS-485在光纤上的透明传输,由于采用光纤通信,解决了电磁干扰、地环干扰和雷电破坏的难题,大大提高了数据通讯的可靠性、安全性和保密性,可广泛用于各种工业控制、过程控制、交通控制和分布式数据采集等场…

什么是协议转换器?协议转换器的定义

现如今,随着各种类型的转换器的出现,在很大程度上扩大了各类仪表的使用范围,使的自动控制系统具有更多的灵活性和更广的适应性,在这方面,协议转换器的应用范围也是非常的广泛。今天,杭州飞畅的小编就来为大…

什么是网络协议转换器?

通过之前的介绍,我们了解到协议转换是一种映射,就是把某一协议的收发信息(或事件)序列映射为另一协议的收发信息序列。那么,什么是网络协议转换器呢?接下来就跟随飞畅科技的小编一起来看看吧! 网络协议转换器是什么&a…

midlet_如何在J2ME中创建MIDlet

midlet总览 Java移动应用程序称为J2ME。 通常,当我们在移动技术领域工作时,我们必须考虑J2ME应用程序。 通过这种方式,我们可以开发我们的移动应用程序,也可以通过jad或jar文件将其安装在我们的设备中。 近年来,手机开…

网关到底是什么?协议转换器是网关吗?

网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。那么,网关到底是什么呢?接下来…

穿越JUnit流

关于JUnit 5迁移的好处之一是,您可以在老式模式下运行JUnit 4测试,并且所有内容仍然兼容。 不利的一面是,某些注释和方法在JUnit 4和JUnit 5中具有相同的名称,并且当两组库依赖项都可用时,很容易导入错误的内容并产生不…

协议转换器安全使用须知

协议转换器能使处于通信网上采用不同高层协议的主机仍然互相合作,完成各种分布式应用。可以将IEEE802.3协议的以太网或V.35数据接口同标准G.703协议的2M接口之间进行相互转换。也可以在232/485/422串口和E1、CAN接口及2M接口进行转换。那么,我们在使用协…

怎么安装协议转换器?协议转换器安装方法解析

协议转换器是有很多种的,多数基本上是个2层设备,经常碰见的一种RAD的协议转换器是将2M的E1线路转换成V.35的数据线路连接路由器的设备,当然也有,2M转双绞线以太的,借助2M通信线路可以实现局域网范围的远程接入和扩大。…

关于协议转换器的分类以及工作原理的详细介绍

现如今,随着互联网的广泛应用,我们国内的网民也是突破了8.29亿,相信,大家对于网络这块是非常的熟悉了,它是一种虚拟的东西,但是它几乎存在于我们生活的各个角落,在很大程度的让我们的日常生活变…

ElasticSearch-Hadoop:从Hadoop到ElasticSearch索引产品视图计数和客户顶部搜索查询

这篇文章涵盖了如何使用ElasticSearch-Hadoop从Hadoop系统读取数据并在ElasticSearch中对其进行索引。 它涵盖的功能是在最近n天中为每个客户的产品浏览量计数和热门搜索查询编制索引。 可以在网站上进一步使用分析后的数据来显示最近浏览过的客户,产品浏览次数和热…

协议转换器是怎么分类的?主要有哪些类别?

工业通信采用的通信接口各不相同,需要多个设备之间的信息共享和数据交换,而常用的工控设备通信口有RS-232、RS-485、CAN和网络,由于各种通信结构的协议不兼容,使得异构网络之间的操作和信息交换难以进行,通过多协议转换…

协议转换器的特点有哪些?

现如今,随着计算机网络技术的迅猛发展,我们建立了大量的多种多样的网络系统,导致各种网络之间如何互连的问题。一个办法是推行国际标准,051网络体系结构及通信协议的国际标准已越来越成熟。但是,要把大量已存在的非051…

协议转换器的作用有哪些?

协议转换器一般用一个ASIC芯片就可以完成,成本低,体积小。它可以将IEEE802.3协议的以太网或V.35数据接口同标准G.703协议的2M接口之间进行相互转换。也可以在232/485/422串口和E1、CAN接口及2M接口进行转换,那么协议转换器的作用有哪些呢&…

协议转换器主要是应用在哪些地方?

协议转换器也叫接口转换器,它能使处于通信网上采用不同高层协议的主机仍然互相合作,完成各种分布式应用,它工作在传输层或更高。那么,协议转换器的作用有哪些呢?主要是应用在什么地方的呢?接下来就跟随飞畅…

协议转换器指示灯的含义

很多对协议转换器了解不是很深的朋友,对协议转换器上面的各个指示灯可能会区分不清,很多情况下会搞不清各个指示灯的含义,接下来杭州飞畅科技的小编就来带大家详细了解下协议转换器上各个指示灯的含义,一起来看看吧! …

V.35协议转换器指示灯告警常见故障以及排除方法解析

我们在使用协议转换器的时候,可能常常会遇到一些故障问题,这个可能会困扰到很多朋友,在这里,杭州飞畅的小编专门整理了V.35系列协议转换器在使用过程中的一些常见的故障问题及解决方法,感兴趣的朋友可以一起来看看吧&a…

飞畅科技V.35协议转换器指示灯告警说明详细介绍

飞畅V.35系列协议转换器实现了E1接口与V.35接口之间的相互转换,是杭州飞畅科技推出的又一款广泛使用、备受好评的设备。此转换器的E1接口支持成帧和透明两种模式,广泛应用于计算机网络互连、DDN数据网接入、移动电话网的传输优化和基于E1的PCM网络的各种…

计算机图形学论文_论图计算

计算机图形学论文自从机械计算开始以来,图形概念就已经存在,并且在纯数学领域已经存在了数十年。 由于数据库的黄金时代,图形在软件工程中变得越来越流行。 图形数据库提供了一种持久化和处理图形数据的方法。 但是,图形数据库并不…

2M线路保护实现与应用

由于传输电路是出于最底层的物理传送平面,目前这些传输电路调度工作仍然停留在手工调度,即耗费大量的人力物力,又花费大量的宝贵时间,尤其在紧急故障发生的时候,严重影响故障的抢修速度,从而影响通信网络恢…