PingKai Logo下载

Bookshop 示例应用

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

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

导入表结构和数据

对于平凯数据库云服务,你可以跳过 Method 1: Via tiup demo,直接通过 平凯数据库云服务的导入功能 导入表结构。

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数据库用户

例如,如果你想连接到平凯数据库云服务上的数据库,可以这样指定连接信息:

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 平凯数据库云服务导入

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

    1. 登录 平凯数据库云服务控制台 ,进入你的项目的 Clusters 页面。

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

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

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

    • Import File Count:对于 {{\平凯云 Starter } },选择 Multiple files。
    • 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 开始导入流程,等待平凯数据库云服务完成导入。

关于如何导入或迁移数据到平凯数据库云服务的更多信息,请参见 平凯数据库云服务 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

需要帮助?

在 Discord 或 Slack 上向社区提问,或 提交支持工单。