システム開発やアプリ開発において構築するものの一つとしてデータベースがあります。また、WebシステムにおいてもWebサーバー、アプリケーションサーバーのほかに、データベースサーバーを構築します。
システム開発やアプリ開発で構築するものとして必ずといっていいほど候補に挙がるデータベースですが、それがどのようなものか知っているでしょうか。
システムやアプリを構築するうえで、データベースはとても重要な役割をはたしています。今回はデータベースとは何かについて、その中身を解説していきます。
データベースとは、データを効率的に扱うために、整理してまとめたもの
業務の中で扱うデータは顧客情報や販売情報、社員情報など様々なものがあります。
それらのデータは「特定の商品をよく購入する顧客の年齢や性別を知りたい」「営業部に所属している社員の一覧を出したい」などの特定の目的に沿って利用されます。
様々なデータについて、目的に沿って利用しやすい形に整えたうえで貯めておく場所がデータベースになります。
表の形式でデータを管理する
データベースは表(テーブル)という単位でデータを管理します。例えば飲料水の販売情報を表にすると以下の図のようになります。表は行と列というさらに細かい単位に分けて見ることができます。
行は表に格納されている1件1件のデータを意味しています。表の例では、「B次郎という人が2000年4月4日に緑茶を20個購入した」という情報が1件の行になります。
列は行の中にどのような項目が保持されているのかを表します。表の例では、製品名という名前の項目には購入された製品名が入っています。
複雑なデータは複数の単純な表に分けて管理する
図1の表の例は販売情報をそのままの形でデータベースに保存しています。この販売情報の表を以下の図のように表を分割することでより管理しやすくなります。
分ける前の販売情報表を見ると、製品名の列の値が天然水となっている行が2行あります。もし天然水の値段が変わった場合、この2行において金額列の値を更新する必要があります。
一方、3つの表に分けた場合、製品名と金額の表を1行更新するだけで済みます。これは、購入者が引っ越して発送先が変わった場合にも同様のことがいえます。
このように表を単純な表に分けることで、データに変更が発生した場合に更新する行を最小限にすることができます。このような利点があるため、データベースに表を保存するときは元の情報をできるだけ単純な表に分けて保存していきます。
データベース管理システムはデータベースを管理・操作する専門のソフトウェア
表の形で多くのデータが集められているのがデータベースと説明しましたが、ただデータを貯めているだけでは意味がありません。それらを活用するための仕組みが必要になります。
データを最新の状態に更新したり、必要なデータを検索したりするための専用のソフトウェアがデータベースにはあります。それはデータベース管理システムと呼ばれているものです。
データベース管理システムには主に以下の機能があります。
- データベース言語
- SQLというデータベースに指示をあたえる言語機能
- データ完全性
- 重複するデータの登録を防ぐ機能
- トランザクション処理
- 複数ユーザーが同時にデータに矛盾なくアクセスできる機能
- セキュリティ
- 誰がどのデータにアクセス出来るか制御するセキュリティ機能
- 障害復旧
- 機械が壊れたときに復旧する為の機能
上の機能があるため、データベース管理システムを使って管理するデータベースでは、後述するファイルシステムでデータを管理するよりメリットがあります。
ファイルシステムはファイルを管理するパソコン自体の機能
ここまでデータベースについて説明してきましたが、個人で使用するパソコンには最初はデータベースが入っていません。代わりにファイルシステムという機能でデータを管理します。
ファイルシステムはパソコン自体に元から備わっている機能です。テキストファイルやExcelなどのファイルを管理する機能であり、この機能を使用してデータを管理することになります。
このファイルシステムを使用する場合とデータベースを使用する場合では、どのような違いがあるでしょうか。
ファイルシステムとの違いからみるデータベースのメリット
ファイルシステムはファイル単位でデータを管理しますが、いくつか課題があります。一方、データベース管理システムにはそれらの課題を回避する機能が備わっています。
データベース管理システムの機能によって、どのようなメリットがあるかファイルシステムの課題を踏まえて説明していきます。
データを一か所で管理でき、様々なアプリでデータを共有できる
ファイルシステムの場合、アプリごとに適したフォーマットのファイルを使っています。別々のアプリで使用するファイル内に同じようなデータが存在していることがあります。
同じデータが別々のファイルに存在する場合、ファイルシステムでは以下の図のように「一方のファイルでは更新したデータがもう一方のファイルでは更新されていない」ということがあります。この場合、ファイルの間でデータの矛盾が発生します。
一方、データベース管理システムではデータベース言語を使用することで複数のアプリで一つの表を共有できます。
データベース言語にはSQLという規格化された言語が使用されています。SQLはデータベースを操作するための言語であり、データを取得したり更新したりできます。
この言語の使い方(文法)の基本はISO(国際標準化機構)やJIS(日本工業規格)によって標準規格化されています。データを取得・更新するときにどのような文法で記述するかということが、世界的な組織によって決められているのです。
SQLの文法として共通のルールが決まっているため、様々なアプリがそのルールに沿ってデータベースのデータを使用する機能を作成しています。
どのアプリもデータを使用する仕組みが同じなのでアプリに合わせてデータの形式を変える必要がありません。一つのデータを用意すれば複数のアプリが共有して使用できます。
整合性を保ったままデータを管理できる
保存しているデータ全体で整合性を保つためには、以下の問題に対処できる必要があります。
- 誤ったデータが入力されてしまう
- 二人のユーザーが同時に操作することで間違った更新をしてしまう
- 更新処理の途中で失敗したときに、中途半端に結果が反映されてしまう
データベース管理システムには、それぞれの問題に対処するための機能が備わっています。それらの機能について順に説明していきます。
誤ったデータの入力を防ぐ機能
「誤ったデータが入力されてしまう」とは、以下の図のように「数字のみが入力されるべき項目に漢字が入力される」ということです。
ファイルシステムで誤ったデータの入力を防ぐためには、入力されたデータの正誤を判断する機能をアプリにつける必要があります。
一方、データベース管理システムでは、「金額列には数字のデータしか入力できない」という条件を列ごとに設定することができます。この条件に合わないデータが入力されるとエラーになることで、誤ったデータが入力されることを防ぎます。
ファイルシステムでは金額列を使用するアプリ全てに正誤を判断する機能をつける必要があるのに対し、データベースでは金額列に条件を設定するだけで済みます。
二人のユーザーによる同時操作に対処する機能
一つのデータに対して二人のユーザーが同時に更新処理をしようとすると、タイミングによっては間違ったデータが登録されることがあります。
上の図では、ユーザーAとユーザーBが在庫数をそれぞれ読み取った段階ではどちらも同じ値を取得します。ここで、ユーザーAが出荷処理をした結果を先に入力した後、ユーザーBが入荷処理をした結果を入力すると間違ったデータが登録されます。
本来、ユーザーBはユーザーAが出荷処理した結果を使って入荷処理するべきです。しかし、二人のユーザーが更新前の値を取得したことでこの問題が発生します。
データベース管理システムには、同時操作による誤った更新が発生しそうになると再取得を要求する機能が備わっています。
例えばユーザーBによって入力された値の処理中、ユーザーAにより更新される場合、上の図のようにユーザーBは値を再取得するように要求されます。つまり、ユーザーBはユーザーAが更新した値で入荷処理を実行して正しい値を入力することになります。
更新処理の途中で失敗したときに、中途半端に結果が反映されることを防ぐ機能
複数の表のデータを更新する一連の処理をひとまとまりの処理として扱いたい場合があります。その処理単位はトランザクションと呼ばれ、以下の図のような銀行の口座振込処理が該当します。
図のような口座振込処理では、口座Aから出金して口座Bへ入金するまでの一連の処理が全て成功することで目的を達成できます。もしこれが、以下の図のように途中で処理が中断してしまった場合、口座Aの残高が減ったのに口座Bの残高は増えていないという矛盾した状態になってしまいます。
口座振込のようなトランザクション処理は一連の処理が全て成功した場合のみ結果を反映します。途中で処理が失敗した場合は以下の図のようにそれまでの結果を全て最初の状態に戻す必要があります。
データベース管理システムには上の図のように、「ひとまとまりとして扱いたい処理が途中で失敗したら元の状態に戻す」という機能が備わっています。この機能により、処理の途中までの結果だけ反映されて矛盾した状態になることを防ぐことができます。
誰がどのデータにアクセス可能か制御できる
データベース内の情報を保護するために、誰がどのデータにどこまでの操作(読み取り・書き込みなど)できるか制御する必要があります。
ファイルシステムにも各ユーザーやユーザーグループに対して特定のファイルやフォルダにどこまでの操作が可能か制御するためのアクセス制御リスト(ACL)という機能があります。
しかし、ファイルシステムでアクセス制御できるのは最小でファイル単位までです。特定のユーザーに対して、ファイル内の特定のデータのみ読み取れるように許可するということはできません。
一方、データベース管理システムは特定のユーザーに対して表の特定の列のみ見ることを許可するということまでできます。その方法はビューと権限というものを利用します。
ビューは仮想のテーブルのようなものです。ビューはデータを持っているわけではなく、特定の列だけ表示する操作に名前を付けて保存したものです。ビューを読み取るときに保存した操作が実行されるので、特定の列だけを持った仮想のテーブルのように扱えます。
権限はユーザーに与えることでユーザーに特定の操作を許可します。ある表の読み取り権限をユーザーに与えれば、そのユーザーはその表を読み取ることが可能になります。
例えば以下の図のようにユーザーBに社員情報表の氏名列だけを読み取り可能にしたい場合、氏名列だけを表示する社員名ビューをまず作成します。そして、ユーザーBには社員名ビューの読み取り権限のみを与えます。
ユーザーBが読み取り可能なのは社員名ビューだけなので、ユーザーBに社員情報表の氏名列だけを公開するアクセス制御が可能になります。
障害が発生したとしてもデータを復旧できる
なお、パソコンが壊れたり電源が切れたりすることでデータが消えることを「障害が発生した」といいます。ファイルシステムでは障害が発生したときにデータを復旧することは容易ではありません。
ファイルのバックアップを保存していればバックアップを保存した時点のデータは復旧できますが、バックアップ保存後に更新・追加したデータを復旧することができません。
一方、データベース管理システムにはバックアップを保存した後の更新データも復旧する機能が備わっています。
下の図のようにバックアップを取得した後、データの変更内容をログファイルというものに保存していきます。
障害が発生したときは、以下の図のように
- バックアップを使用してバックアップを取得した時点の表を復旧
- ログファイルからバックアップを保存した後の変更を再現
という手順で障害発生直前の変更を記録した状態まで復旧します。
障害により消失するデータ量を最小限にできるので、ファイルシステムと比べて障害発生時のリスクが少ないというメリットがあります。
まとめ
システムやアプリを構築するうえで重要な役割をはたすデータベースについて説明してきました。データベースはデータを表という形で集め、データベース管理システムという専門のソフトウェアを使用して効率的に管理・操作します。ファイル単位でデータを管理するファイルシステムにはないメリットがデータベース管理システムにはあります。
世界全体で文法が規格化されているSQLというデータベース言語を使用することで、複数のアプリが1つの表を共有できるようになります。以下の機能によっって、データ全体の整合性を保つことができます。
- 間違ったデータが入力されることを防ぐために、表の列に条件を設定する機能
- 複数のユーザーが同時にデータを操作してもデータに矛盾が発生しないようにする機能
- 一連の処理が途中で止まったら、処理を実行する前の状態にデータを戻す機能
ファイル単位までしかアクセス制御できないファイルシステムに対して、ビューや権限を使うことで表の列単位でアクセス制御できます。バックアップを保存するだけでなくログファイルに変更履歴を保存することで、障害が発生したときも直前の状態まで復旧することができます。
このように、データベース管理システムはデータの整合性を保つ機能やデータを保護する機能が備わっています。システム開発やアプリ開発で、必ずといっていいほどデータベースが構築されるのはこのようなメリットがあるからです。会社の業務や顧客へのサービス提供でデータを扱う場合、データベース管理システムで管理されるデータベースを使用するのが適しています。
コメント