数据库概述
云数据库是 CloudBase 提供的核心功能之一。
目前云数据库提供了两种类型的数据库:文档型数据库和 MySQL 型数据库。在实际使用时,可以根据需要选择使用一种或两种同时使用。
这两种类型的数据库均为全 Serverless 架构的云原生数据库。开通即可使用,支持按实际计算和存储资源使用量收取费用。
另外,除云开发本身提供的数据库外,同时也支持了对接用户自有的 MySQL 类型数据库。在自有数据库本身通过公网可访问的情况下,云开发提供了对接和使用此类数据库的能力。
云数据库(文档型)
在一个云开发环境中,有且仅有一个云数据库(文档型)实例,此实例可以和其他数据库实例共存。
在文档型数据库中,包含如下概念:
概念介绍
集合(Collection)
集合是读写操作的主要对象,每个集合都有一个集合名,如 users
、articles
等。
在数据库实例中可以创建多个集合。
集合由多条记录组成,任何记录必须从属于某个集合。
记录(Record / Document)
云数据库是一种文档型数据库,数据库中的每条记录都是一个类似 JSON 格式的对象,例如:
{
"name": "Tom",
"age": 18,
"location": {
"country": "China",
"province": "Guangdong",
"city": "Shenzhen"
}
}
特殊字段
_id 字段
云数据库(文档型)中,每条记录都有一个 _id
字段作为这条数据的唯一标识,在插入记录时会自动生成。
您也可以使用自定义的 _id
,但需要保证全局唯一性。
_openid 字段
云数据库(文档型)中,每条记录中可能存在 _openid
字段,用于标识记录的创建者,它会在插入记录时,根据用户身份自动生成。
调用来源 | _openid 含义 |
---|---|
微信小程序 | 用户的微信 OpenID |
Web SDK | 用户的云开发 Uid |
在服务端(例如云函数)或者管理端(例如控制台)中创建的记录,不会自动生成 _openid
字段,因为这是属于管理员创建的记录,并不属于某个用户。
访问方式
云数据库(文档型)可以在用户端(如 Web 网页、小程序、Flutter)内调用,也可以在服务端(如服务器、云函数)内调用。
更多调用方式,可见云数据库(文档型)的 SDK 文档说明,及 API 文档说明。
用户端调用
通过用户端调用时,需要先进行云开发的登录鉴权,然后以用户的身份进行数据库的读写操作。
用户端的代码是可能对外暴露的(例如 Web 网页),攻击者可能通过抓取、伪造请求的方式盗用或消耗您的 CloudBase 资源,所以我们提供了用户端上的登录鉴权机制来保护您的资源安全。
- Web
- 小程序
const cloudbase = require("@cloudbase/js-sdk");
const app = cloudbase.init({
env: "xxxx"
});
/**
登录鉴权流程,此处代码略,请参考:
https://docs.cloudbase.net/authentication/introduce.html
*/
// 1. 获取数据库引用
var db = app.database();
// 2. 构造查询语句
db
// collection() 方法获取一个集合的引用
.collection("books")
// where() 方法传入一个 query 对象,数据库返回集合中字段等于指定值的 JSON 文档。
.where({
name: "The Catcher in the Rye"
})
// get() 方法会触发网络请求,往数据库取数据
.get()
.then(function (res) {
console.log(res);
// 输出 [{ "name": "The Catcher in the Rye", ... }]
});
// 1. 获取数据库引用
const db = wx.cloud.database();
// 2. 构造查询语句
db
// collection() 方法获取一个集合的引用
.collection("books")
// where() 方法传入一个 query 对象,数据库返回集合中字段等于指定值的 JSON 文档。
.where({
name: "The Catcher in the Rye"
})
// get() 方法会触发网络请求,往数据库取数据
.get()
.then(function (res) {
console.log(res);
// 输出 [{ "name": "The Catcher in the Rye", ... }]
});
服务端调用
通过服务端调用时,需要在 SDK 初始化参数中,填入腾讯云密钥(SecretID 和 SecretKey),然后以管理员身份进行数据库的读写操作。
在 CloudBase 云函数内使用服务端 SDK 时,开发者不需要填入腾讯云密钥即可使用。
- Node.js
const cloudbase = require('@cloudbase/node-sdk')
const app = cloudbase.init({})
// 1. 获取数据库引用
var db = app.database();
exports.main = async (event, context) => {
// 2. 构造查询语句
const res = await db
// collection() 方法获取一个集合的引用
.collection("books")
// where() 方法传入一个 query 对象,数据库返回集合中字段等于指定值的 JSON 文档。
.where({
name: "The Catcher in the Rye"
})
// get() 方法会触发网络请求,往数据库取数据
.get()
return {
res
}
}
云数据库(MySQL型)
在一个云开发环境中,有且仅有一个云数据库(MySQL型)实例,此实例可以和其他数据库实例共存。
在 MySQL 型数据库中,包含如下概念:
表(Table)
表(Table)是 MySQL 类型数据库中的基本组成单元,用于存储数据。表由行(Rows)和列(Columns)组成,行代表表中的每条记录,列代表记录中的字段。表具有唯一的名称,用于标识和区分不同的表。
MySQL 类型数据库中表的概念,与文档型数据库中集合的概念类似。
行(Rows)
MySQL类型数据库中,表中的行(Rows)代表表中的每条记录,每行包含了一组数据,每个数据对应表中的一个列。
MySQL 类型数据库中行的概念,与文档型数据库中记录的概念类似。
列(Column)
MySQL类型数据库中,表中的列定义了表中存储的数据的结构。每列具有一个名称和数据类型,数据类型定义了该列可以存储的数据的类型,如整数、字符串、日期等。
当前提供的 MySQL 版本为 8.0。当前的云数据库(MySQL型),未对外提供可直接访问的 IP、端口等信息。针对数据库的管理,可使用数据库管理工具(DMC),在调用数据库时,除通过数据模型方法读写数据外,也额外提供了数据库的原生查询命令,可用于执行 SQL 语句,获得和原生数据库的相同使用体验。
自有 MySQL 数据库
在云开发环境中,可以创建多个自有 MySQL 数据库连接配置,每一个连接配置对应了一个 MySQL 的 DB。
在创建自有 MySQL 数据库连接配置时,通常配置如下信息:
- 主机:MySQL 数据库所在服务器的域名或 IP 地址
- 端口:MySQL 数据库的端口号,默认为 3306
- 数据库名:MySQL 数据库的名称
- 用户名:MySQL 数据库的用户名
- 密码:MySQL 数据库的密码
- 超时配置: 连接超时配置,默认 5 秒
- 连接参数:数据库连接参数支持字符集、语句缓存、读写超时时间、自动提交等参数,用以优化和控制数据库连接的行为
在使用自有 MySQL 数据库时,可以在一个库中创建多个表及对应的数据模型,也可以在不同库中创建表及模型。但是在数据模型配置关联关系时,关联模型不可跨不同的数据库,即在云数据库(文档型)、云数据库(MySQL型)、不同的自有数据库的DB间,无法配置关联关系。
IP 白名单
暴露在公网的自建 MySQL 数据库通常需要配置 IP 白名单以防止非法访问。可以将如下 IP 加入 IP 白名单以放通云开发数据模型组件的访问,添加时需要全部添加到白名单中:
175.24.211.44,
175.24.212.162,
175.24.213.48,
175.24.214.104,
175.24.214.93,
49.234.25.245,
49.234.27.58,
49.234.3.160,
49.234.34.31,
49.234.35.33,
数据库选型
当前在云开发提供了3种数据库的情况下,如何选择哪种数据库使用呢?可以参考如下表格进行数据库选择:
| 数据库类型 | 优势 | | 云数据库(文档型) | 数据结构更灵活,更适合大规模扩展,MongoDB语法的查询能力 | | 云数据库(MySQL型) | 结构化数据模型,支持标准的SQL语句访问方式 | | 自有 MySQL 数据库 | 已有的数据可以直接访问并使用,自有数据库可以更灵活可控 |