データ項目定義書の位置づけ
テーブル定義書が物理的な実装仕様であるのに対し、データ項目定義書は「業務観点での項目定義」だ。同じ日付でも「注文日」「確認日」「出荷日」それぞれの業務的意味・フォーマット・取得元を明確にする。
💡 作成のトリガー
複数テーブル・複数画面にまたがる共通データ項目(顧客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 | 通知・ログイン用メールアドレス
コード体系定義
| コード名 | 物理名 | コード値 | 表示名 | 説明 |
|---|---|---|---|---|
| 注文ステータス | status | 10 | 仮受付 | 注文受付直後。在庫未確認 |
| 20 | 確認済 | 在庫確認・与信OK | ||
| 30 | 出荷済 | 倉庫から出荷完了 | ||
| 40 | 完了 | 顧客が受け取り確認 | ||
| 90 | キャンセル | キャンセル処理済 |
命名規則
| 対象 | 規則 | 例 |
|---|---|---|
| テーブル物理名 | 英小文字・スネークケース・複数形 | orders, order_items |
| カラム物理名 | 英小文字・スネークケース | order_date, total_amount |
| ID カラム | テーブル名(単数形)+ _id | order_id, user_id |
| フラグカラム | is_ プレフィックス + 形容詞 | is_active, is_deleted |
| 日時カラム | 動詞過去形 + _at | created_at, shipped_at |
Python Tips — DB からデータ項目を自動抽出
PostgreSQL の information_schema とコメント情報から、データ項目定義書の雛形を CSV で自動生成する。
"""
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 | 格納先テーブル・カラムとの対応が記載されているか |