热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sql占比计算_为nosql数据库设计一套通用的SQL

1no-sql数据库的标准化需求众所周知,业界主流的关系数据库长得普遍类似,因为有SQL规范约束,再另类的DB系统也不会太过于标新立异。所

1 no-sql 数据库的标准化需求

众所周知,业界主流的关系数据库长得普遍类似,因为有 SQL 规范约束,再另类的 DB 系统也不会太过于标新立异。所以,关系数据库系统通常具备良好的可替换性,从一种 DB 切换到另一种 DB,一般不必付出太大代价。

但不同厂商的 no-sql 系统差别巨大。

  • 因为 no-sql 起步比 sql 晚得多,目前还处于战国纷争时代,没有迹象表明主流 no-sql 可以归并了。

  • 主流厂商,尤其在 PaaS 层面提供服务的厂商,通常将 no-sql 实施手段与编程语言特性紧密捆绑,典型的如 Google 的 Cloud Datastore,这大大拉低了 no-sql 标准化能力。

对于国内用户,no-sql 可替换的需求远比国外强烈,几个成气候的云计算平台不够中立,像阿里云、腾讯云,自身都是互联网大玩家,其经营范围均覆盖一多半互联网业务。还有一家国外的,AWS,比较中立,技术也先进,可惜水土不服,大家选择 AWS 心里是不安的,哪天他们经营不下去了怎么办,类似 GAE 退出中国重演的机率其实不低。

当年笔者花了数月时间用 GAE 开发了一个论坛,即将上线,Google 说走就走,投入全都打水漂了。

fe66ab0d0a934241d7e0c26931d1a8ae.png

不过,事情也没那么悲观。我们做不到 no-sql 广泛可替换性,降低要求,实现小范围、有条件的可替换似乎也没那么难。在公有云领域,亚马逊处于绝对领先位置,据 Gartner 最近全球云市场份额报告显示,AWS 所占份额两倍于第二名至第十名份额的总和,这是一家独大的态势。在这一市场格局下,如果 AWS 提供的某项服务是优质的、技术领先的,那么,业界的技术标准就该向他看齐,而 AWS DynamoDB 正好满足此条件。

如果为 DynamoDB 设计一套通用的 SQL 规格,新兴云计算厂商推出的 no-sql 又是仿 DynamoDB 设计的,我们退而求其次的 “可替换性设计目标” 就达到了。况且,针对国内市场,新兴厂商向老大看齐,保持兼容性,能从老大那里分流部分用户,算是不错的市场策略。

2 已有 no-sql 数据库的 DSL 设计

为 no-sql 数据库套一层类 SQL 的 DSL 描述层在业界较常见,像 Google 为他的 Cloud Datastore 加了一层 GQL 描述,针对 DynamoDB 业界也有数个增设 SQL 层的开源项目。这里,我先简单介绍这些 SQL-like 的规格特色。

Google 的 GQL 只提供 SELECT 查询,只读不写,我估计它之所以不支持记录更新,是因为 Datastore 的字段读写已融入编程特性,以对象化方式描述表、记录、字段,写操作是直接的赋值语句,上下文还融合了事务处理语句。所以,让 GQL 支持数据库写操作反而会变得不方便。

给 DynamoDB 追加 SQL 的开源项目在 github 能找到五个以上,做得较好有:

  • DynamoDb.SQL

  • DQL

  • dynamodb-sql

DynamoDb.SQL 基于 .Net 平台,只供查询,没支持 update、delete 等写操作,DQL 基于 Python,有查询,也提供 insert、update、delete 等写操作,甚至还提供 create table 操作。dynamodb-sql 基于 Javascript,设计功能较全,遗憾的是,功能还没做完作者停止开发了。

这些项目总有一些缺陷,尤其未注重 “通用性”设计,在跨 DB 可移植方面考虑得较少。具体而言,像 create table、descript table 这类跨越 DB 很难寻求一致设计的指令就不该去做;还有一些专属特性,应理解为“配置参数”,而非表现为 SQL 语言规格,做成语言规格就不容易跨 DB 获得普遍支持。

因为缺少现成的,我们就自己动手新做了一个,即 dynamo-sql,用 Javascript 开发,已在 github 上开源。

3 SQL 与 NO-SQL 的差异

SQL 作为一种领域专用语言(Domain Specific Language,DSL),之所以在传统数据库上产生,无非为了达到 “一致规格”“简化应用”两个目的,我们为 DynamoDB 设计 SQL 也同样基于这两个目的。但针对 no-sql 的 DSL 设计似乎更麻烦些,因为你面对的是 “非结构化” 的数据表,得针对传统数据库与 no-sql 数据库的关键差异,有重点的去解决问题。

先来对比 SQL 与 no-sql 的差异,我截一张图放给大家看看:

662043aa5ea50658e4ee7e1451a62089.png

SQL vs. NO-SQL

图中对比的是 Google 的两类数据库服务,Datastore 是 no-sql,Cloud SQL 是在云端开放的类似 MySQL 的传统 DB 系统。传统 SQL 在查询、事务处理、一致性方面占优,而在横向伸展、易管理、Schema 变更方面不如 no-sql。

尽管 MySQL 为应对伸展扩容问题,也发展出 “分片” 等技术,但本质没变,拿它去解决该用 no-sql 实现的系统,就像破漏的船只,无论怎么修补,都无法从根上解决问题。

事实上,在微服务框架体系里,什么时候该用 SQL,什么时候该用 no-sql,划分标准还是很清晰的,数据库如何选型也实际指导了微服务如何划分。一个产品如果没采用微服务架构,SQL 与 no-sql 如何选型是个大问题,而微服务框架下,在两大 DB 之间如何选择就不该成问题。

要命的是,某新兴公有云服务商还缺一个像样的 no-sql 系统,手头只一把锤子,于是尝试用传统那套东西解决所有问题,既然都进军公有云了,还陷在私有云思路里,迟早会出问题的。

回到 no-sql 的本质,我想,抓住 “分级索引”特性是问题的关键。以 DynamoDB 为例,有 “主键”,没 “外键”,主键又有 “分区键” 与 “排序键”,分区键提供全局检索,相当于有两层表格体系:

  • 解决某条记录的全局检索,决定把它的内容保存到哪个分区中

  • 指定分区中表格,分区确定了,在分区内建立的索引称为 “本地二级索引”,即 LSI。如果单以主键还满足不了全局查询的需求,那就再建 “全局二级索引”,即 GSI。

由于索引方式差别巨大,SQL 与 no-sql 在 DSL 表述时,也表现出巨大差异。比如,后者的 DSL 不再支持多索引联合查询,也不支持 join 等复杂操作。不过,no-sql 在查询的过滤条件,update 前的判断条件等,有更丰富支持。

4 不过度封装

AWS-SDK 的 DynamoDB 通过类似如下代码操作数据库:

9dc919edfcae4e2e5656acca29405047.png
  • 对于 GET 操作,调用 dynamodb.getItem

  • 对于 PUT 操作,调用 dynamodb.putItem

其它操作,如 SELECT、SCAN、UPDATE、DELETE 等都通过不同 API 调用实现,各 API 规格一样,都用 params 参数指明如何操作。所以,我们封装的 SQL 语句,经翻译,都准确生成所需的 params 参数,再由 AWS-SDK 最后实现数据库作业。

如何封装 SQL?我们面临两种选择:

  • 简单处理,近似于直译,让 SQL 的能力与 AWS-SDK 提供的接口一一对应

  • 提供 PaaS 级别的封装,把易用性再提高一些

AWS 的 DynamoDB 按官方的提法,是 IaaS 层面的服务,与之可对照的是 Google 的 Datastore,是 PaaS 服务。这两种 DB 除了规格特性不同之外,所谓 IaaS 与 PaaS 的差别,无非后者稍多一点封装而已,实质差别并不大。

最终我们还是选择了简单直译的方式,如果想多封装些,也就下面几点可改进:

  • 追加事务处理

  • 索引与排序做点优化

5 兼容 S3 Select 查询

AWS 新近推出 S3 Select 服务,它用一种类似 SQL 的查询语句,直接用一个命令提取 S3 文件,一般是 CSV 数据表文件,然后由 S3 实施查询,只返回合乎条件的数据集,而不是 CSV 整个文件的内容。这项服务可节约不少流量成本,结合 S3 的静态网站功能显得比较有意义。

既然,我们为 DynamoDB 封装了 SQL,为什么不把这 SQL 规格延伸到 S3 呢?让 DynamoDB 提供强服务 DB,让 S3 提供弱服务 DB,形成双级服务机制

如下是查询 S3 文件 DB 的例子:

eeac3607ea7eb6c7df611c303f66fa19.png

与查询 DynamoDB 差别在于,表名要有 "/" 分隔。此特性目前还没实现(语法分析已支持),留以后去做。

不多说了,dynamo-sql 项目的代码量不大,感兴趣的童鞋请读源码。

End.

作者:程序强

来源:简书

零基础入职数据分析就业班

课程的形式主要是“直播+录播”

报名专享:课程项目作业+1v1班主任监督学习+爱数据学院学员专属网站+班级答疑群

课程结束后能熟练掌握SQL、Python、Excel、PPT等工具

适合人群:

1.转行(岗位相关,专业相关、对数据分析感兴趣)

2.从事数据分析工作,但是需要提升技能以及增加实战经验

3.应届毕业生入职数据分析

413ee1cdd06d0310ccfe1c4821dec7ad.png


推荐阅读
  • 为何Serverless将成为未来十年的主导技术领域?
    为何Serverless将成为未来十年的主导技术领域? ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 本文讨论了在进行 MySQL 数据迁移过程中遇到的所有 .frm 文件报错的问题,并提供了详细的解决方案和建议。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 资源管理器的基础架构包括三个核心组件:1)资源池,用于将CPU和内存等资源分配给不同的容器;2)负载组,负责承载任务并将其分配到相应的资源池;3)分类函数,用于将不同的会话映射到合适的负载组。该系统提供了两种主要的资源管理策略。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • MySQL:不仅仅是数据库那么简单
    MySQL不仅是一款高效、可靠的数据库管理系统,它还具备丰富的功能和扩展性,支持多种存储引擎,适用于各种应用场景。从简单的网站开发到复杂的企业级应用,MySQL都能提供强大的数据管理和优化能力,满足不同用户的需求。其开源特性也促进了社区的活跃发展,为技术进步提供了持续动力。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • Linux学习精华:程序管理、终端种类与命令帮助获取方法综述 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
author-avatar
mobiledu2502853597
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有