DBMSの種類
主流は「リレーショナル型」
データベースには、大きく分けて「階層型」「ネットワーク型」「リレーショナル型」「オブジェクト指向型」などがありますが、現在多く使われているのは「リレーショナル型」です。
リレーショナル型のデータベースは、二次元の表形式でデータを管理するデータベースで、「関係データベース」とも呼ばれます。これはエドガー・F・コッド(1923-2003)による「関係モデル」を実装したものだといえます。表形式のデータは行と列で構成され、行は個々のデータを、列は各項目の内容を表します。表1の場合、社員番号や氏名、誕生日や入社日などの列があり、行単位に個々の従業員のデータが格納されています。
社員番号 | 氏名 | 誕生日 | 入社日 | 部署コード |
1 | 山田 太郎 | 1980-01-23 | 2010-04-01 | 20 |
2 | 佐藤 花子 | 1984-05-05 | 2012-08-01 | 30 |
3 | 鈴木 一郎 | 1977-10-30 | 2009-09-01 | 20 |
リレーショナルデータベースを管理するDBMSはRDBMS(Relational Database Management System)と呼ばれ、格納されているデータを参照(変更)するときや、データを格納するテーブルを定義(変更)するときにもSQLという言語を使います。RDBMSは、正確性が求められる銀行のシステムのようなミッションクリティカルな用途から、住所録のような身近な事例でも使われています。定型データに強い一方で、使用前の段階で厳密な設計が必要です。
増え続ける非構造化データに対応するには
しかし、インターネットの普及とともに多様なサービスが登場し、検索やSNS、オンライゲームやIoTなど、大量のデータを扱う場面も増えてきました。多様な非構造化データを大量に、しかも高速に処理できなくてはなりません。しかも、データの構成が頻繁に変わります。
そこで、事前に細かな設定が必要のない、まったく新しいDBMSが必要になってきました。大規模な分散処理や非定型データへの対応などが可能な例として、NoSQL(Not only SQL)という分類があります。名前のとおり、SQLを使わずにデータを操作するデータベースで、RDBMS以外のデータベースを指すことが多くなっています。機能を最低限にして、キーと値のペアの管理のみ最適化することにより、大量のデータを高速に処理することが多く、Key-Value型データベースといわれています。
ただし、現在では使われている範囲が限定されていることから、本稿でデータベースという言葉を使った場合は、RDBMSを指すことにします。
データベースを生かすために知っておきたいこと
データベースを使うときにはDBMSがどのように処理をしているのか、その構造を知っておくと、欲しいデータを高速に取得できます。RDBMSは大きく分けて、「指定されたSQL文を解釈する部分」(コンパイル)と、「データをディスクなどに保存および取得する部分」(実行)で構成されています(図2)。
SQLを解釈する部分では、SQL文を解析して文法チェックなどを行うだけでなく、SQLを高速に実行できるように最適化も行います。このときには、開発者が記述したSQLをそのまま処理するのではなく、統計的な情報をもとに、効率よいSQL文になるように自動で書き換える場合もあります。
データを保存・取得する部分では、ディスク領域をテーブルや行に割り当て、効率よく処理できるように管理しています。このとき、どの順番にデータを格納しておけば高速に処理できるのか、無駄な領域を確保しないのかなど、最適な構成を考えなければなりません。
どちらもDBMSが自動的に設定する場合もありますが、多くの場合は開発者が指定したデータベースの定義に従って動きます。つまり、無駄なく高速に処理できる構成は、開発者が指定しなくてはなりません。
複数同時アクセスに対処する仕組み
更新の制御は難易度が上がる
データベースは複数の利用者が同時にアクセスすることが多いため、同時に同一のデータを参照および更新しても、矛盾なく正常に処理できるように制御することを「同時実行制御」と呼びます。
閲覧するだけなら、多くの利用者がアクセスしても同じ内容を返すだけなので、あまり難しくありません。しかし、更新が発生すると制御が難しくなります。例えば、1つのファイルを複数人で更新する場面を考えてみましょう。
Aさんが、あるテキストファイルを開いて、そこにデータを追記して保存しようと考えました。ところが、Aさんが追記している間に、Bさんも同じファイルを開きました。Aさんは追記したファイルを保存しますが、Bさんは追記前のファイルを開いています。Bさんが別の部分を修正して保存してしまうと、Aさんの変更が失われてしまいます。
悲観的に制御するか、楽観的に制御するか
このように、同時に同じデータにアクセスすると、本来の結果とは異なってしまう可能性があります。そこで、ある人がデータを使っている場合、ほかの人はそのデータを扱えないようにする必要があります。Aさんの更新処理が終わってからBさんがファイルを開けば、正しい結果が得られます。
これを「排他制御」と呼びます。これは、誰かがファイルを使っているときにファイルを保護する方法です。ファイルを開くときにエラーを表示する場合は、特に「悲観的排他制御」といいます。この方法では、ある人がファイルを開いたまま席を外してしまうと、ほかの人は更新できなくなってしまいます。
それを避けるため、完全に使えなくするのではなく、更新しようとしたときにエラーメッセージを表示する方法も考えられます。つまり、ファイルは開けるようにしておき、更新を反映する際にそのファイルが他で更新されていないかをチェックし、誰かが更新していればメッセージを表示して、処理をやり直してもらう方法です。予想がつくと思いますが、こちらは「楽観的排他制御」といいます(図3)。