📣

TiDB Cloud Serverless 现已更名为
Starter
!此页面由 AI 自动翻译,英文原文请见
此处。

Bookshop 示例应用

Bookshop 是一个虚拟的在线书店应用,你可以在其中购买各种类别的书籍并对已阅读的书籍进行评分。

为了让你在应用开发指南中的阅读更加顺畅,我们基于 表结构 和数据,提供了示例的 SQL 语句。本文件重点介绍导入表结构和数据的方法以及表结构的定义。

导入表结构和数据

对于 TiDB Cloud,你可以跳过 Method 1: Via tiup demo,直接通过 TiDB Cloud 的导入功能 导入表结构。

Method 1: Via tiup demo

如果你的 TiDB 集群是使用 TiUP 部署的,或者你可以连接到你的 TiDB 服务器,你可以通过运行以下命令,快速生成并导入 Bookshop 应用的示例数据:

tiup demo bookshop prepare

默认情况下,此命令会让你的应用连接到地址 127.0.0.1 的端口 4000,允许你以 root 用户无密码登录,并在名为 bookshop 的数据库中创建 表结构

配置连接信息

下表列出了连接参数,你可以根据你的环境修改其默认设置。

参数缩写默认值描述
--password-p数据库用户密码
--host-H127.0.0.1数据库地址
--port-P4000数据库端口
--db-Dbookshop数据库名称
--user-Uroot数据库用户

例如,如果你想连接到 TiDB Cloud 上的数据库,可以这样指定连接信息:

tiup demo bookshop prepare -U <username> -H <endpoint> -P 4000 -p <password>

设置数据量

你可以通过配置以下参数,指定每个数据库表要生成的数据量:

参数默认值描述
--users10000users 表中要生成的行数
--authors20000authors 表中要生成的行数
--books20000books 表中要生成的行数
--orders300000orders 表中要生成的行数
--ratings300000ratings 表中要生成的行数

例如,执行以下命令将生成:

  • 200,000 行用户信息(通过 --users 参数)
  • 500,000 行书籍信息(通过 --books 参数)
  • 100,000 行作者信息(通过 --authors 参数)
  • 1,000,000 行评分记录(通过 --ratings 参数)
  • 1,000,000 行订单记录(通过 --orders 参数)
tiup demo bookshop prepare --users=200000 --books=500000 --authors=100000 --ratings=1000000 --orders=1000000 --drop-tables

你可以通过 --drop-tables 参数删除原有的表结构。更多参数说明,可以运行 tiup demo bookshop --help 获取。

Method 2: Via TiDB Cloud 导入

  1. 打开目标集群的 Import 页面。

    1. 登录 TiDB Cloud 控制台 ,进入你的项目的 Clusters 页面。

    2. 点击目标集群的名称,进入其概览页面,然后在左侧导航栏点击 Import

  2. 选择 Import data from Cloud Storage,然后点击 Amazon S3

  3. Import Data from Amazon S3 页面,配置以下源数据信息:

    • Import File Count:对于 {{{ .starter }} },选择 Multiple files。此字段在 TiDB Cloud Dedicated 中不可用。
    • Included Schema Files:选择 Yes
    • Data Format:选择 SQL
    • Folder URI:输入 s3://developer.pingcap.com/bookshop/
    • Bucket Access:选择 AWS Role ARN
    • Role ARN:输入 arn:aws:iam::494090988690:role/s3-tidb-cloud-developer-access

    在此示例中,提前生成了以下数据:

    • 200,000 行用户信息
    • 500,000 行书籍信息
    • 100,000 行作者信息
    • 1,000,000 行评分记录
    • 1,000,000 行订单记录
  4. 点击 Connect > Start Import 开始导入流程,等待 TiDB Cloud 完成导入。

关于如何导入或迁移数据到 TiDB Cloud 的更多信息,请参见 TiDB Cloud Migration Overview

查看数据导入状态

导入完成后,你可以执行以下 SQL 语句,查看每个表的数据量信息:

SELECT CONCAT(table_schema,'.',table_name) AS 'Table Name', table_rows AS 'Number of Rows', CONCAT(ROUND(data_length/(1024*1024*1024),4),'G') AS 'Data Size', CONCAT(ROUND(index_length/(1024*1024*1024),4),'G') AS 'Index Size', CONCAT(ROUND((data_length+index_length)/(1024*1024*1024),4),'G') AS 'Total' FROM information_schema.TABLES WHERE table_schema LIKE 'bookshop';

结果如下:

+-----------------------+----------------+-----------+------------+---------+ | Table Name | Number of Rows | Data Size | Index Size | Total | +-----------------------+----------------+-----------+------------+---------+ | bookshop.orders | 1000000 | 0.0373G | 0.0075G | 0.0447G | | bookshop.book_authors | 1000000 | 0.0149G | 0.0149G | 0.0298G | | bookshop.ratings | 4000000 | 0.1192G | 0.1192G | 0.2384G | | bookshop.authors | 100000 | 0.0043G | 0.0000G | 0.0043G | | bookshop.users | 195348 | 0.0048G | 0.0021G | 0.0069G | | bookshop.books | 1000000 | 0.0546G | 0.0000G | 0.0546G | +-----------------------+----------------+-----------+------------+---------+

表结构说明

本节详细介绍 Bookshop 应用的数据库表。

books

存储书籍的基本信息。

字段名类型描述
idbigint书籍的唯一 ID
titlevarchar(100)书名
typeenum书籍类型(例如,杂志、动画、教学辅助)
stockbigint库存
pricedecimal(15,2)价格
published_atdatetime出版日期

authors

存储作者的基本信息。

字段名类型描述
idbigint作者的唯一 ID
namevarchar(100)作者姓名
gendertinyint性别(0:女,1:男,NULL:未知)
birth_yearsmallint出生年份
death_yearsmallint去世年份

users

存储 Bookshop 用户信息。

字段名类型描述
idbigint用户的唯一 ID
balancedecimal(15,2)账户余额
nicknamevarchar(100)昵称

ratings

存储用户对书籍的评分记录。

字段名类型描述
book_idbigint书籍的唯一 ID(关联 books
user_idbigint用户的唯一标识(关联 users
scoretinyint用户评分(1-5)
rated_atdatetime评分时间

book_authors

作者可能会写多本书,一本书也可能由多位作者合作。本表存储书籍与作者的对应关系。

字段名类型描述
book_idbigint书籍的唯一 ID(关联 books
author_idbigint作者的唯一 ID(关联 authors

orders

存储用户的购买信息。

字段名类型描述
idbigint订单的唯一 ID
book_idbigint书籍的唯一 ID(关联 books
user_idbigint用户的唯一标识(关联 users
quantitytinyint购买数量
ordered_atdatetime购买时间

数据库初始化脚本 dbinit.sql

如果你想手动创建 Bookshop 应用的数据库表结构,可以运行以下 SQL 语句:

CREATE DATABASE IF NOT EXISTS `bookshop`; DROP TABLE IF EXISTS `bookshop`.`books`; CREATE TABLE `bookshop`.`books` ( `id` bigint AUTO_RANDOM NOT NULL, `title` varchar(100) NOT NULL, `type` enum('Magazine', 'Novel', 'Life', 'Arts', 'Comics', 'Education & Reference', 'Humanities & Social Sciences', 'Science & Technology', 'Kids', 'Sports') NOT NULL, `published_at` datetime NOT NULL, `stock` int DEFAULT '0', `price` decimal(15,2) DEFAULT '0.0', PRIMARY KEY (`id`) CLUSTERED ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; DROP TABLE IF EXISTS `bookshop`.`authors`; CREATE TABLE `bookshop`.`authors` ( `id` bigint AUTO_RANDOM NOT NULL, `name` varchar(100) NOT NULL, `gender` tinyint DEFAULT NULL, `birth_year` smallint DEFAULT NULL, `death_year` smallint DEFAULT NULL, PRIMARY KEY (`id`) CLUSTERED ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; DROP TABLE IF EXISTS `bookshop`.`book_authors`; CREATE TABLE `bookshop`.`book_authors` ( `book_id` bigint NOT NULL, `author_id` bigint NOT NULL, PRIMARY KEY (`book_id`,`author_id`) CLUSTERED ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; DROP TABLE IF EXISTS `bookshop`.`ratings`; CREATE TABLE `bookshop`.`ratings` ( `book_id` bigint NOT NULL, `user_id` bigint NOT NULL, `score` tinyint NOT NULL, `rated_at` datetime NOT NULL DEFAULT NOW() ON UPDATE NOW(), PRIMARY KEY (`book_id`,`user_id`) CLUSTERED, UNIQUE KEY `uniq_book_user_idx` (`book_id`,`user_id`) ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; ALTER TABLE `bookshop`.`ratings` SET TIFLASH REPLICA 1; DROP TABLE IF EXISTS `bookshop`.`users`; CREATE TABLE `bookshop`.`users` ( `id` bigint AUTO_RANDOM NOT NULL, `balance` decimal(15,2) DEFAULT '0.0', `nickname` varchar(100) UNIQUE NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; DROP TABLE IF EXISTS `bookshop`.`orders`; CREATE TABLE `bookshop`.`orders` ( `id` bigint AUTO_RANDOM NOT NULL, `book_id` bigint NOT NULL, `user_id` bigint NOT NULL, `quality` tinyint NOT NULL, `ordered_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) CLUSTERED, KEY `orders_book_id_idx` (`book_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

需要帮助?

DiscordSlack 上向社区提问,或 提交支持工单

文档内容是否有帮助?