重要
このページは英語版のページを機械翻訳しています。原文はこちらからご覧ください。

書店のサンプル アプリケーション

Bookshop は、さまざまなカテゴリの本を購入し、読んだ本を評価できる仮想オンライン書店アプリケーションです。

アプリケーション開発者ガイドをよりスムーズに読むために、Bookshop アプリケーションのテーブル構造とデータに基づいた SQL ステートメントの例を示します。このドキュメントでは、テーブル構造とデータのインポート方法、およびテーブル構造の定義に焦点を当てています。

テーブル構造とデータをインポートする

Bookshop のテーブル構造とデータをインポートできますTiUP経由またはTiDB Cloudのインポート機能経由

TiDB Cloudの場合、 方法 1: tiup demo経由をスキップして Bookshop テーブル構造をインポートできますTiDB Cloudのインポート機能経由

方法 1: tiup demo経由

TiDBクラスタがTiUPを使用してデプロイされている場合、または TiDB サーバーに接続できる場合は、次のコマンドを実行して、Bookshop アプリケーションのサンプル データをすばやく生成してインポートできます。

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 root -H tidb.xxx.yyy.ap-northeast-1.prod.aws.tidbcloud.com -P 4000 -p

データ量を設定する

次のパラメーターを構成することにより、各データベース テーブルで生成されるデータの量を指定できます。

パラメータデフォルト値説明
--users10000usersテーブルに生成するデータの行数
--authors20000authorsテーブルに生成する行数
--books20000booksテーブルに生成するデータの行数
--orders300000ordersテーブルに生成するデータの行数
--ratings300000ratingsテーブルに生成するデータの行数

たとえば、次のコマンドを実行して生成します。

  • --usersパラメータによる 200,000 行のユーザー情報
  • --booksパラメータによる 500,000 行の書籍情報
  • --authorsパラメータによる 100,000 行の著者情報
  • --ratingsパラメータによる 1,000,000 行の評価レコード
  • --ordersパラメータによる 1,000,000 行の注文レコード
tiup demo bookshop prepare --users=200000 --books=500000 --authors=100000 --ratings=1000000 --orders=1000000 --drop-tables

--drop-tablesパラメータを使用して、元のテーブル構造を削除できます。パラメーターの詳細については、 tiup demo bookshop --helpコマンドを実行してください。

方法 2: TiDB Cloudインポート経由

TiDB Cloudのデータベースの詳細ページで、[インポート] ボタンをクリックして、[データのインポート タスク] ページに入ります。このページで、AWS S3 からTiDB Cloudに Bookshop サンプル データをインポートするには、次の手順を実行します。

  1. 次のバケット URLRole-ARNを対応する入力ボックスにコピーします。

    バケット URL :

    s3://developer.pingcap.com/bookshop/
    

    Role-ARN :

    arn:aws:iam::494090988690:role/s3-tidb-cloud-developer-access
    

    この例では、次のデータが事前に生成されます。

    • 200,000 行のユーザー情報
    • 500,000 行の書籍情報
    • 100,000 行の著者情報
    • 1,000,000 行の評価レコード
    • 1,000,000 行の注文レコード
  2. Bucket リージョンUS West (Oregon)を選択します。

  3. データ形式TiDB Dumplingを選択します。

    Import Bookshop data in TiDB Cloud

  4. データベースのログイン情報を入力します。

  5. [インポート] ボタンをクリックして、インポートを確認します。

  6. TiDB Cloudがインポートを完了するまで待ちます。

    Bookshop data importing

    インポート プロセス中に次のエラー メッセージが表示された場合は、 DROP DATABASE bookshop;コマンドを実行して以前に作成したサンプル データベースをクリアし、データを再度インポートします。

    テーブル [ bookshop . authors bookshop book_authors bookshop books bookshop orders bookshop ratings bookshop users ] は空ではありません。

TiDB Cloudの詳細については、 TiDB Cloudのドキュメントを参照してください。

データのインポート ステータスをビューする

インポートが完了したら、次の 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 |
+-----------------------+----------------+-----------+------------+---------+
6 rows in set (0.03 sec)

テーブルの説明

このセクションでは、Bookshop アプリケーションのデータベース テーブルについて詳しく説明します。

booksテーブル

このテーブルには、書籍の基本情報が格納されます。

フィールド名タイプ説明
IDbigint(20)書籍の一意の ID
題名varchar(100)本のタイトル
タイプ列挙書籍の種類 (雑誌、アニメ、教材など)
株式bigint(20)ストック
価格10 進数 (15,2)価格
published_at日付時刻発行日

authors

このテーブルには、著者の基本情報が格納されます。

フィールド名タイプ説明
IDbigint(20)著者の一意の ID
名前varchar(100)著者名
性別tinyint(1)生物学的性別 (0: 女性、1: 男性、NULL: 不明)
生年smallint(6)生年
死亡年smallint(6)没年

usersテーブル

このテーブルには、Bookshop ユーザーの情報が格納されます。

フィールド名タイプ説明
IDbigint(20)ユーザーの一意の ID
残高10 進数 (15,2)バランス
ニックネームvarchar(100)ニックネーム

ratings

このテーブルには、書籍に対するユーザーの評価のレコードが格納されます。

フィールド名タイプ説明
book_idbigint書籍の一意の ID ( にリンク)
ユーザーIDbigintユーザーの一意の識別子 ( ユーザーにリンク)
スコアtinyintユーザー評価 (1-5)
rating_at日付時刻評価時間

book_authorsテーブル

著者は複数の本を執筆する場合があり、1 つの本に複数の著者が関与する場合があります。このテーブルには、書籍と著者の間の対応が格納されます。

フィールド名タイプ説明
book_idbigint(20)書籍の一意の ID ( にリンク)
author_idbigint(20)著者固有ID( 著者へのリンク)

orders

このテーブルには、ユーザーの購入情報が格納されます。

フィールド名タイプ説明
IDbigint(20)注文の一意の ID
book_idbigint(20)書籍の一意の ID ( にリンク)
ユーザーIDbigint(20)ユーザー固有の識別子 ( ユーザーに関連付けられている)
tinyint(4)購入数量
order_at日付時刻購入時期

データベース初期化スクリプトdbinit.sql

Bookshop アプリケーションでデータベース テーブル構造を手動で作成する場合は、次の SQL ステートメントを実行します。

CREATE DATABASE IF NOT EXISTS `bookshop`;

DROP TABLE IF EXISTS `bookshop`.`books`;
CREATE TABLE `bookshop`.`books` (
  `id` bigint(20) 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(11) 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(20) AUTO_RANDOM NOT NULL,
  `name` varchar(100) NOT NULL,
  `gender` tinyint(1) DEFAULT NULL,
  `birth_year` smallint(6) DEFAULT NULL,
  `death_year` smallint(6) 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(20) NOT NULL,
  `author_id` bigint(20) 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(20) AUTO_RANDOM NOT NULL,
  `book_id` bigint(20) NOT NULL,
  `user_id` bigint(20) NOT NULL,
  `quality` tinyint(4) 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