云开发数据库VS传统数据库丨云开发101
云开发数据库与传统数据库的不同
在小程序·云开发中,最核心的便是三大组件:数据库、云存储和云函数,从今天开始,我们将开始隔日更的专栏文章,云开发101,在第一周,我们将从最最核心的数据库开始说起。
云开发数据库简介
首先,我们先来了解一下云开发的数据库,云开发数据库是由云开发团队提供给云开发用户的数据库服务,开发者可以在小程序、云函数等环境中,通过简洁易懂的函数调用,来获取到对应的数据,方便开发者快速完成业务逻辑中关于数据库的部分。
在开发过程中,你可以使用诸如 wx.cloud.database().collection('data').where({"age":10}).get()
这样的方法获取到数据库中的信息,而无需再通过服务端提供的 API 完成数据库请求,将数据查询的权力下放到小程序端,加快应用的迭代效率。
云开发数据库底层技术简介
云开发数据库所使用的是 NoSQL (Not Only SQL)数据库方案中的 MongoDB 数据库。MongoDB 数据库是目前业界发展的最好的 NoSQL 数据库,可以让开发者以 SQL 和 NoSQL 两种方式完成数据库结构的建设,快速完成应用的开发。
NoSQL 与 SQL
我们在传统的 Web 应用开发过程中,大多使用的是 SQL 数据库,如 Oracle、SQLite、MySQL、MSSQL 等,但云开发所使用的 MongoDB 则是完全不同的数据库方案,因此,在进行数据库结构设计时,也有所不同。错误的思考模型,会使得你在后续的应用开发过程中,给自己带来无尽的麻烦。因此,也就有了我们这篇文章,向你介绍 NoSQL 世界的魅力。
Schemaless 带来的特性
在我们使用 SQL 数据库开发时我们需要先行设计好数据库的结构、数据表的结构等,而 NoSQL 型数据库,因此,让我们在开发的时候,也会有了不同的开发模式。我们无需在进行应用开发时,先行添加表结构,我们只需要根据我们自己的使用情况,随时增加、删除新的字段,完成自己的业务需求,也正是这种自由,使得云开发有了快速开发、快速迭代的特性。
云开发数据库结构设计思路
由于云开发所使用的数据库类型与我们所熟悉的数据库类型不同,因此,在开发的时候,我们也要相应的修改我们的数据库结构,以适配 NoSQL 数据库的各项特性,从而降低编程时的复杂度,又好又快的满足自己的业务需求。
和 SQL 数据库不同, MongoDB 数据库由于其存储结构从设计之初便是考虑分布式、多节点存储,其 Best Practice 是「以空间换时间」,因此,在设计应用数据结构时,不要考虑应用的数据存储空间,而是更多思考,如何以更快的速度将数据查询出来。
但是,数据库的设计不能完全追求时间,也要思考编程的复杂程度,平衡时间、空间与编程复杂度,以一个更好的方式完成自己的数据库设计。
举个例子,因为极度追求数据的空间换时间,整个数据系统的多种数据仅设计一个集合,所有的数据都挂在一个集合中,显然是不合理的,这种存储会导致应用后续的迭代造成麻烦。
同样的,极度的不追求空间换时间,也是一种错误的选择,如果你将所有的数据都放在各自的独立集合中,则会造成没有很好的利用 NoSQL 数据库的特性,也会使得你的后续编程变得麻烦。
因此,在使用云开发数据库时,我们需要思考我们的业务发展方向,将可能会用到的场景进行割离,思考应用的数据库结构,从而确保自己的应用在后续开发的时候不出问题。
云开发数据库使用常见问题
在实际的应用中,我们也看到,不少人因为不熟悉 NoSQL 的数据库设计理念,在实际开发过程中,出现了不少的问题,这里我们一一讨论一下。
自建主键属性
在 MongoDB 数据库中,数据存储使用的是 ObjectID,因此,其数据的 ID 并非 1 ,2 ,3 ,4 ,而是一个类似于 a718a0f318d76 hash 值,不少人在开发时,因为认为没有自增的数据,无法完成数据排序,就自行实现了一个自增的 ID,每次新增的时候,都重新查询一遍,获取最新的值以后, 再重新新增数据。
但实际上,我们可以有一种更加优雅和方便的工具来完成这种需求,那就是新增一个字段 created_at,这个字段的值设置为当前时间的时间戳 Timestamp。当你后续需要进行数据按新增的数据进行排序时,可以使用这个字段进行逆序排序,同时,因为这个数据使用的是当前的时间数据,你还可以将其用于数据的「创建于XX年XX月XX日」的功能,完成自己的业务需求。这个数据除了能进行直接的排序,还可以用于后续按日期导出数据,比如筛选出某一个特定时间段的数据。
相比于一个自增的 ID,created_at 更加的简单易用,同时,因为不需要提前获取上一条记录中这个字段的值,可以有效的降低数据的查询次数。
时间存储问题
在我们进行业务逻辑开发时,时间数据的获取是不可或缺的,不少人习惯于使用一个可视化的日期数据,便会将数据库中的日期字段设置为 2019-09-09,以便于在使用时直接输出到数据库中,但实际上在开发过程中,建议大家存储时间戳 Timestamp 来作为具体的时间。
这是因为 2019-09-09 的数据并非一个可以用于排序的字段,在后续开发的过程中,因为你使用的是字符串作为时间,如果你需要将数据进行排序,将会无法排序或出现排序错误的情况;此外,因为你存储的是字符串类型的时间,那么后续如果你的业务需求发生了展示形式的变化,会导致你花费大量的时间去修改所有数据的时间,或者在数据的读取和存储时进行多次格式转换,徒增麻烦。
因此,对于时间存储有需求的,我们一贯建议大家使用时间戳来存储,因为时间戳是一个数字类型的数据,因此可以直接进行大小的比对,同时,因为时间戳的数据是全球统一的,如果你的应用后续有全球化的需求,也可以很好的支持。
无法区分是否要拆分为独立的数据集合存储
在进行云开发的数据应用开发的时候,我们发现,不少开发者的疑问是,我所使用的数据,是否有必要进行独立拆分出一个 Collection 来进行数据存储。
这个问题我们可以以一些简单的问题来判断:
- 你所使用的数据是否有排序的需求?
- 你所使用的数据是否有修改的需求?
- 你所使用的数据除了在此处使用,是否还在其他地方使用?
这里我们举几个例子来说明一下,比如说,我们有一个需求,是为一个内容发布系统的文章新增评论功能,那么我们应该如何完成这部分呢?
如果你的评论数据没有排序、修改,也仅在此处使用,你可以考虑将评论数据放在文章数据中的一个子属性中,这样可以有效的完成数据查询,你在文章进行查询的时候,直接将评论数据查询出来,并进行显示,十分的方便。
如果你的评论数据有排序、修改以及其他地方使用的需求,那么就建议你将评论数据单独存放在一个集合中,以便在后续完成排序、更新和调用,如果此时你将其放在文章数据中,在后续查询时就会有很多问题,操作起来极为不便,给自己徒增烦恼。
当然,具体情况具体分析,如果你在分析完成后,依然没有答案,可以在公众号后台提出你的问题,我们将尽快给您回复。
总结
在本次的文章中,我们分享了云开发所使用的 NoSQL 数据库与传统的 SQL 数据库的区别,以及因为这种区别所带来的开发体验上的不同,理解这些基础内容,将会帮助你更好的应用云开发数据库开发你自己的产品。
如果你对于云开发有任何问题,都欢迎你在文章留言出留下你的疑问,我们将一一解答。
宣发渠道
渠道:掘金、微信、知乎、KM
可适用主题:小程序云开发相关、SQL 数据库相关、NoSQL 数据库相关
如果你想要了解更多关于云开发CloudBase相关的技术故事/技术实战经验,请扫码关注【腾讯云云开发】公众号~
云开发数据库VS传统数据库丨云开发101的更多相关文章
- 7 家 IT 厂商 6394.5 万元中标天津公安云项目(虚拟化、数据库、软件开发)
http://mp.weixin.qq.com/s/kjum54HJorGTPtZiM-HE1g 天津市公安局云计算平台项目分为:大数据部分.虚拟化部分.数据库部分,软件开发部分,预算分别为:2350 ...
- 数据库周刊28│开发者最喜爱的数据库是什么?阿里云脱口秀聊程序员转型;MySQL update误操作;PG流复制踩坑;PG异机归档;MySQL架构选型;Oracle技能表;Oracle文件损坏处理……
热门资讯 1.Stackoverflow 2020年度报告出炉!开发者最喜爱的数据库是什么?[摘要]2020年2月,近6.5万名开发者参与了 Stackoverflow 的 2020 年度调查,这份报 ...
- 邀您共赴数据库学术顶会ICDE 2019——阿里云专场 零距离接触达摩院数据库“最强大脑”
摘要: 当学术大家遇到技术大拿,会碰撞出怎样的火花?为进一步加深产学研学术交流,阿里云将于ICDE 2019大会期间(4月9日)举办以“云时代的数据库”为主题的技术专场(Workshop) 作为全球数 ...
- 阿里云资深DBA专家罗龙九:云数据库十大经典案例分析【转载】
阿里云资深DBA专家罗龙九:云数据库十大经典案例分析 2016-07-21 06:33 本文已获阿里云授权发布,转载具体要求见文末 摘要:本文根据阿里云资深DBA专家罗龙九在首届阿里巴巴在线峰会的&l ...
- jdbc连接阿里云服务器上的MySQL数据库 及 数据库IP限制
问题1:Jdbc 如何连接阿里云服务器上的MySQL数据库? 解决: 上截图: 其中IP是阿里云服务器的公网IP地址. 问题2: 刚开始接手开发的时候,使用Navicat连接阿里云服务器上的数据后 ...
- 微信小程序云函数 添加数据到数据库
1.新建小程序,建立云开发快速启动模板 这里和普通小程序的区别有三点 一是 project.config.json写上云函数所在目录"cloudfunctionRoot": &qu ...
- 使用JDBC操作SAP云平台上的HANA数据库
本文假设您对JDBC(Java Database Connectivity)有最基本的了解.您也可以将其同ADBC(ABAP Database Connectivity)做对比,细节请参考我的博客AD ...
- JPA + EclipseLink + SAP云平台 = 运行在云端的数据库应用
JPA(Java Persistence API)的实现Provider有Hibernate,OpenJPA和EclipseLink等等. 本文介绍如何通过JPA + Eclipse连接SAP云平台上 ...
- 阿里云RDS与ECS服务器数据库做主从
阿里云RDS与ECS服务器数据库做主从 [精] 里云RDS(数据库)基于飞天大规模分布式计算和存储能力,提供超高性价比的单机版实例,同时利用读写分离横向扩展读能力,满足网站类的业务需求.提供稳定.高性 ...
随机推荐
- 闯荡Ext-第一篇
今天在网上找到了一本非常好的书:<Ext江湖>,这本书是由大漠穷秋大神写的,刚看到这本书的时候,心里面的那个激动劲啊,本来原先的时候心里面就一直念叨着想要学习Ext,但是苦于找不到好的资料 ...
- 10分钟安装Elasticsearch
关注公众号 itweknow,回复"ES"获取<Elasticsearch权威指南 中文版>. 最近在尝试着搭建一个ELK(一个开源的实时日志分析平台),而本文所讲的E ...
- RocketMQ中PullConsumer的消息拉取源码分析
在PullConsumer中,有关消息的拉取RocketMQ提供了很多API,但总的来说分为两种,同步消息拉取和异步消息拉取 同步消息拉取以同步方式拉取消息都是通过DefaultMQPullConsu ...
- 解决树莓派烧录系统后没有boot文件,只出现盘符问题
首先,如果下图情况,说明你没有烧录好,继续向下看 放一张安装成功的图片 出现这个的原因是因为前期没有烧录好,它会回滚到img文件中,如果中途退出,它会写入到img文件中 正确文件大小(Raspbian ...
- 夯实Java基础(十七)——注解(Annotation)
1.注解概述 从JDK5.0开始,Java增加对元数据(MetaData)的支持,也就是注解(Annotation).其实我们早就已经接触过注解了,例如我们经常在Java代码中可以看到 “@Overr ...
- Go调度器介绍和容易忽视的问题
本文记录了本人对Golang调度器的理解和跟踪调度器的方法,特别是一个容易忽略的goroutine执行顺序问题,看了很多篇Golang调度器的文章都没提到这个点,分享出来一起学习,欢迎交流指正. 什么 ...
- js-EventLoop
1.浏览器事件环 eventLoop是由js的宿主环境(浏览器)来实现的 事件循环可以简单的描述为以下四个步骤 1.函数入栈,当Stack中执行到异步任务的时候,就将他丢给WebAPIs,接着执行同步 ...
- 史上最全面的SignalR系列教程-4、SignalR 自托管全解(使用Self-Host)-附各终端详细实例
1.概述 通过前面几篇文章 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 史上最全面的Signa ...
- 解决pyinstaller打包可执行文件,存放路径包含中文无法运行的问题
一.实验环境 1.Windows7x64_SP1 2.anaconda2.5.0 + python2.7(anaconda集成,不需单独安装) 3.pyinstaller3.0 二.问题描述 1.使用 ...
- SpringBoot进阶教程(六十一)intellij idea project下建多个module搭建架构(下)
在上一篇文章<SpringBoot进阶教程(六十)intellij idea project下建多个module(上)>中,我们已经介绍了在intellij idea中创建project之 ...