JaSST ‘13 Tokyo
データベースメトリックスの活用
ーシステム内部品質の向上に向けてー

日本アイ･ビー･エム㈱蔭山泰之ソフトウェアのバスタブ曲線
どのようなシステムでも、長年使い続けていれば、その品質は経過時間にともなって劣化していく。
この点では、ソフトウェアの品質の推移は、ハードウェアが示すバスタブ曲線と似たようなかたちになる。

ハードウェアのバスタブ曲線

ソフトウェアのバスタブ曲線

ただし、ソフトウェア･システムの場合、ハードウェアの磨耗故障にあたるのは内部品質の劣化。

改修の積み重ねによるコードの肥大化
最初は保守しやすいコードだったとしても、保守による改修の際に徐々にコードの品質が低下していく可能性がある。とくに、機能的に重要なコードは改修頻度が高いので、重要な部分ほどコードの品質が低下するという傾向がある。

機能追加の繰り返しによりコードが肥大化して、構造的特性が徐々に劣化していく←ソフトウェアシステムのバスタ
ソフトウェアシステムのバスタ
ブ曲線の原因外部品質と内部品質
ソフトウェア・システムの品質は大きく外部品質と内部品質に分けられるが、中長期的な対策を施すべきは、内部品質の方。

内部品質

外部品質

外部品質の低下は不具合として顕在化するので、ただちに対策がとられる場合が多い

作るとき・直すとき・拡張するときにわかる品質•構造のわかりやすさ
構造のわかりやすさ•機能改修・追加のしやすさ
機能改修・追加のしやすさ•テストのしやすさ
テストのしやすさ•整合性のとりやすさ
整合性のとりやすさ

ユーザー

使うときにわかる品質•機能の豊富さ
機能の豊富さ•機能の正しさ
機能の正しさ•機能の使いやすさ機能の使いやすさ•実行時性能
実行時性能

コード
データ
モデル

内部品質が伴わなければ、実質的には外部品質の確保も困難

開発者

内部品質の低下は外からは見えにくいので、放置される場合が多い

しかし・・・

質低下の連鎖外部品質の低下

外部品質の低下→信頼性低下による不具合の頻発
信頼性低下による不具合の頻発→生産性低下による納期の遅れ・コスト超過
生産性低下による納期の遅れ・コスト超過

影響

内部品質の低下

書き方に関する品質の低下→その場しのぎコードの増大
その場しのぎコードの増大→信頼性・性能の低下
信頼性・性能の低下

影響
内部品質の低下→保守性・生産性の低下
保守性・生産性の低下

ここを抑える
ことで連鎖を断ち切る

内的品質の構造に関する品質が低下すると、保守性・生産性が低下し、改修の影響を十分に調べ切れないうちに改修を加えたり、影響範囲が不明なままテストを実施したりするようになる。すると、内部品質低下が、結果として外的品質の低下として顕在化してくる。
。

データモデルの品質維持・管理
プログラムとデータはシステムの両輪であり、システムの品質を維持するためには、プログラムの品質だけでなく、データの品質も管理しなければならない。
とくに、データベースは、複数のプログラムが共通にアクセスする情報なので、その品質の低下の影響は小さくない。
アプリケー
ション・
プログラム

データ
ベース

データの品質は、（１）データの妥当性・精度などの内容に関する特性（２）データの整合性・効率などの構造（データモデル）に関する特性に分けることができる。構造に関する品質、とくにアプリケーションとの関係についての情報は、ＣＲＵＤマトリックスなどによって管理することができる。

データベースの不吉な匂い
データベースの内部品質が良くない場合の比喩としての「データベースの不吉な匂い」。リファクタリングのきっかけ。

• 複数の目的に使われるカラム。
• 複数の目的に使われるテーブル。
• 冗長なデータ。
• カラムの多すぎるテーブル。
• 行の多すぎるテーブル。
• 「スマート」カラム。
• 変更の恐怖。

S．
．W．
． アンブラー、．サダラージアンブラー、P．
『データベース・リファクタリング』より『データベース・リファクタリング』より

CRUDマトリックス生成ツール
データディクショナリ（テーブルID、項目ID）とSQL文の情報を元に、DB項目単位、SQL文単位にCRUDマトリックスを生成するツール
入力データ
DB項目一覧
項目一覧
データ
ディクショナリ
SQL文または文またはデータアクセス
プログラムソース

出力データ
自動生成
CRUDマトリクス
マトリクス

プログラム・
項目の利用状況
調査判定へ

CRUD
チェック結果SQLないしないしDBないしアクセスプログラムの改善へ

CRUD
生成

業務機能名
SQLID対応
対応（オプション）ツール
変更予定個所
変更対象DB項目
変更対象 項目

変更影響範囲影響SQL一覧
一覧
影響

SQLないしないしDB項目
ないし 項目
改修時の変更影響対応の見積もりの改善へデータベースメトリックスの比較対照
規模がかなり大きい

1

2
3

•凡例
凡例
実質項目：テーブル中の項目のうち、更新日時、更新者IDなどのシステム管理
実質項目：テーブル中の項目のうち、更新日時、更新者 などのシステム管理上設定されている項目を除いた、アプリケーショントランザクションで利用される項目。

他のシステムと比較した今回のシステムの特徴
１．主キー項目の比率が低い
正規化があまり進められていないためか？
エンティティ・リレーションにおいてリレーションが深くない？

２．ひとつのテーブルあたりの項目数が多い
テーブルの凝集度が低い。正規化があまり進められていないか？
項目の繰り返し・重複がある？
主キーに従属しない項目がある？
推移従属がある？

３．CRUDマトリックスが疎である
ある特定の目的のために設定されていて、複数のアプリで共有されていないテーブルが多い？
同じ意味の項目が複数のテーブルに散らばっている？

正規化の進展•エンティ
ティB•親エンティティ

•1

業務データ•M•子エンティティ

•エンティティA•1•M

連関エンティ
ティ

正規化が進められると、ひとつひとつのエンティティのサイズが小さくなり、その代わりにエンティティ同士の間にリレーションが増えてくる。
リレーションが増えると、それを表現するための主キー項目が増える。
１．親エンティティの主キー項目が外部キーとして子エンティティに降りてくる。
２．連関エンティティには、連関を結ぶエンティティの主キー項目が外部キーとして含まれてくる。
相対的に従属項目の比率は下がってくる。

正規化と項目数の多いテーブル
正規化を進めれば、主キー項目によって決まる項目だけが従属項目として残るので、ひとつひとつのエンティティは小さくなっていく。
つまり、そのエンティティに本当に必要な項目だけが残る。
結果としてエンティティの凝集度が高まる。

逆に、従属項目が多いエンティティは、そこに本来は必要のない項目が多く含まれている可能性がある。
必要のない項目は、複数のエンティティに重複して存在している可能性がある。

⇒ データ不整合の温床

CRUDマトリックスの密度

密なCRUDマトリックス

疎なCRUDマトリックス•複数のアプリケーションから共通にアクセスされているテーブルが多いと、CRUDマークは増える傾向にあり、 CRUDとしては密になる。
•各アプリケーションがそれぞれ固有のテーブルにアクセスしていると、CRUDマークは減る傾向にあり、 CRUDとしては疎になる。
•正規化が進められていないと、同じ項目でもアプリケーションごとの固有のテーブルに散らばってしまい、データの不整合が発生しやすくなる。

品質改善作業のポートフォリオ
データベースは複数のアプリから共通にアクセスされる基盤なので、リファクタリングの効果も大きいが、影響も大きい。

難易度度度度

高①②

低③④

小大
効果

改善効果の高い部分② 、 ④は、放置した場合に危険度の高い部分でもある。
⇒効果が大で難易度の低い④の部分から始めるのがよい。
④から始めて③に至り、最終的には②を目指す。

内部品質向上へ向けての対応策• 未使用テーブルの確認・除去
物理的に定義されているが、物理的に定義されているが、現状ではアプリケーションから使われていない
現状ではアプリケーションから使われていないテーブルの有無をチェックし、あれば、それの必要性を検討して、不必要であれば削除する。
⇒不要なテーブル数が減ることにより、不要なテーブル数が減ることにより、調査範囲が減り、調査範囲が減り、影響範囲調査などの人的工数が低減する。
人的工数が低減する。

• 重複SQLの除去の除去
重複
同じCRUDマークのマークのSQLを調査し、同じ内を調査し、同じ内同じマークの容のSQLであれば重複を除去する。
であれば重複を除去する。
容の⇒SQLの共通利用により、の共通利用により、SQLの全体本数の全体本数の共通利用により、が低減し、調査範囲を絞ることができて、調査工数を削減することができる。
SQLに対して改修・改善を施さなければに対して改修・改善を施さなければならなくなった場合に、同じ複数のSQLををならなくなった場合に、同じ複数の改修する必要がなくなるので、改修・テス
ト工数を削減することができる。
同じCRUDマーパターン
マーパターン同じ

システム内部品質の向上に向けて内部品質維持・向上のためにかける工数は、中長期的には外部品質維持の工数削減、あるいは機能拡張の生産性向上というかたちで効果が現われてくる。
品質の劣化を防ぐ

放置しておけば時間とともに劣化していく内部品質について対策を施すことで、外部品質の低下を防ぐことにつながる。

品質維持・向上のための施策
１．機能拡張・新規追加部分の品質維持管理（ルールとチェック）
品質維持のためのルールを設けてそれが守られているかチェックする。
２．システム既存部分の品質向上（再設計とリファクタリング）
すでに劣化している部分で将来に影響がありそうな部分を改善する。
３．システムの内部品質の継続的な計測と評価
どちらについても内部品質の状態の推移を客観的に評価する必要がある。