🤔

【事例紹介】テンプレボール「請求書」のデータベース論理設計

に公開

目的

この記事では、データベースの論理設計 の事例を紹介します。☺️ 今回は、テンプレボールという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