跳到主要内容

数据库概述

云数据库是 CloudBase 提供的核心功能之一。

目前云数据库提供了两种类型的数据库:文档型数据库和 MySQL 型数据库。在实际使用时,可以根据需要选择使用一种或两种同时使用。

这两种类型的数据库均为全 Serverless 架构的云原生数据库。开通即可使用,支持按实际计算和存储资源使用量收取费用。

另外,除云开发本身提供的数据库外,同时也支持了对接用户自有的 MySQL 类型数据库。在自有数据库本身通过公网可访问的情况下,云开发提供了对接和使用此类数据库的能力。

云数据库(文档型)

在一个云开发环境中,有且仅有一个云数据库(文档型)实例,此实例可以和其他数据库实例共存。

在文档型数据库中,包含如下概念:

概念介绍

集合(Collection)

集合是读写操作的主要对象,每个集合都有一个集合名,如 usersarticles 等。

在数据库实例中可以创建多个集合。

集合由多条记录组成,任何记录必须从属于某个集合。

记录(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 资源,所以我们提供了用户端上的登录鉴权机制来保护您的资源安全。

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", ... }]
});

服务端调用

通过服务端调用时,需要在 SDK 初始化参数中,填入腾讯云密钥(SecretID 和 SecretKey),然后以管理员身份进行数据库的读写操作。

提示

在 CloudBase 云函数内使用服务端 SDK 时,开发者不需要填入腾讯云密钥即可使用。

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 数据库 | 已有的数据可以直接访问并使用,自有数据库可以更灵活可控 |