👻

DB設計と管理画面設計の基本原則メモ - なぜその原則が必要か?

2024/11/06に公開

■ DB設計の3原則:具体例で理解する

1. シンプル性を保つ

なぜ必要か?

複雑な設計は保守性を下げ、バグの温床となる。また、チームでの共有が困難になり、新メンバーの学習コストが増大する。

❌ よくある間違い例

1. 過剰な正規化
users
└── user_details
    └── user_additional_info
        └── user_settings

2. 意味不明な命名
t_1
├── cl_01
└── cl_02

3. 1つのテーブルに全部詰め込む
products
- id
- name
- price
- category
- stock
- supplier_name
- supplier_address
- supplier_phone
- order_history
- sales_data

✅ 正しい例

1. 適切な粒度の分割
users
├── user_profiles
└── user_settings

2. 明確な命名
users
├── columns
  - id
  - email
  - password_hash

3. 責務の分離
products
├── product_details
└── supplier_info

2. 拡張性を確保

なぜ必要か?

システムは必ず変更・拡張が発生する。後からの変更が困難な設計は、開発速度を低下させコストを増大させる。

❌ よくある間違い例

1. ハードコーディング
user_type
- 1: 一般
- 2: 管理者
(新しい種類を追加できない)

2. 固定長の制限
phone_number VARCHAR(11)
(国際電話番号に対応できない)

3. 拡張を考えない設計
order_status
- 'completed'
- 'canceled'
(中間状態を追加できない)

✅ 正しい例

1. マスタテーブルによる管理
user_types
- id
- name
- description

2. 余裕を持った設定
phone_number VARCHAR(20)

3. 状態遷移を考慮した設計
order_statuses
- id
- name
- next_possible_statuses

3. 安全性を担保

なぜ必要か?

データの損失や不整合は、ビジネスに致命的な影響を与える。セキュリティ事故は信用問題に直結する。

❌ よくある間違い例

1. 制約の未設定
users
- email (制約なし)
- phone (制約なし)

2. 物理削除
DELETE FROM users WHERE id = 1

3. パスワードの平文保存
users
- password VARCHAR(50)

✅ 正しい例

1. 適切な制約
users
- email UNIQUE NOT NULL
- phone VARCHAR(20) CHECK (phone ~ '^[0-9\-\+]+$')

2. 論理削除
users
- deleted_at TIMESTAMP
- deleted_by INT

3. セキュアな設計
users
- password_hash CHAR(60)
- last_password_change TIMESTAMP

■ 管理画面設計の3原則:具体例で理解する

1. 安全性を最優先

なぜ必要か?

管理画面でのミスは影響が大きく、復旧が困難なケースが多い。特に深夜や緊急時は、ミスのリスクが高まる。

❌ よくある間違い例

1. 危険な操作が容易すぎる
[全ユーザー削除] ボタンを直接配置

2. 影響範囲が不明確
「設定を変更しますか?」
[OK] [キャンセル]

3. 復旧手段なし
データ削除後の
「元に戻せません」

✅ 正しい例

1. 多段階の確認
[削除実行] 
→ 対象の確認 
→ 理由の入力 
→ パスワード再入力

2. 影響範囲の明示
「この操作により100件のデータが
  変更されます:
  - ユーザーデータ: 50件
  - 関連注文: 50件」

3. 復旧オプション
「この操作は30日間取り消せます」
[実行] [キャンセル]

2. 分かりやすさを重視

なぜ必要か?

操作の迷いやすさは、ミスや遅延の原因となる。特に緊急時や新人が操作する場合にクリティカル。

❌ よくある間違い例

1. 不親切な操作導線
[実行] ボタンのみ

2. 分かりにくいエラー
「Error Code: 1452
参照整合性制約違反」

3. ヘルプが不十分
「マニュアルを参照してください」

✅ 正しい例

1. 明確な操作ステップ
1. 対象選択
2. 内容確認
3. 実行確認
4. 完了確認

2. 具体的なエラーガイド
「このユーザーは現在注文処理中の
ため削除できません。
対処方法:
1. 注文をキャンセルまたは完了
2. その後再度削除を実行」

3. コンテキストヘルプ
各項目の横に[?]ボタンを配置
クリックで説明表示

3. 記録を確実に

なぜ必要か?

問題発生時の原因特定や、監査対応に必須。また、操作の証跡として重要。

❌ よくある間違い例

1. 不十分なログ
「データ更新」

2. 変更内容が不明確
「設定変更」

3. ログの確認が困難
開発者用コンソールのみ

✅ 正しい例

1. 詳細なログ
2024-01-01 13:45:23
user: admin
action: user_delete
target_id: 123
reason: 不正アクセス検知
ip: 192.168.1.1

2. 変更内容の記録
before: {status: active}
after: {status: suspended}
reason: 規約違反
evidence: ticket#1234

3. ログの可視化
管理画面から
- 操作ログ検索
- 変更履歴の確認
- 監査レポート出力

Discussion