CSVデータから始めるDB設計実践入門
0. はじめに
既存のCSVデータをデータベース化するという業務を担当しました。
本記事では、入門書で学んだDB設計の知識を実務でどのように活用したかお話します
想定読者
- データベースの基礎知識はあるが、実践的な設計経験が少ないエンジニア
- 既存のCSVデータをデータベース化する必要がある方
この記事で学べること
- 実務でよくあるデータの課題とその解決アプローチ
- 正規化の実践的な判断基準
1. データの分析と設計
1.1 データの内容確認
CSVデータを確認する際は、以下の2点から確認します。
-
各列のデータ型を確認
- 書籍名, 著者名, 出版社名 が文字列型(varchar)
- 価格は 数値型(integer)
- ISBNは 文字列型(varchar)- 書籍を一意に識別する番号
- 出版日は 日付型(date)
-
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 隠れたコードを見つける
入門書では都合よく分割可能なコードが定義されていることが多いですが、実際の業務では以下のような課題に直面することがあります。
(実際のデータは意地が悪い 🤦)
-
コードが存在しない場合
- 既存データにコードがない
- 業務上でコード体系が確立されていない
-
コード設計の判断基準
- データの特性を考慮した設計
- 運用上の制約を考慮
- 将来的な拡張性を考慮
-
実践的なアプローチ
- 段階的なコード導入
- 既存データの整理と統合
- 運用ルールの確立
例:出版社の分割
出版社名は法人としての登録名であり、基本的にユニークになります。
マスターデータとして管理することで、出版社情報の一元管理が可能になります。
出版社コードの設計
- 形式:
A0001(1文字のプレフィックス + 4桁の連番)- プレフィックス:
A(国内出版社)- 将来的に
B(海外出版社)などに拡張可能
- 将来的に
- 連番:
0001~9999- 最大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 コード不明は分割しない
マスターとなりそうなものを見つけたらテーブルに分割したくなります。
しかし、現状のデータでは対象を一意に識別する方法がない場合があります。
そんなときはは、分割を将来的な課題として保留します。
具体例:著者情報の扱い
現在のデータでは著者を一意に識別する方法がありません
- 同名の著者が存在する可能性
- 著者コードなどの識別子がない
- 著者の追加情報(生年月日、経歴など)がない
著者テーブルを作らない理由
-
データの整合性が保てない
- 同名の著者を区別できない
-
運用上の問題
- 著者情報の更新が困難
- 著者の統合/分割ができない (同一著者の判断が難しい)
-
将来的な対応
- 著者コードの導入を検討
- 著者情報の追加収集を計画
- 著者の基本情報(生年月日、経歴など)
- 著者の活動情報(執筆分野、受賞歴など)
2. DBテーブルとして設計
2.1 ER図を作成
これまでの正規化の結果をER図で表現します。
まとめ
本記事では、CSVデータからDB設計を行う際の実践的なアプローチを紹介しました。
設計のポイント
-
データの分析
- データ型の確認
- NULL値の確認
- コードの特定
-
テーブルの分割
- コード値の分離(ISBN、出版社コード)
- NULL値の回避(価格テーブル)
- コードの有無による判断(著者情報)
-
実践的な判断
- 完璧な設計より実用的な設計
- 段階的な改善
- 運用を考慮した設計
DB設計は、単にテーブルを作成するだけでなく、データの特性やアプリケーションの要件を深く理解することが重要です。
本記事で紹介した原則を参考に、より良いデータベース設計を実践してみてください。
参考資料
「コードによる分割」という考え方を参考にしました。
Discussion