前回に引き続き論理設計のグレーノウハウについて。
Contents
列持ちテーブル
これは下記のようなテーブルです。
社員ID | 社員名 | 子1 | 子2 | 子3 |
---|---|---|---|---|
001 | 山田 | 一郎 | 二郎 | 三郎 |
002 | 鈴木 | 健太 | 寛太 |
列持ちとはこのように子1~子3のようなテーブルを持つことですね。比較的よくやりますね。
今の開発でもたまに使っています。とりあえずメリットとデメリットを見ていこうと思います。
メリット
シンプルな設計
見たまんまで非常にわかりやすいですね。正規化とかスカラを理解していなくてもOKです。
入出力のフォーマットと合わせやすい
シンプルさゆえに画面とロジック、データベースとの連携が非常に簡単です。CSVで出力するときもこのまま出力すればOKですし、SELECT文でだせばいいだけです。
デメリット
列の増減が難しい
リレーショナルテーブルの欠点として後になってからの構成変更が難しいということです。列自体が不要になったり、増加させたい場合に変更コストが大きくなります。
無用のnullが必要
列持ちテーブルの欠点として、子がいない、子が少ない場合は無用のnullを使う必要が出てくるということです。
nullが含まれているとSQL文の結果を混乱させるもとになります。
特殊な状況でなければ別途行持ちテーブルを作るべき
そのため使いどころによっては有用ですが、そうでなければなるべく下記のような行持ちテーブルにすべきです。
社員ID | 枝番 | 子 |
---|---|---|
001 | 1 | 一郎 |
001 | 2 | 二郎 |
001 | 3 | 三郎 |
002 | 1 | 健太 |
002 | 2 | 寛太 |
アドホックな集計キー
これは下記のようなテーブルがあり、地方ごと(北海道・東北、関東、中部、・・)の人口を出したいという要件があったとします。
都道府県コード | 都道府県名 | 人口(万人) |
---|---|---|
001 | 北海道 | 550 |
002 | 青森 | 130 |
022 | 静岡 | 370 |
023 | 愛知 | 740 |
このときに地方コードとして新たに北海道・東北=01、関東=02、東海=03を取り入れるというような設計を見かけます。
確かにこのような列を新たに追加すればSQLの集計が非常に楽になります。半面、こういったアドホック(場当たり的)な集計キーは名前の通り、短いスパンでコードが変わったり、別のコード体系が必要になったりします。
このようなことを繰り返すとますますテーブルが巨大になり、パフォーマンスが落ちる原因になります。
このようなアドホックな列を作る代わりの対策としては下記のようなものがあげられます。
対策1 キーを別に分離
都道府県コードと地方コードだけをもったテーブルを別に作ることで、通常のテーブルよりも工数は小さくなります。ただし、結合処理が必要になるのでパフォーマンス問題の解決にはあまり寄与しません。
対策2 ビューを作成
これはオリジナルのテーブルには手を加えず、地方コードを追加したビューを用意して、そのビューへのアクセスによって簡単にSQLが記述できます。
ただし、後述するような多段ビューという問題が発生します。
対策3 SQLの中で記述
これはGROUP BY句の中でアドホックキーを作ってしまう方法です。
具体的には下記のようにSQLを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SELECT CASE WHEN 県コード IN ('01','02','03') THEN '01' - 下記の具体的な県コードと地方コードの対応については省略-- WHEN 県コード IN () THEN WHEN 県コード IN () THEN ELSE NULL END AS 地方コード SUM (人口(万人)) FROM 都道府県 GROUP BY - SELECT文の中のCASEを同様に書く-- CASE WHEN WHEN WHEN ELSE NULL END; |
多段ビュー
ビューには抽出したい列のみを取り出せる、複雑なSQLの一部を定義することでSQLをすっきり表現できるなど数々のメリットがあります。
しかし当然ながらすべての技術にはメリットとデメリットがあり、ビューを作りすぎてしまうことのデメリットも当然発生します。
以下のようなことがデメリットになります。
デメリット
実テーブルとの差分
これは先輩からよく聞かされました。元のテーブルとの差分ができてしまうということで作っても変更や維持コストがそれなりにかかるということなんですね。
パフォーマンスの劣化
ビューは物理的にテーブルを所持しているのではなく、ただのクエリです。そのため何段にもわたるようなviewを作成していれば依存関係が複雑になり、わかりにくくなりますし、パフォーマンス自体も劣化します。
ビュー自体は一段にとどめておくようにしましょう。
システムの世界には過度に複雑なつくりはシステムをダメにするという思想があるようです。
参考
Road to Oracle Master ~オラクル・マスターへの道 ビュー(VIEW)
Mick’s Page ビューの功罪