0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

概念データモデルで「イベント」をエンティティにすると破綻しやすい理由

0
Posted at

データベース設計を考える際、概念データモデルの段階で「イベント」をそのままエンティティとして扱ってしまい、後で設計が苦しくなることがあります。

今回はその理由を簡単な例で整理します。

1. 問題になりやすい具体例(NG例)

・注文
・申込
・契約
これらをそのままエンティティ(テーブル)として定義したくなることがあります。
注文
├ 注文ID
├ 顧客ID
├ 商品ID
├ 注文日
├ 状態(受付中/完了/取消)

一見すると問題なさそうに見えます。

2. なぜこの設計がつらくなるのか

• 状態が更新されるたびに過去情報が消える
• 「いつ・なぜ」状態が変わったか分からない
• 取消・再処理・再申込に弱い

特に履歴管理が要件に出た瞬間に破綻しやすい。

3. 考え方の整理

• 顧客・商品 → 実体
• 注文・申込 → イベント(状態変化を伴う)
イベントは「1レコード=1状態」で考えると設計しやすい。

イベントは、
• 履歴として残すのか
• 状態管理が必要か
を意識して設計する必要があります。

4. 理想の具体例(改善後)

実体テーブル
顧客
├ 顧客ID(PK)
├ 氏名

商品
├ 商品ID(PK)
├ 商品名

イベント+履歴テーブル
注文
├ 注文ID(PK)
├ 顧客ID(FK)
├ 注文日

注文履歴
├ 注文履歴ID(PK)
├ 注文ID(FK)
├ 状態(受付中/完了/取消)
├ 更新日時

✔ 状態変更は「履歴として追加」
✔ 過去状態が追える
✔ 再処理・取消要件に対応しやすい

5. デスぺ視点でのポイント

データベーススペシャリスト試験(午後Ⅱ)では、
• 状態遷移
• 履歴管理
• 再処理
が要件に含まれることが多く、イベントを安易に1エンティティで済ませると減点されやすいです。

まとめ

・問題例 → なぜダメか → 理想例の順で考える
・イベントは状態変化を前提に設計する
・履歴は別エンティティとして扱うと安定する

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?