📗

CSVデータから始めるDB設計実践入門

に公開

0. はじめに

既存のCSVデータをデータベース化するという業務を担当しました。
本記事では、入門書で学んだDB設計の知識を実務でどのように活用したかお話します

想定読者

  • データベースの基礎知識はあるが、実践的な設計経験が少ないエンジニア
  • 既存のCSVデータをデータベース化する必要がある方

この記事で学べること

  • 実務でよくあるデータの課題とその解決アプローチ
  • 正規化の実践的な判断基準

1. データの分析と設計

1.1 データの内容確認

CSVデータを確認する際は、以下の2点から確認します。

  1. 各列のデータ型を確認

    • 書籍名, 著者名, 出版社名 が文字列型(varchar)
    • 価格は 数値型(integer)
    • ISBNは 文字列型(varchar)- 書籍を一意に識別する番号
    • 出版日は 日付型(date)
  2. NULL値の確認

    • 価格が空となっているデータがある

例:本のデータ(CSV形式)

ISBN,書籍名,著者名,出版社名,価格,出版日
9784297124373,データベース設計入門,山田太郎,技術評論社,2800,2023-01-15
9784798162947,SQL実践入門,鈴木花子,翔泳社,3200,2023-03-20
9784297124374,Webアプリケーション開発,佐藤一郎,技術評論社,,2023-02-10
9784798162948,Pythonプログラミング,鈴木花子,翔泳社,3000,2023-04-05

1.2 コードで分割

一意に識別できる値(コード)を見つけたら、主キーとして分割しましょう。

例: ISBNコード

CSVデータにコードとなる値を見つけたら、主キーとして分割しましょう。

books_master.csv

ISBN,書籍名
9784297124373,データベース設計入門
9784798162947,SQL実践入門
9784297124374,Webアプリケーション開発
9784798162948,Pythonプログラミング

books_data.csv(正規化後)

ISBN,著者名,出版社名,価格,出版日
9784297124373,山田太郎,技術評論社,2800,2023-01-15
9784798162947,鈴木花子,翔泳社,3200,2023-03-20
9784297124374,佐藤一郎,技術評論社,,2023-02-10
9784798162948,鈴木花子,翔泳社,3000,2023-04-05

1.3 NULL を分割

NULLが入る可能性のある項目は、別テーブルとして管理することで、データの整合性を保ちやすくなります。
NOT NULL を徹底しています。

例:価格の分割

価格がNULLとなる可能性があるため、価格情報を別テーブルとして管理します。

価格テーブルを分割する理由

  • 価格は書籍の基本情報とは別の概念 (販売行為のデータ)

books_price.csv

ISBN,価格
9784297124373,2800
9784798162947,3200
9784798162948,3000

books_data.csv(価格分割後)

ISBN,著者名,出版社名,出版日
9784297124373,山田太郎,技術評論社,2023-01-15
9784798162947,鈴木花子,翔泳社,2023-03-20
9784297124374,佐藤一郎,技術評論社,2023-02-10
9784798162948,鈴木花子,翔泳社,2023-04-05

1.4 隠れたコードを見つける

入門書では都合よく分割可能なコードが定義されていることが多いですが、実際の業務では以下のような課題に直面することがあります。
(実際のデータは意地が悪い 🤦)

  1. コードが存在しない場合

    • 既存データにコードがない
    • 業務上でコード体系が確立されていない
  2. コード設計の判断基準

    • データの特性を考慮した設計
    • 運用上の制約を考慮
    • 将来的な拡張性を考慮
  3. 実践的なアプローチ

    • 段階的なコード導入
    • 既存データの整理と統合
    • 運用ルールの確立

例:出版社の分割

出版社名は法人としての登録名であり、基本的にユニークになります。
マスターデータとして管理することで、出版社情報の一元管理が可能になります。

出版社コードの設計

  • 形式:A0001(1文字のプレフィックス + 4桁の連番)
    • プレフィックス:A (国内出版社)
      • 将来的にB(海外出版社)などに拡張可能
    • 連番:00019999
      • 最大9,999社まで対応可能
      • 4桁で十分な拡張性を確保

publishers.csv

出版社コード,出版社名
A0001,技術評論社
A0002,翔泳社

books_data.csv(出版社分割後)

ISBN,著者名,出版社コード,出版日
9784297124373,山田太郎,A0001,2023-01-15
9784798162947,鈴木花子,A0002,2023-03-20
9784297124374,佐藤一郎,A0001,2023-02-10
9784798162948,鈴木花子,A0002,2023-04-05

1.5 コード不明は分割しない

マスターとなりそうなものを見つけたらテーブルに分割したくなります。
しかし、現状のデータでは対象を一意に識別する方法がない場合があります。
そんなときはは、分割を将来的な課題として保留します。

具体例:著者情報の扱い

現在のデータでは著者を一意に識別する方法がありません

  • 同名の著者が存在する可能性
  • 著者コードなどの識別子がない
  • 著者の追加情報(生年月日、経歴など)がない

著者テーブルを作らない理由

  1. データの整合性が保てない

    • 同名の著者を区別できない
  2. 運用上の問題

    • 著者情報の更新が困難
    • 著者の統合/分割ができない (同一著者の判断が難しい)
  3. 将来的な対応

    • 著者コードの導入を検討
    • 著者情報の追加収集を計画
      • 著者の基本情報(生年月日、経歴など)
      • 著者の活動情報(執筆分野、受賞歴など)

2. DBテーブルとして設計

2.1 ER図を作成

これまでの正規化の結果をER図で表現します。

まとめ

本記事では、CSVデータからDB設計を行う際の実践的なアプローチを紹介しました。

設計のポイント

  1. データの分析

    • データ型の確認
    • NULL値の確認
    • コードの特定
  2. テーブルの分割

    • コード値の分離(ISBN、出版社コード)
    • NULL値の回避(価格テーブル)
    • コードの有無による判断(著者情報)
  3. 実践的な判断

    • 完璧な設計より実用的な設計
    • 段階的な改善
    • 運用を考慮した設計

DB設計は、単にテーブルを作成するだけでなく、データの特性やアプリケーションの要件を深く理解することが重要です。
本記事で紹介した原則を参考に、より良いデータベース設計を実践してみてください。

参考資料

「コードによる分割」という考え方を参考にしました。

https://gihyo.jp/book/2022/978-4-297-12946-0

Discussion