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?

データベースを基本からまとめてみた【DB設計・SQLアンチパターン】

Last updated at Posted at 2025-10-15

ジェイウォーク(信号無視)

  • 多対多(Many-to-Many)の関係を正しく表現せず、データが格納されているべきテーブルの外部に、冗長な形で関連データ(特にIDのリスト)をカンマ区切りなどの文字列として格納してしまうアンチパターン
社員CD 所属部署
10001 営業
10002 経理
10003 営業/経理

※ カンマや『/』などの区切り文字を利用  長くなる・毎回更新

社員CD 所属部署
10001 営業
10002 経理
10003 営業
10003 経理

※ 行を分けて管理

ナイーブツリー

  • SQLアンチパターンにおける「ナイーブツリー(Naïve Tree、単純なツリー)」とは、階層的なデータ構造(ツリー構造、例:組織図、カテゴリ、コメントのスレッドなど)をデータベースで表現する際に、最も単純で、しかし多くの問題を抱える方法を採用してしまうアンチパターン
id 組織名  上位組織
1 本社 NULL
2 営業部 本社
3 経理部 本社
4 営業1課 営業部
5 営業2課 営業部

※ 階層構造の参照が難しい

id 組織名  上位パス
1 本社 本社/
2 営業部 本社/営業部/
3 経理部 本社/経理部/
4 営業1課 本社/営業部営業1課/
5 営業2課 本社/営業部/営業2課

※ 参照はしやすいが管理はしにくい ⇨ 分析用に構築
※ 再起クエリを利用する手もある

IDリクワイアド(とりあえずID)

  • 主キーの役割を理解しないまま、すべてのテーブルに無条件で意味のない(業務的な意味を持たない)連番のサロゲートキー(代理キー)を主キーとして設定してしまうアンチパターン
id 受注ID 品目ID
1 9100001 I001
2 9100001 I002
3 9100002 I003
4 9100002 I004
5 9100003 I005
6 9100003 I006

※ 受注IDと品目CDでユニーク(一覧)なのにIDが存在する

受注ID 品目ID
9100001 I001
9100001 I002
9100002 I003
9100002 I004
9100003 I005
9100003 I006

※ 受注IDと品目CDで主キーを構築 整合性を保てる

キーレスエントリ(外部キー嫌い)

※ 論理的な関係性はあるが外部キーを設定するかどうか?

※ アプリケーション側でチェックしているなら不要
⇨ 二重チェック メンテナンスが難しくなる
⇨ データパッチで順番を意識する必要が出てくる

EAV(エンティティ・アトリビュート・バリュー)

品目CD 属性名  属性値
I001 品目名 みかん
I001 単価 100
I001 カテゴリ 柑橘類
I001
I002 品目名 レモン
I002 単価 150

※ SQLデータ型が使えない 必須設定ができない 一方拡張性は高い

※ 属性は横に持たせる

品目CD 品目名  単価 カテゴリ
I001 みかん 100 柑橘類
I002 レモン 150 柑橘類

ポリモーフィック関連

※ 電話とメールの詳細情報を別管理 制約が使いにくい

※ それぞれ別テーブル もしくは区分追加

マルチカラムアトリビュート(複数列属性)

受注ID 品目名1 品目名2 品目名3
9100001 りんご NULL NULL
9100002 みかん スイカ NULL
9100003 いちご モモ メロン

※ 正規化ができておらず、管理が難しい(一意性の確保・更新対象列の確認)

受注ID 品目名
9100001 りんご
9100002 みかん
9100002 スイカ
9100003 いちご
9100003 モモ
9100003 メロン

※ 従属テーブルを作成(正規化)

メタデータトリブル(メタデータ大増殖)

※ ワークテーブルも削除するためのルール・仕組みを検討しておく
[受注テーブル]
[受注テーブル2010][受注テーブル2011][受注テーブル2012]
※ 同じ構造のテーブルが複数存在する(例えば年ごとに作成)

[受注テーブル]
[過去受注テーブル]
[受注テーブル退避(ファイル)]
※ パフォーマンスのために過去テーブルを1つ それより過去はファイルで退避

参考サイト

こんな設計してない?ダメな理由を知って良い設計にしていこう!DB設計・SQLアンチパターン

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?