ホーム » スタッフ » 斉藤徹 » 講義録 » データベース » データベースとガイダンス

2017年10月
« 9月   11月 »
1234567
891011121314
15161718192021
22232425262728
293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

データベースとガイダンス

今日が後期の選択科目「データベース」の第一回目ということで、シラバス説明&ガイダンスをしてからぁ〜のぉ〜、概要説明。

インターネットの情報量

インターネット上の情報量の話として、2010年度に281EB(エクサバイト)参考:kMGTPEZYの情報があるらしい。また 2013年度で、1.2 ZB(ゼタバイト)という情報があった。これらをムーアの法則(2年で2倍)の概算に照らし合わせても、それなりに近い。2017年であれば、約4年で、5 ZBにはなっているかな。

そして、これらの情報をGoogleなどで探す場合、すぐにそれなりに情報をみつけてくれる。これらは、どの様に実装されているのか?

Webシステムとデータベース

まず、指定したキーワードの情報を見つけてくれるものとして、検索システムがあるが、このデータベースはどのようにできているのか?

Web創成期の頃であれば、Yahooがディレクトリ型の検索システムを構築した。(ページ作者がキーワードとURLを登録する方式) しかし、ディレクトリ型では、自分が考えたキーワードではページが見つからないことが多い。

そこで、GoogleはWebロボット(クローラー)による検索システムを構築した。Webロボットは、定期的に登録されているURLをアクセスし、そのページ内の単語を分割しURLと共にデータベースに追加する。さらに、ページ内にURLが含まれていると、そのURLの先で、同様の処理を再帰的に繰り返す。

これにより、巨大なデータベースが構築されているが、これを少ない コンピュータで実現すると、処理速度が足りず、3秒ルール/5秒ルール (Web利用者は次のページ表示が3秒を越えると、次に閲覧してくれない)を満たす処理をするには負荷分散が重要となる。

一般的に、Webシステムを構築する場合には、 1段:Webサーバ、2段:動的ページ言語、3段:データベースとなる場合も 多い。この場合、OS=Linux,Web=Apache,DB=MySQL,言語=PHPの組合せで、 LAMP構成とする場合も多い。(Webシステムの3段スキーマ構成)

一方で、大量のデータを処理するDBでは、フロントエンドDB,スレーブDB,マスタDBの3段スキーマ構成となることも多い。(データベースの3段スキーマ構成)

データベースシステム

データベースには、ファイル内のデータを扱うためのライブラリの、BerkleyDBといった場合もあるが、複雑なデータの問い合わせを実現する場合には、リレーショナル・データベース(RDB)を用いる。RDBは、1970年にコッド博士によりよって発案され、複雑なデータはすべて表形式とその組み合わせで表現し、SQLというデータベース 問い合わせ言語でデータを扱う。また、SQLでの問い合わせはネットワーク越しに実行可能で、マスタ・スレーブ型の運用ができるようになっている。こういった RDBで有名なものとして、Oracle , MySQL , PostgreSQL などが有名である。 単一コンピュータ内でのデータベースには、SQLite などがある。

しかし、RDBでは複雑なデータの問い合わせはできるが、大量のデータ処理のシステムでは、フロントエンドDB,スレーブDB,マスタDB の同期が問題となる。この複雑さへの対応として、最近は NoSQL が注目されている。

データベースが無かったら

これらのデータベースが無かったら、どのようなプログラムを作る 必要があるのか?

情報構造論ではC言語でデータベースっぽいことをしていたが、 大量のデータを永続的に扱うのであれば、ファイルへのデータの読み書き 修正ができるプログラムが必要となる。

こういったデータをファイルで扱う場合には、1件のデータ長が途中で 変化すると、N番目のデータは何処?といった現象が発生し、先頭からシーケンシャルアクセスをすることになる。 このため、目的のデータの場所を一発で見つけることができる簡単なデータベースを自力で書くには、1件あたりのデータ量を 固定し、lseek() , fseek() , fwrite() , fread() などの関数でランダムアクセスのプログラムを書く必要がある。

また、データの読み書きが複数同時発生する場合には、排他処理も重要となる。例えば、銀行での預け金10万の時、3万入金と、2万引落としが 同時に発生したらどうなるか? 最悪なケースでは、 (1)入金処理で、残金10万を読み出し、 (2)引落し処理で、残金10万を読み出し、 (3)入金処理で10万に+3万で、13万円を書き込み、 (4)引落し処理で、残金10万-2万で、8万円を書き込み。 で、本来なら11万になるべき結果が、8万になるかもしれない。(参照 C言語のflock() 関数)

さらに、コンピュータといってもハードディスクの故障などは発生する。 障害が発生してもデータの一貫性を保つためには、バックアップや 障害対応が重要となる。

ランダムアクセスの処理、排他処理、バックアップ、障害対策…といったものを総合して扱えるようになったものがデータベースシステムである。