🤔
【事例紹介】テンプレボール「請求書」のデータベース論理設計
目的
この記事では、データベースの論理設計 の事例を紹介します。☺️ 今回は、テンプレボールというWord やExcel 形式の書式テンプレートを紹介しているWebサイトで見つけた、個人事業主向けの請求書 を例として取り上げます。🤔
状況
これまでは、SQL の練習に多くの時間を費やしてきましたが、ひらまつ しょうたろう氏のはじめてのテーブル設計・データベース設計【わかりやすい解説 + 身近なテーマでレッスン】 を受講しました。そこで、SQL での実装だけでなく、論理設計も学ぶ必要がある と感じ、講座に倣い、身近な題材を使って、データベースの論理設計にチャレンジしてみました。💪
複雑さ(課題)
講座内で、データベースの論理設計は、経験が積みにくい というコメントがあり、確かにその通りだと思いました。🤔
論理設計はデータベースを作る、序盤の過程で行われるためか、既にデータベースがあることを前提にしている、SELECT 文等でのデータ抽出に比べると、業務でも 携わる機会が限られている と感じます。😓 そこで、今回は、個人事業主向けの請求書テンプレートを例として、データベースの論理設計をしました。
問い
今回のお題は「個人事業主向け請求書テンプレートを基に、論理設計をするとどうなるか?」です。

結果
エンティティ
講座の手順に沿って、論理設計をしたところ、以下のようなエンティティを洗い出すことができました。
- 顧客
- サービス内容
- 請求
- 部署
- 担当者
- 請求内訳
ER図
洗い出したエンティティに、請求書のフィールド(項目)を紐付け、関係を整理し、ER図を描きました。主キーと外部キー以外のカラムは、省略しています。

DDL(データ定義言語)
上記のER図を実装するDDL(データ定義言語)は、以下のとおりです。
-- 顧客テーブルの定義
CREATE TABLE clients (
client_id VARCHAR(50) NOT NULL, -- ER図の「顧客ID」に該当
client_name VARCHAR(200) NOT NULL, -- ER図の「社名」に該当
department_id VARCHAR(50), -- ER図の「部署ID」に該当
pic_id VARCHAR(50) NOT NULL, -- ER図の「担当者ID」に該当
postal_code CHAR(7) NOT NULL,
address VARCHAR(300) NOT NULL,
phone_number VARCHAR(20) NOT NULL,
PRIMARY KEY(client_id),
FOREIGN KEY(department_id) REFERENCES departments (department_id),
FOREIGN KEY(pic_id) REFERENCES pics (pic_id)
);
-- 部署テーブルの定義
CREATE TABLE departments (
department_id VARCHAR(50) NOT NULL,
department_name VARCHAR(100) NOT NULL,
PRIMARY KEY(department_id)
);
-- 担当者テーブルの定義
CREATE TABLE pics (
pic_id VARCHAR(50) NOT NULL,
pic_name VARCHAR(50) NOT NULL,
PRIMARY KEY(pic_id)
);
-- サービス・テーブルの定義
CREATE TABLE services (
service_id VARCHAR(50) NOT NULL,
service_name VARCHAR(100) NOT NULL,
PRIMARY KEY(service_id)
);
-- 請求テーブルの定義
CREATE TABLE invoices (
invoice_id VARCHAR(50) NOT NULL, -- ER図の「請求書番号(No.)」に該当
client_id VARCHAR(50) NOT NULL,
department_id VARCHAR(50) NOT NULL,
pic_id VARCHAR(50) NOT NULL,
billing_date DATE NOT NULL,
due_date DATE NOT NULL,
PRIMARY KEY(invoice_id),
FOREIGN KEY(client_id) REFERENCES clients (client_id),
FOREIGN KEY(department_id) REFERENCES departments (department_id),
FOREIGN KEY(pic_id) REFERENCES pics (pic_id)
);
-- 請求内訳テーブルの定義
CREATE TABLE invoices_details (
invoice_id VARCHAR(50) NOT NULL,
service_id VARCHAR(50) NOT NULL,
unit_price INTEGER NOT NULL,
quantity INTEGER NOT NULL,
PRIMARY KEY(invoice_id, service_id),
FOREIGN KEY(invoice_id) REFERENCES invoices (invoice_id),
FOREIGN KEY(service_id) REFERENCES services (service_id)
);
-- 定義したテーブルの一覧を表示
SHOW TABLES;
考察(示唆)
- 初の試みだったため、敢えてフィールド(項目)が少ない帳票を選びました。
- エンティティの洗い出し、フィールドの紐付け、正規化と 練習が必要 だと感じました。🤔
- draw.io のER図テンプレートを使いました。PowerPoint の図形挿入のように直観的に操作でき、便利でした。
- DDL の構文チェックにあたりGemini を使いました。正規化に関して、新しい理解を得る ことができました。一から丸訊きするよりも、面倒でも一度、自分で考えてみる方が、得るものが多くなる と感じました。☺️
結論
- 確かに携わる機会が少ないタスクですが、工夫次第で、訓練は可能 だと感じました。😁
- 手順は概ね把握できたので、引き続き、身近な題材で論理設計をしてみます。💪
Discussion