valuelesscolumn的好坏

valuelesscolumn的好坏,第1张

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

宽行仍是窄行(Wild Rows or Skinny Rows)apache

但在Cassandra里,咱们必须在设计时考虑列族的行数,这取决于定义的列的数目。一般会有两种选择:数据结构

宽行(Wild Rows):在每行中包含数量巨大(一般会达到百万 级之多)的列,但只有不多的行数;less

窄行(Skinny Rows):比较像关系型数据库的使用方法,有少许较为固定的列,使用不一样、不断增长的行来存储。数据库设计

列排序(Column Sorting)ide

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

设计原则(Design Principles)spa

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

物化视图(Materialized View)rest

在关系型数据库中,咱们一般会使用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不是为对象而设计,而是为查询而设计。先看看系统中须要的查询是什么样的,再着手设计;

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

数据设计示例(Data Design Sample)

需求

查询指定地区的酒店

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

查询酒店附近有趣的地点

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

查询房间的评分

提交客户信息预订房间

关系型数据库设计

Screen Shot 2013-12-01 at 103208 AM

Cassandra数据结构设计

Screen Shot 2013-12-01 at 103412 AM

设计思路:

建立数据库结构;

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

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

查询一个酒店,而后查询附近场所;

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

Cassandrayaml

keyspaces:

- name: Hotelier

replica_placement_strategy: orgapachecassandralocatorRackUnawareStrategy

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》

原文连接:Cassandra – 数据结构设计概念和原则

相关文章

1 数据库 - 概念结构设计

2 数据库设计----概念结构设计(概念模型、E—R模型、概念结构设计)

3 数据库原理 概念结构设计的方法

4 数据库原理(十 一)- 概念结构设计

5 数据库结构设计概念设计

6 数据库设计(1)_概念结构设计

7 数据库原理概念结构、逻辑结构设计案例

8 数据库原理 概念结构设计-E-R图及其设计

9 设计模式-----原则概念

10 数据库学习笔记(四)数据库设计——概念结构设计

更多相关文章

• 数据库是什么?数据库的概念 - MySQL教程

• Web 创建设计 - 网站建设指南

• TiDB 在摩拜单车在线数据业务的应用和实践

• Flink 数据传输及反压详解

应该说,现在是国产分布式数据库发展的利好时期。在讨论发展前景前,首先要先看看分布式数据库的发展方向。

大家把传统关系型数据库称作oldSQL,给人感觉要被淘汰似的。但其实数据量不是很大或者事务处理的场景夏,关系型数据库的还是占优的。

关系型数据库的主要问题在于:

性能瓶颈,

单一模型(关系模型),只适合OLTP

应对业务的灵活性不够,

d性扩充能力不够,

两地三中心和双活等问题上不足。

随着互联网和手机的飞速发展,无论从用户规模、使用频率、还是场景多样性都使得这些问题浮出水面。其实Oracle在92年就开始尝试转向分布式,还当时引起了业界的巨大争论,最后失败。更何况过去CPU、内存、存储、带宽的高成本导致分布式数据库的性价比并不高,只能停留在学术阶段,限制了分布式的发展。

新分布式数据库首先是要避免和传统关系型数据库的竞争,这是明智的选择,能够轻装上阵。因此从几个方面入手,应对海量数据处理、分析、缓存、流式处理、开发模式等等。相对应列式,KV,Document等多种存储数据结构。

所有这些都被称为NoSQL数据库,放弃ACID和事务能力还换取性能。然而,NoSQL又收到了大量的批评反对意见,主要是说把数据库应该处理的问题交还给了开发是种发展的倒退。这些问题包括,索引、版本、SQL支持、事务支持等等。市场上超过90%的开发员都需要SQL,而且SQL也是非常有效和成熟。于是大家无论底层是什么存储结构又开始支持SQL,形成了NewSQL。

这里插一句题外话,在硅谷已经不再用SQL、NoSQL、NewSQL来划分数据库了。理由很简单,SQL是一种语言,从来没有SQL数据库的说法,自然也不应该有NoSQL数据库的说法。NewSQL数据库就更不合理,用的SQL并非什么“New“的新东西。所以专业上用关系型和非关系型数据库来划分,分布式数据库主要都是非关系型数据库。

回过头来看国内分布式数据库市场需求,中小企业不满足Mysql的性能,分库分表又很难搞,也不彻底;大型企业被Oracle等垄断支付高额成本,而且又不解决实际碰到的瓶颈问题。因此,用户都在寻找新的解决方案。小型用户、云计算的用户、大型企业都需要对应的分布式数据库产品。

再加上国产自主和去IOE浪潮,更加推动了国产分布式数据库的发展利好。值得注意的是,数据库研发是个严肃的事情,没法短平快。

在国产数据库技术发展的初级探索阶段,技术是关键,而在当下的快速发展阶段,生态就成为最重要的一环。

开源是形成初步版本、扩大开发者和用户群体、增强技术影响里的重要一环。开源是对生态的动态推进。

openGauss(2020年6月30日开源)在2019年9 月 19 日,在华为 CONNECT 大会上,华为宣布将开源其 GaussDB 数据库,开源后的产品被命名为 openGauss,这也是openGauss的“open”开头的由来。

2020年10月12日发布第一个正式公开版本——openGauss 101版本,2021年10月发布openGauss 210版本。一款开源关系型数据库管理系统,采用客户端/服务器,单进程多线程架构,支持单机和一主多备部署方式,备机可读,支持双机高可用和读扩展。采用木兰宽松许可证v2发行。2022年4月1号,30版本正式发布。openGauss内核源自PostgreSQL,深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性。

另外:OceanBase(2021年6月1号开源)阿里和蚂蚁集团开源的数据库,是完全自研的分布式关系数据库

TiDB(2015年4月开源)PingCAP 公司自主设计、研发的开源分布式关系型数据库,一款同时支持在线事务处理与在线分析处理的融合型分布式数据库产品。

tidb数据库和mysql的区别为:开发公司不同、事务更新机制不同、事务方式不同。

一、开发公司不同

1、tidb数据库:tidb数据库是北京的创业公司PingCAP的产品。

2、mysql:mysql是由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。

二、事务更新机制不同

1、tidb数据库:tidb数据库采用乐观锁机制来保证事务更新的一致性和持久性。

2、mysql:mysql采用redo log机制来保证事务更新的一致性和持久性。

三、事务方式不同

1、tidb数据库:tidb数据库使用的是扁平事务。

2、mysql:mysql使用的是分布式事务。

随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的 磁盘 IO 系统开销 ,甚至 性能 上的瓶颈,而单台服务器的 资源终究是有限 的。

因此在面对业务扩张过程中,应用程序对数据库系统的 健壮性 安全性 扩展性 提出了更高的要求。

以下,我从数据库架构、选型与落地来让大家入门。

数据库会面临什么样的挑战呢?

业务刚开始我们只用单机数据库就够了,但随着业务增长,数据规模和用户规模上升,这个时候数据库会面临IO瓶颈、存储瓶颈、可用性、安全性问题。

为了解决上述的各种问题,数据库衍生了出不同的架构来解决不同的场景需求。

将数据库的写 *** 作和读 *** 作分离,主库接收写请求,使用多个从库副本负责读请求,从库和主库同步更新数据保持数据一致性,从库可以水平扩展,用于面对读请求的增加。

这个模式也就是常说的读写分离,针对的是小规模数据,而且存在大量读 *** 作的场景。

因为主从的数据是相同的,一旦主库宕机的时候,从库可以 切换为主库提供写入 ,所以这个架构也可以提高数据库系统的 安全性 可用性

优点:

缺点:

在数据库遇到 IO瓶颈 过程中,如果IO集中在某一块的业务中,这个时候可以考虑的就是垂直分库,将热点业务拆分出去,避免由 热点业务 密集IO请求 影响了其他正常业务,所以垂直分库也叫 业务分库

优点:

缺点:

在数据库遇到存储瓶颈的时候,由于数据量过大造成索引性能下降。

这个时候可以考虑将数据做水平拆分,针对数据量巨大的单张表,按照某种规则,切分到多张表里面去。

但是这些表还是在同一个库中,所以库级别的数据库 *** 作还是有IO瓶颈(单个服务器的IO有上限)。

所以水平分表主要还是针对 数据量较大 ,整体业务 请求量较低 的场景。

优点:

缺点:

四、分库分表

在数据库遇到存储瓶颈和IO瓶颈的时候,数据量过大造成索引性能下降,加上同一时间需要处理大规模的业务请求,这个时候单库的IO上限会限制处理效率。

所以需要将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。

分库分表能够有效地缓解单机和单库的 性能瓶颈和压力 ,突破IO、连接数、硬件资源等的瓶颈。

优点:

缺点:

注:分库还是分表核心关键是有没有IO瓶颈

分片方式都有什么呢?

RANGE(范围分片)

将业务表中的某个 关键字段排序 后,按照顺序从0到10000一个表,10001到20000一个表。最常见的就是 按照时间切分 (月表、年表)。

比如将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据被查询的概率变小,银行的交易记录多数是采用这种方式。

优点:

缺点:

HASH(哈希分片)

将订单作为主表,然后将其相关的业务表作为附表,取用户id然后 hash取模 ,分配到不同的数据表或者数据库上。

优点:

缺点:

讲到这里,我们已经知道数据库有哪些架构,解决的是哪些问题,因此, 我们在日常设计中需要根据数据的特点,数据的倾向性,数据的安全性等来选择不同的架构

那么,我们应该如何选择数据库架构呢?

虽然把上面的架构全部组合在一起可以形成一个强大的高可用,高负载的数据库系统,但是架构选择合适才是最重要的。

混合架构虽然能够解决所有的场景的问题,但是也会面临更多的挑战,你以为的完美架构,背后其实有着更多的坑。

1、对事务支持

分库分表后(无论是垂直还是水平拆分),就成了分布式事务了,如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价(XA事务);如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担(TCC、SAGA)。

2、多库结果集合并 (group by,order by)

由于数据分布于不同的数据库中,无法直接对其做分页、分组、排序等 *** 作,一般应对这种多库结果集合并的查询业务都需要采用数据清洗、同步等其他手段处理(TIDB、KUDU等)。

3、数据延迟

主从架构下的多副本机制和水平分库后的聚合库都会存在主数据和副本数据之间的延迟问题。

4、跨库join

分库分表后表之间的关联 *** 作将受到限制,我们无法join位于不同分库的表(垂直),也无法join分表粒度不同的表(水平), 结果原本一次查询就能够完成的业务,可能需要多次查询才能完成。

5、分片扩容

水平分片之后,一旦需要做扩容时。需要将对应的数据做一次迁移,成本代价都极高的。

6、ID生成

分库分表后由于数据库独立,原有的基于数据库自增ID将无法再使用,这个时候需要采用其他外部的ID生成方案。

一、应用层依赖类(JDBC)

这类分库分表中间件的特点就是和应用强耦合,需要应用显示依赖相应的jar包(以Java为例),比如知名的TDDL、当当开源的 sharding-jdbc 、蘑菇街的TSharding等。

此类中间件的基本思路就是重新实现JDBC的API,通过重新实现 DataSource PrepareStatement 等 *** 作数据库的接口,让应用层在 基本 不改变业务代码的情况下透明地实现分库分表的能力。

中间件给上层应用提供熟悉的JDBC API,内部通过 sql解析 sql重写 sql路由 等一系列的准备工作获取真正可执行的sql,然后底层再按照传统的方法(比如数据库连接池)获取物理连接来执行sql,最后把数据 结果合并 处理成ResultSet返回给应用层。

优点

缺点

二、中间层代理类(Proxy)

这类分库分表中间件的核心原理是在应用和数据库的连接之间搭起一个 代理层 ,上层应用以 标准的MySQL协议 来连接代理层,然后代理层负责 转发请求 到底层的MySQL物理实例,这种方式对应用只有一个要求,就是只要用MySQL协议来通信即可。

所以用MySQL Navicat这种纯的客户端都可以直接连接你的分布式数据库,自然也天然 支持所有的编程语言

在技术实现上除了和应用层依赖类中间件基本相似外,代理类的分库分表产品必须实现标准的MySQL协议,某种意义上讲数据库代理层转发的就是MySQL协议请求,就像Nginx转发的是>

以上就是关于valuelesscolumn的好坏全部的内容,包括:valuelesscolumn的好坏、国内做分布式数据库开发的现状如何、如何看待 openGauss 坚持开源开放,打造面向数字基础设施的开源数据库的行为等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10198775.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存