云开发数据库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 来进行数据存储。

这个问题我们可以以一些简单的问题来判断:

  1. 你所使用的数据是否有排序的需求?
  2. 你所使用的数据是否有修改的需求?
  3. 你所使用的数据除了在此处使用,是否还在其他地方使用?

这里我们举几个例子来说明一下,比如说,我们有一个需求,是为一个内容发布系统的文章新增评论功能,那么我们应该如何完成这部分呢?

如果你的评论数据没有排序、修改,也仅在此处使用,你可以考虑将评论数据放在文章数据中的一个子属性中,这样可以有效的完成数据查询,你在文章进行查询的时候,直接将评论数据查询出来,并进行显示,十分的方便。

如果你的评论数据有排序、修改以及其他地方使用的需求,那么就建议你将评论数据单独存放在一个集合中,以便在后续完成排序、更新和调用,如果此时你将其放在文章数据中,在后续查询时就会有很多问题,操作起来极为不便,给自己徒增烦恼。

当然,具体情况具体分析,如果你在分析完成后,依然没有答案,可以在公众号后台提出你的问题,我们将尽快给您回复。

总结

在本次的文章中,我们分享了云开发所使用的 NoSQL 数据库与传统的 SQL 数据库的区别,以及因为这种区别所带来的开发体验上的不同,理解这些基础内容,将会帮助你更好的应用云开发数据库开发你自己的产品。

如果你对于云开发有任何问题,都欢迎你在文章留言出留下你的疑问,我们将一一解答。

如果你想要了解更多关于云开发CloudBase相关的技术故事/技术实战经验,请扫码关注【腾讯云云开发】公众号~

1649686-20190912102359956-2122943116.png

转载于:https://www.cnblogs.com/CloudBase/p/11510498.html

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

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

相关文章

前端学习(10):HTML语义化

我理解的HTML语义化 经过查看别人博文中的一些描述,我将HTML的语义化总结为: 用最恰当的标签来标记内容。 该如何理解呢?比如需要加入一个标题,这个标题的字体比正文的要大写,还要加粗。能够实现这种效果的方法有很多…

大尾端 小尾端

提到体系结构时,经常遇到大小尾端的概念,这里做个总结。 big endian:大尾端,也称大端(高位)优先存储。little endian:小尾端,也称小端(低位)优先存储。如下00…

Storm的BaseBasicBolt源码解析ack机制

我们在学习ack机制的时候,我们知道Storm的Bolt有BaseBasicBolt和BaseRichBolt。 在BaseBasicBolt中,BasicOutputCollector在emit数据的时候,会自动和输入的tuple相关联,而在execute方法结束的时候那个输入tuple会被自动ack。 在使…

博客中gitalk最新评论的获取 github api使用

博客中,对于网友的评论以及每篇文章的评论数还是很重要的。但是基于静态的页面想要存储动态的评论数据是比较难的,一般博客主题中都内置了评论插件,但是博客主题中对于最新评论的支持显示还是很少的,至少目前我是没怎么发现。博客…

前端学习(11):标题和段落

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>标题和段落</title> </head> <body><h1>我是歌谣</h1><h2>我是歌谣</h2><h3>我是歌谣</h3>&l…

Kafka文件存储机制

Kafka是什么 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、分区的、多副本的、多订阅者&#xff0c;基于zookeeper协调的分布式日志系统(也可以当做MQ系统)&#xff0c;常见可以用于web/nginx日志、访问日志&#xff0c;消息服务等等&#xff0c;Linkedin于2010年贡…

用Zend Encoder加密PHP文件和PHP 优化配置

在发布一个你写好的PHP程序时&#xff0c;你是不是担心自已辛苦写出来的成果会被别人占为已有呢&#xff1f;其实我们可以用Zend Encoder为我们的PHP文件加上一层保护壳。 软件版本&#xff1a;2.0.1软件大小&#xff1a;10.2M适用平台&#xff1a;Win9X/2000/XP官方网址&#…

【vue开发】vue插件的install方法

MyPlugin.install function (Vue, options) {// 1. 添加全局方法或属性Vue.myGlobalMethod function () {// 逻辑...}// 2. 添加全局资源Vue.directive(my-directive, {bind (el, binding, vnode, oldVnode) {// 逻辑...}...})// 3. 注入组件Vue.mixin({created: function ()…

笑话

有一次坐公交拿了IC卡排队上车&#xff0c;前面一个人是扔硬币的&#xff0c;我大脑短路跟着把IC卡扔进去了…… ●早上要戴隐形眼镜&#xff0c;结果把盖打开直接把眼镜倒马桶里,然后镇定地倒入新的护理液,准备摘眼镜&#xff0c;半天摘不下来。 ●邻居忘了带钥匙&#xff0c;…

kafkaspot在ack机制下如何保证内存不溢

storm框架中的kafkaspout类实现的是BaseRichSpout&#xff0c;它里面已经重写了fail和ack方法&#xff0c;所以我们的bolt必须实现ack机制&#xff0c;就可以保证消息的重新发送&#xff1b;如果不实现ack机制&#xff0c;那么kafkaspout就无法得到消息的处理响应&#xff0c;就…

云开发0基础训练营第二期热力来袭!

第二期云开发0基础训练营热力来袭&#xff01;课程升级、更佳体验、依旧免费&#xff01;每年的 “金九银十” 都是传说中的学习黄金期&#xff01;这期间在校的小伙伴面临开学季/求职季/考研季挑战&#xff0c;已经步入社会的也即将步入年终前的冲刺阶段。所以&#xff0c;这段…

前端学习(14):相对路径和绝对路径

目录结构 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" conte…

discuz数据从godaddy主机中导出的mysql数据乱码变问号???的解决方法

从godaddy主机导出的mysql数据安装在本地电脑上发现原来的中文都变成了问号&#xff1f;godaddy主机中的数据库版本是5.0.67&#xff0c;charsetutf8 collationutf8_general_ci 而我的supesite的版本是gbk的&#xff0c;导出的数据也是 CREATE TABLE cdb_access (……) ENGINE…

jvm的新生代和老年代简介

新生代分为三个区域&#xff0c;一个Eden区和两个Survivor区&#xff0c;它们之间的比例为&#xff08;8&#xff1a;1&#xff1a;1&#xff09;&#xff0c;这个比例也是可以修改的。通常情况下&#xff0c;对象主要分配在新生代的Eden区上&#xff0c;少数情况下也可能会直接…

Python 连接redis密码中特殊字符问题

连接方法&#xff1a; self.pool redis.ConnectionPool.from_url(self.redis_url)opredis redis.Redis(connection_poolself.pool)redis_url redis://:cot$#D4^&1234172.31.26.174:6379/0 直接连redis会报错&#xff0c;报错主要内容&#xff1a; ValueError: invalid l…

浅谈yield

c#1.0使用foreach 语句可以轻松地迭代集合。在c#1.0中&#xff0c;创建枚举器仍需要做大量的工作。c#2.0添加了yield语句&#xff0c;以便于创建枚举器。下面我们浅谈下yield的使用&#xff1a; 1、包含yield语句的方法或属性称为迭代块。迭代块必须声明为返回IEnumerator或IEn…

NIO核心框架介绍

NIO共引入了4个概念&#xff1a; - 缓存区&#xff1a;表示数据存放的容器&#xff0c;提供可读写的数据缓存区&#xff1b; - 字符集&#xff1a;用来对缓存数据进行解码和编码&#xff0c;在字节和Unicode字符之间转换&#xff1b; - 通道&#xff1a;用来接收或发送数据&…

前端学习(16):跳转链接小练习

点击图片实现跳转 目录结构 header.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&q…

云开发的数据库权限机制解读丨云开发101

在使用云开发进行开发时&#xff0c;数据库权限是一个让不少人困扰的部分&#xff0c;四种数据库权限&#xff0c;到底是什么意思&#xff1f;其各自的权限、应用场景都是什么&#xff1f;大多数人对于这个机制&#xff0c;还是模糊的。为了帮助大家进行更好的开发&#xff0c;…

jremind V0.1.3.0添加透明

这次就把弹出消息的窗口改成了透明&#xff0c;本来说是做鼠标穿透的&#xff0c;给做成了透明&#xff0c;先用着&#xff01;有时间了再改了。 转载于:https://www.cnblogs.com/joypen/archive/2009/05/11/1693125.html