SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

DB Magazine 転載記事

まったくの初心者もこれでバッチリ
12のキーワードから学ぶデータベース基本中のキホン(前編)

『DB Magazine 2007年05月号』 転載記事

keyword 6 制約(整合性制約)

 データベースのデータは、ビジネスルールに則って正しく格納されている必要があります。例えば、社員表の社員番号は重複していてはならないとか、在庫表の数量の値はマイナスになってはいけないなどです。しかし、データを入力したり更新したりする際に、オペレーションミスや悪意的な作為によってルールに反する状態になってしまう可能性があります。

 データを正しくするための方法として、いくつかの方法が考えられます。アプリケーション側に、そのためのロジック(例えば、数量にはマイナスデータはあり得ないなど)としてビジネスルールを組み込んでおくことが思い浮かぶでしょう。ただし、そうすると、すべてのアプリケーションにビジネスルールを組み込む必要があり、1つのアプリケーションでもそれを怠ってしまうと、正しくなくなる可能性が出てきます。また、正しさを保証するビジネスルールに修正が発生したときに、ビジネスルールが組み込まれているすべてのアプリケーションのメンテナンスを行なわなければなりません。

 そのため、データベース側でビジネスルールのチェックを行なうものとして用意されているものが「制約(整合性制約)」になります。データベース側でチェックを行なう利点として、ビジネスルールをデータベース1箇所で集中管理することにより、どのようなビジネスルールがあるかを把握しやすく、またメンテナンスが発生した際の手間が最小限(データベース上の1箇所の修正)で済むことが挙げられます。一方、欠点として、制約に違反するデータが発生した際に、そのデータの発生元のアプリケーションではなく、ネットワークを経由してデータベースまで到着した後に、判明したエラーをアプリケーション側に返すことになるので、ネットワークの負荷が大きくなる可能性があります(図11)。

図11:「制約」による処理の負荷
図11:「制約」による処理の負荷

 制約(整合性制約)には、主キー、 一意、 NOT NULL、チェック、参照整合性などの種類があり、それぞれ列に対して指定します。簡単に紹介すると、次のようになります。

主キー制約

 正規化のところで説明しましたが、表の行を識別する制約となります。必ず値が入っていなければならず、値の重複を許しません。表に対してただ1つのみ設定できます。

一意制約

 列の値の重複を許さない制約です。

NOT NULL制約

 値が入っていない状態を「NULL値」と言います。このNULL値を防ぐ、つまり必ず該当の列には値が入っている状態を強制する制約です。

チェック制約

 例えば、数量列は値が0よりも大きくなければならないように、列の値が特定の範囲に収まっていることを保証する制約です。

参照整合性(外部キー)制約

 データベースの説明のところでリレーションシップという言葉を説明しましたが、そのリレーションシップの値の関連付けを強制する制約となります。例えば、社員表の部署コードの値は部署表の部署コードの列の値のいずれかでなければなりません。もし、この状態に反するような値が入っていた場合、その社員はどの部署に所属しているのかが分からなくなります。このような状態にならないように、各種の操作を抑止する働きがあります。社員表の部署コードにこの制約を定義することになります(図12)。

図12:参照整合性の例
図12:参照整合性の例

ストアドプロシージャ

 データベースにはデータのほか、アプリケーションを格納することもできます。データベースに格納したアプリケーションを「ストアドプロシージャ」と言います。これを利用して、制約として実現できないビジネスルール(例えば、処理は9:00~18:00の間でないと行なえないなど)についてロジック化し、データベースに格納し集中管理することもできます(図13)。

図13:ストアドプロシージャによるエラーチェック
図13:ストアドプロシージャによるエラーチェック

トリガー

 データ入力などの各種の操作に応じて、あらかじめ動作内容を設定させておくこともできます。これを「トリガー」と呼びます。例えば、表に対する入力(INSERT)時に表に対するビジネスルールを表にトリガーとして作成しておき、自動的にその操作が正しいかチェックさせることを可能とします。チェックに失敗したらアプリケーションにエラーを返します。

 ストアドプロシージャとの違いは、実行時に明示的にその格納されているアプリケーションの名前を指定する必要がなく、データ入力などの各種の操作に応じて、自動的に起動するところにあります(図14)。また、トリガーを使用すると、連携したアプリケーションの自動起動などを行なうこともできます。例えば、受注表に受注データが追加(INSERT)されたら、在庫表の在庫データを減らす(UPDATE)アプリケーションを連携実行させます。これにより、アプリケーションやシステムフローの設計をシンプルにする効果があります(図15)。

図14:トリガーによるエラーチェック(1)
図14:トリガーによるエラーチェック(1)
図15:トリガーによるエラーチェック(2)
図15:トリガーによるエラーチェック(2)

 Keyword 7~12は、後編(近日公開予定)で紹介します。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
DB Magazine 転載記事連載記事一覧
この記事の著者

市川 道雄(イチカワ ミチオ)

 株式会社日立システムアンドサービス、人財教育部に勤務。サポート/ソリューションサービス部門と連携した教育企画/実施を担当後、現在はOracleを含むデータベース関連教育を選任で担当している。Oracle認定講師。データベーススペシャリスト、ORACLE MASTER Gold Oracle Databas...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3261 2009/02/05 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー