2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ChatGPTと一緒にレシートからDB設計したよ

Posted at

はじめに

初心者だけど、データベーススペシャリスト試験を受けたくなってしまったために、データベース設計の練習をしてみようと思いました。身近にたくさん業務用データがあるわけではなくて練習のネタに困ったので、身近なもので練習してみたいと思います。

今回は、近所でお買い物をしたときのレシートから関係スキーマを書き起こそうと思いますよ(いわゆるボトムアップ設計というやつです)。

レシートを観察する

今回使ったリサイクルショップのレシート。雑貨しか買わなかったのですが、服やブランドバッグ、家電などもあります(命名規則はわかりません)。

receipt

エンティティを見出す

Udemyの講座「はじめてのテーブル設計・データベース設計【わかりやすい解説 + 身近なテーマでレッスン】」では、5W1H(いつ、どこで、だれが、なにを、なぜ、どのように)を考えてエンティティを見出すといいと言われています。

  • いつ → 発行日
  • どこで → 店名
  • 誰が → 担当者
  • 何を → 商品(品名)
  • どれだけ(購入された商品について)
    → 数量、単価、金額
  • どれだけ(レシート全体について
    → 合計、お預り、お釣り

関係スキーマを考える

いったん紙に書き出してみます。

trefac2.jpg

消えかけている部分は「商品情報(商品コード(PK)、品名、単価)」です。

今回のお店はチェーン店なので、おそらく一括管理するシステムがあると想定し、複数の店舗情報を管理するための「店舗情報テーブル」を定義しました。また、各店舗のレジ担当者名がレシートに印字されているので、おそらく照合するための「社員情報テーブル」が定義されてそうだと考えました。

「購入情報テーブル」は今回の買い物の情報を保存しておくためで、「商品情報テーブル」は大量にある商品を管理しているテーブルだと考えます。購入情報テーブルと商品情報テーブルは多対1の関係になると思うのですが…… 例えば「アディダスのTシャツ」は何度も別々のレシートで買われる可能性があるとChatGPTからヒントをもらったのですが、このへんで混乱してきました。

「領収書テーブル」は今回の購入時の状況を全てまとめて控え、印字したい情報を持っているテーブルになります。領収書テーブルと購入情報テーブルは1対多の関係です。購入番号1つに対して商品は買った個数だけありますからね。

ChatGPTさんの意見

■ 良い点
5W1Hでの分解(いつ・どこで・だれが etc.) がとても良いアプローチ。情報を漏らさず、混乱も防げる。

正規化(第3正規形くらい)まで意識されてる構成になってる。

「領収書ID」 → 「購入情報(商品単位)」 の流れも自然。

■ 小さな改善提案(余力があれば)
「購入番号」は「領収書ID + 連番」などで構成して複合主キーにするか、逆に購入情報のIDを別で振ってもいい(正規化次第)。

「社員情報」が抜けているようなので、社員ID→領収書の関係も明示しておくとよいかも(FKだけ書いてあるね)。

商品単価は商品情報に一元化されてるけど、過去に価格が変わる可能性があるなら、購入情報に「単価」を残すのも検討価値あり。

複合主キーについて

ChatGPTさんに複合主キーをどういうときに使うのか聞いてみました。

ChatGPT『今回のレシート設計では、「購入情報」テーブルが複合主キーの良い適用例になっています。なぜか?

購入番号(レシートごとに発行される一意のID)

商品コード(商品を一意に識別するID)
→ この2つの組み合わせが「そのレシート内での購入記録」を一意に特定できるからです。

また、同じレシートで同じ商品を何回も登録する可能性があるか? も考慮するポイントです。

「1レシートにつき、同じ商品は1回しか登場しない」 → 購入番号, 商品コード を複合主キーにする

「同じレシートで同じ商品が2回登場する可能性がある」 → purchase_detail_id のような別の主キーを作る』

今回は複数購入しても数量でまとめることができ、1レシートにつき同じ商品は1回しか登場しない(アディダスのTシャツを2枚購入するパターン)ので、購入情報テーブルの購入番号と商品コード を複合主キーにします。

答え合わせ

最終的に今回のレシートからデータベース設計をしたときの関係スキーマは以下の通りになりました。

店舗情報(店舗ID、登録番号、店名、場所、電話番号)
社員情報(社員ID、担当者名)
領収書(領収書ID、店舗情報ID、社員ID、購入番号、発行日、合計、お預り、お釣り)
購入情報(購入番号、商品コード、数量、金額)
商品情報(商品コード、品名、単価)

主キー:
店舗情報 → 店舗ID
社員情報 → 社員ID
領収書 → 領収書ID
購入情報 → 購入番号、商品コード(複合主キー)
商品情報 → 商品コード

外部キー:
領収書 → 店舗情報ID、社員ID、購入番号

おわりに

データベース設計をここまできちんと考えて、かつアウトプットしたのは初めてです。間違っているところがあればどんどん教えてください!!励みになります。よろしくお願いします。

表記のしかた

関係スキーマはデータベーススペシャリスト試験の表記法に従っています。

db_specialist2.jpg

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?