データ項目定義書の位置づけ

テーブル定義書が物理的な実装仕様であるのに対し、データ項目定義書は「業務観点での項目定義」だ。同じ日付でも「注文日」「確認日」「出荷日」それぞれの業務的意味・フォーマット・取得元を明確にする。

💡 作成のトリガー

複数テーブル・複数画面にまたがる共通データ項目(顧客ID・ステータス・日付など)が増えてきたら、データ項目定義書を作成するサイン。項目名のブレや型の不一致が発生しやすい。

定義すべき項目一覧

分類定義項目必須度
基本情報項目ID・業務名・システム名(物理名)
基本情報項目説明(業務的意味)
型・形式データ型・桁数・フォーマット
型・形式入力規則・バリデーション
コードコード値一覧(コードの場合)
参照先格納テーブル・カラム名
参照先使用する画面・帳票・API
管理初版作成日・最終更新日・変更履歴

データ項目定義一覧

データ項目定義例
ID     | 業務名       | 物理名        | 型          | 桁   | フォーマット    | 説明
-------|-------------|--------------|-------------|------|----------------|----------------------------------
DI-001 | 注文ID       | order_id     | 数値(整数)  | 19   | —              | システム内部の注文一意識別子
DI-002 | 注文番号     | order_no     | 文字列      | 15   | ORD-YYYYMMDD-NNNNN | 顧客向けの注文番号。人が読む用
DI-003 | 注文日       | order_date   | 日付        | —    | YYYY-MM-DD     | 注文が確定した業務上の日付
DI-004 | 注文ステータス| status       | コード      | 2    | コードで定義    | 注文の現在状態(後述)
DI-005 | 合計金額     | total_amount | 数値(実数)  | 12,2 | —              | 税込み合計金額(日本円)
DI-006 | ユーザーID   | user_id      | 数値(整数)  | 19   | —              | ユーザーマスタの外部キー
DI-007 | メールアドレス| email        | 文字列      | 255  | RFC5321        | 通知・ログイン用メールアドレス

コード体系定義

コード名物理名コード値表示名説明
注文ステータスstatus10仮受付注文受付直後。在庫未確認
20確認済在庫確認・与信OK
30出荷済倉庫から出荷完了
40完了顧客が受け取り確認
90キャンセルキャンセル処理済

命名規則

対象規則
テーブル物理名英小文字・スネークケース・複数形orders, order_items
カラム物理名英小文字・スネークケースorder_date, total_amount
ID カラムテーブル名(単数形)+ _idorder_id, user_id
フラグカラムis_ プレフィックス + 形容詞is_active, is_deleted
日時カラム動詞過去形 + _atcreated_at, shipped_at

Python Tips — DB からデータ項目を自動抽出

PostgreSQL の information_schema とコメント情報から、データ項目定義書の雛形を CSV で自動生成する。

Python — データ項目定義書の自動生成
"""
PostgreSQL からデータ項目定義書の CSV 雛形を生成する
pip install psycopg2-binary
"""
import csv, psycopg2

DSN = "host=localhost dbname=myapp user=postgres password=secret"

QUERY = """
SELECT
    c.table_name,
    c.column_name,
    c.data_type,
    COALESCE(c.character_maximum_length::text,
             c.numeric_precision::text, '') AS "length",
    c.is_nullable,
    c.column_default,
    pgd.description
FROM information_schema.columns c
LEFT JOIN pg_catalog.pg_statio_all_tables st
    ON st.schemaname = c.table_schema AND st.relname = c.table_name
LEFT JOIN pg_catalog.pg_description pgd
    ON pgd.objoid = st.relid AND pgd.objsubid = c.ordinal_position
WHERE c.table_schema = 'public'
ORDER BY c.table_name, c.ordinal_position
"""

conn = psycopg2.connect(DSN)
with conn.cursor() as cur:
    cur.execute(QUERY)
    rows = cur.fetchall()

with open("data_items_draft.csv", "w", newline="", encoding="utf-8-sig") as f:
    w = csv.writer(f)
    w.writerow(["項目ID", "テーブル", "物理名", "データ型", "桁数", "NULL可否",
                "デフォルト", "コメント(業務名として活用)"])
    for i, row in enumerate(rows, 1):
        w.writerow([f"DI-{i:04d}", *row])

conn.close()
print(f"✅ data_items_draft.csv に {len(rows)} 項目を出力しました")
print("  → コメント列を業務名として編集し、データ項目定義書を完成させてください")

レビューチェックリスト

#チェック項目
1全データ項目に業務的な説明が記載されているか
2コード値を持つ項目にコード一覧が定義されているか
3命名規則が全項目で統一されているか
4日付・金額の単位・フォーマットが明示されているか
5格納先テーブル・カラムとの対応が記載されているか