たとえば住所管理において、昨年度までの旧システムでは次のように「生徒」テーブルに「生徒住所」、「保護者住所」というフィールドで登録していた。
生徒(学籍番号,生徒住所,生徒電話番号,保護者住所,保護者電話番号)
しかし(1)生徒本人や保護者以外の住所を管理したい業務上の要求があること、(2)フィールドをダイレクトに更新するので、履歴が残らないこと、(3)電話番号も複数記録したいこと、などにより、次のようにテーブル構造を変更した。
生徒(PK学籍番号,生徒住所番号,代表保護者住所番号)
住所(PK住所番号,学籍番号,住所分類,住所)
電話(PK電話管理番号,住所番号,電話番号)
これでひとつの学籍番号に対して複数の住所を記録でき、生徒住所と保護者住所の住所管理番号を生徒テーブルに記録することで、関連付けを行うことができる。保護者の住所を複数登録することもでき、そのうちの代表保護者住所に対して郵送物を送るなどの処理ができる。電話番号も複数記録することができる。
このように住所管理を始めたが、住所にかかわるデータ処理を行うとき、いつもこれらのテーブル間連携を意識しなければならなくなった。結果としてビューの構造が一目で把握しずらいものになってしまう。
そこで次のようにテーブル構造を変更するとともに、トリガを利用して、テーブル間のリレーションを考えなくともよいようにすることにした。
生徒(PK学籍番号,生徒住所,保護者住所)
住所(PK住所管理番号,学籍番号,住所分類,住所)INSERTEDトリガ→UPDATE生徒(生徒住所or保護者住所)
電話(PK電話管理番号,学籍番号,電話番号分類,電話番号)
住所テーブルは一般の教員に対してINSERT,SELECT権限だけを与え、UPDATE,DELETEは許可せず履歴を残すことにする。住所テーブルにINSERTがあったときにトリガを起動して生徒テーブルの住所をUPDATEする。
このことで常に最新の住所データが生徒テーブルに更新され、それ以外の住所データもフレキシブルに記録できるようになる。ビューを使う必要がないので、データ構造がシンプルになる。