略すところが違うだろ思考作品=至高作品

2016年07月17日

できるだけわかりやすく説明してみるという実験:データベースとは?

よく、物知りの人のことを「あの人は人間データベースだ」などというが、この「データベース」とは何なんだろう?
これだけ世間一般に使われている言葉でありながら、「データベースって何?」と聞かれると、「データを蓄積するもの」という答えになるだろう。
「データを蓄積するもの」という答えは50点。

データベースはデータを蓄積するのは当然として、「その蓄積したデータを検索して取り出すことができる」ということが重要である。

ある規模以上のコンピューターのプログラムはそのプログラムで扱うデータを管理するためにデータベースを使う。
たとえば何らかの商品をネット上で売るシステムがあるとする。
このとき、ありうるデータとしては顧客データと商品データ、それと購入履歴データが考えられる。
 

顧客データは、顧客のログイン、パスワード、氏名、住所が最低限必要だろう。
「お誕生日月は◯%off!」というのもやりたいので生年月日もデータとして持っておく必要がある。
またお買い上げごとにポイントをつけて、それが貯まったらプレゼント!などもやりたいので、ポイントもデータとして持っておくことにしよう。
DB1
顧客一人あたりのデータを一行に書いたもの(これを"レコード"と言う)を集めたものを"テーブル"という。
このテーブルに蓄積されたデータのなかから、あるレコードを検索するにはどうすればいいだろうか?
たとえば、上記のように3件だけ入った顧客テーブルから、"ピキ"という文字が氏名に含まれているレコードを探す場合は、最初から順にひとつずつ見ていけば、3番めに見つかり、そのレコードが表す顧客がpickyというログイン名で、生年月日は、、、というのがすぐに分かる。
だが、実際の顧客テーブルというものは数万件から数百万件ものレコードが入っているものである。
コンピュータが高速に処理をこなすことができるとしても、一件ずつ探すのは非効率である。検索に数分もかかっていたら、ネットで買い物をしようとする人はそこでやめてしまうだろう。

そこで、検索を高速にするために、「インデックス」というものを使う。
インデックスとは、本の索引にあたる。
本の中のどこかに書かれた言葉を探すのに、ほんの最初から一ページずつ見ていくのではなく、索引を使って探したほうが速い。
それと同じことをする、というわけである。

先ほどの顧客テーブルでは、各顧客のデータ項目、ログイン名、パスワード、氏名、生年月日、ポイントのうち、検索の対象になるものについて、それぞれインデックスを作るのである。
DB2
上の図ではIDとログイン名、氏名のインデックスを作った。
本当は生年月日もインデックスとして持っておけば、「今日が誕生日の人は?」という検索が高速になるのでいいのだが、説明のためなのでまあ省こう。 

インデックスは、各データへのポインターを持っている。
たとえば氏名のインデックスであれば、氏名と顧客テーブル上のレコードの位置を指すポインターの"対"だけを持っている。

インデックスは顧客テーブルとは別に、インデックステーブル、というテーブルで管理する。
IDのインデックステーブルは数字の小さいものから大きい方へ、ログイン名はアルファベット順、氏名はあいうえお順でそれぞれ並べられている。こうすることでインデックステーブル上での位置を見つけるのが高速になる。

ネット上でものを売るシステムであれば、顧客テーブルとは別に、「商品テーブル」というテーブルも必要になるだろう。
商品テーブルはIDと商品名、価格、商品の概要を持つ。
DB3
この商品テーブルのデータの内、商品名と価格がインデックステーブルを持つことになるだろう。
これにより、商品名から目的の商品を高速に検索したり、「◯◯円〜△△円の範囲内の商品」といった検索を高速にすることができるようになる。

顧客がネット上で何かをポチッたとき、そのお買い上げ情報は「購入履歴テーブル」に蓄積される。
購入履歴テーブルに必要な情報は、購入者、購入日、商品、個数といったところか。
DB4
上図で、購入者と商品が、それぞれ氏名や商品名ではなく、顧客IDと商品IDになっていることに注目しよう。
もしここに氏名や商品名を書くことになると、 書き間違いが起こった時にそれが検索から外れてしまう、という問題が発生する。また、テーブルを見た時にうっとおしくて見づらくなることも問題だ。
ここで、顧客は顧客IDで顧客テーブル上での位置を、商品は商品IDで商品テーブル上での位置を指している、ということはこれらもポインターである。
DB5
この購入履歴テーブルは、購入者、購入日、商品のインデックスを持つことになる。
これにより、たとえば「◯◯さんが買ったもの」という検索や、「今週の売上」という検索が高速にできるようになる。

このように複数のテーブルの関係を扱うことができるデータベースを「リレーショナル・データベース(RDBMS)」と呼び、一般に「データベース」と言う場合はこのRDBMSを指すことが多い。

最近は、RDBMSよりもシンプルでかつオブジェクト指向でシステムを設計する場合により扱いやすいデータベースというものが流行っている。

一般的には「このプログラムではデータベースは何を使っているか?」 といったように、「データベース」という言葉は「データベース製品」を指すことが多い。
だが、本来の「データベース」とは、「データを蓄積して、その蓄積されたデータを検索し、取り出すもの」という仕組みを持ったものをプログラム内で独自に作ったものも含めたものである。そしてその時の場合でも、基本的な仕組みはだいたいここで説明したようなものである。


OLランキングで1位になりたい!賛同していただける方は下記をクリック!
にほんブログ村 OL日記ブログ ドジOLへ

コメントする

名前
 
  絵文字
 
 
略すところが違うだろ思考作品=至高作品