データベースの基本概念

データ相互の関連づけや整理に関しての、計算機を使った技術のこと。

一般的なデータベース

共有を意図して計算機内に蓄積された情報の集まりのこと。

データベース管理システム

情報の整理や管理をするソフトウェアのこと。 データは共有され、かつ統合化されている。

一般的なデータベース

共有を意図して計算機内に蓄積された情報の集まりのこと。

データの一貫性 (Consistency): データが複数ある場合、データを 1 元的に管理し、 それぞれのソフトウェアがアクセスするように作ること。

論理表現: プログラムのデータ形式を統一するインタフェース

データのプログラムからの独立 (プログラムのデータからの独立): ファイルシステムとは異なり、データの変更はプログラムの変更を伴わない。

共有データの同時アクセスへの対処が必要。

ビュー (View): 各プログラムにおいて、必要なデータのみ取り出すこと

間違いを未然に防いだり、機密保持にも役立つ。

データベースシステムの構成

データベースの構成は次の通り。

DBMS とは

データの論理表現をユーザやソフトウェアに公開すること。

論理表現

データベースシステムが外部に対して見せている仕様のこと。

ユーザやソフトウェアは、 論理表現にそってデータ操作を行う。

クエリ (query): 検索言語

操作要求はデータの論理的な関係のみを示し、 ハードウェアによらない。

DBMS

データベースのしくみ

データベースのモデル

データベースは、情報システムを使って知識の検索をすることである。 この講義では文字だけの情報のみに限定するが、 実際は音声、画像の検索も視野に入れたデータベースの研究がなされ、 検索エンジンのベータ版などで最先端の試みを見ることができる。

データベースの論理表現

データの論理表現は、 データベースシステムの外部に見せる仕様のことである。

マンマシンインタフェースのよさと、 業務運用において必要なデータを収集検索できる効率のよさで、 データベースの論理表現のよさが決まってくる。

データ収集において、情報を限定して必要な情報のみ取り出すことをモデル化と 呼ぶ。モデル化は論理表現法により 3 つに分けることができる。

  1. 階層モデル
  2. ネットワークモデル
  3. 関係モデル

3 層モデルアーキテクチャ

モデルに基づいて抽象化を行う際の記述と、データとの関係についてまとめ る必要がある。

スキーマ
データの構成要因
インスタンス
データの記述

例えば、データが "氏名", "曜日", "時限", "時期", "科目名", "教室" で あることがスキーマである。インスタンスはそれに対して、 "西村まどか", "月", "4", "前期", "公益自由研究", "102" である。

スキーマをどのように記述するか、には 3 種類の階層がある。

外部レベル (View) 外部スキーマ 抽象化するデー タの枠組みを規定
概念レベル  概念スキーマデータの論理表 現であるデータモデルに基づいたデータの抽象化
内部レベル  内部スキーマOS やファイル 管理システムとのインタフェース

階層モデル

データを木構造にしたデータモデル。会社の組織図など。 子のノードが多数の親ノードに属す場合に、ポインタを用いて、 物理親と論理親を持つように構成できるが、 親が多くなる模型には適さない。

ネットワークモデル

矩形をレコード、楕円形をセットとする。 子レコードは多数の親レコードを持つことができる。 データベースが集中管理されている場合に使われてきた。

関係モデル

データが複雑にならぬよう、2 次元表で全てのデータを扱うものである。

講義科目一覧
名前曜日時限時期講義名教室
西村まどか4前期公益自由研究102
西村まどか5通年専門演習I102
西村まどか6通年専門演習II102
西村まどか1前期基礎プログラミングI101
西村まどか2前期基礎プログラミングI101
::::::
履修科目一覧
学籍番号科目
ta05001公益自由概論
ta05001公益自由研究
ta05001情報リテラシーI
ta05001情報リテラシーII
ta05001基礎プログラミングI
ta05001基礎プログラミングII
::

2 つのモデルと大きく異なるのは関係代数に基づくものであるこ と。データ操作言語は、個別に操作を行わずに、集合を操作するものから成り立 つ。

関係表
2 次元表
関係名
2 次元表の名称
属性
関係表の要素
属性値
属性のインスタンス
レコード

Ruby/DBI

Ruby でデータベースを使った Web インタフェースを作る。 CGI を作成したページで、前回の課題では入力画面を作成した。

( 入力を促す Web ページ / ソース / 結果表示ページ )

データベース登録のために

データベースの登録の準備をしよう。 データベースと同じ条件にするために、 データベースの属性分だけ増やして完成させよう。

また、データベースの登録準備として、Ruby 言語を通して、 データベースにアクセスする方法を学ぼう。 rubydb.rb

まずは SELECT コマンドで試そう。 つぎにINSERT INTO コマンドに変更し、 実行して、エラーが出なかったら、ほんとうにデータベースに登録されたか どうか調べておこう。


ta05001=> select * from practice;
    name    | wday | hr | sem  |         sub          | cls 
------------+------+----+------+----------------------+-----
 西村まどか | 月   |  4 | 前期 | 公益自由研究          | 102
 西村まどか | 月   |  5 | 通年 | 専門演習I            | 102
 西村まどか | 月   |  6 | 前期 | 専門演習II           | 102
 西村まどか | 火   |  1 | 前期 | 基礎プログラミングIB   | 101

まずはこれをプログラムで実行するよう、準備する。

require 'pg'
                # Ruby-DBI を使用する
pg = PGconn.new(:dbname=>'ta05001', :user=>'postgres',:port=>5432)
                # データベースにアクセス
sql =  'select * from position;'
               
result = pg.exec(sql)
                # SQL を実行
result.each{|i| p i}
                # 実行結果の表示
result.clear    # 実行結果をクリア
pg.close        # データベース接続の解除

データベースへの登録に必要なモジュール

Ruby は gem を使用してモジュールをインストールする方法が、 一般的となってきた。

gem install pg -- --with=dbi,dbd_pg --with-pg-config=/usr/local/pgsql/bin

でオプションをつけながら pgsql の在処を示しつつインストール。

Ruby と似た interperter 型言語の Python は モジュールインストールには easy_install を使用する。

HTML ファイルを簡単に出力する方法

CGI の結果を出力するときに、プログラムの場合は、 以下のような方法が使える。


#!/usr/bin/env ruby -Ke

print <<__EOF__
Content-type: text/plain;charset=EUC-jp
<html>
<head>
<title>日本語のページを Ruby で出力してみる</title>
</head>
<body>
<p>日本語の文章を EUC で出力</p>
</body>
</html>
__EOF__

-Ks の場合は Shift_JIS、-Ku の場合は UTF-8 に charset を変更する。

データを対話的に入力する準備

pg.exec (SQL 実行文) の、データの部分を 対話的に入力 する準備を行う。SQL 実行文を Ruby 変数 sql に代入するとき、 '\' に置き換える。 また #{Ruby 変数} を使って、 CGI 変数を代入して得られたRuby 変数を Ruby の実行文で出力していく。

結果が更新されたか調べておこう。


ta05001=> select * from practice;
    name    | wday | hr | sem  |         sub          | cls 
------------+------+----+------+----------------------+-----
 西村まどか | 月   |  4 | 前期 | 公益自由研究         | 102
 西村まどか | 月   |  5 | 通年 | 専門演習I            | 102
 西村まどか | 月   |  6 | 前期 | 専門演習II           | 102
 西村まどか | 火   |  1 | 前期 | 基礎プログラミングIB | 101
 西村まどか | 火   |  2 | 前期 | 基礎プログラミングIC | 101
(5 rows)

新しい仕様は 開発元本家 から help の問題で似たものを探して追うしかない。

CGI スクリプトとの連動

それでは両者を統合して、CGI スクリプトから受けた CGI 変数を Ruby 変数に代入し、データベースに登録しよう。 プログラム支援ページ をみてみよう。

CGI で登録されたかどうか確認しておこう。


ta05001=> select * from practice;
    name    | wday | hr | sem  |         sub          | cls 
------------+------+----+------+----------------------+-----
 西村まどか | 月   |  4 | 前期 | 公益自由研究         | 102
 西村まどか | 月   |  5 | 通年 | 専門演習I            | 102
 西村まどか | 月   |  6 | 前期 | 専門演習II           | 102
 西村まどか | 火   |  1 | 前期 | 基礎プログラミングIB | 101
 西村まどか | 火   |  2 | 前期 | 基礎プログラミングIC | 101
 西村まどか | 水   |  1 | 前期 | 情報交換概論         | 102
(6 rows)

XML 形式

PostgresQL は 8.3 以降 XML 形式をサポートするようになった。 読みやすい 文献 もあるので、必要に応じて調べるとよいだろう。

HTML5 では XML との統合を摸索している。

データの取り出し

あるデータの情報だけを取り出すプログラム プログラム を作ろう。

登録が何度もあるところなどをチェックすることができる。 もう少し SQL を勉強すると、WHERE のところで、不等号などで、 しぼりこむことができる。工夫してみよう。

検索結果 = データベース.query(SQL 言語)

検索結果.each do |内部変数|
  表示方法
end

tuple は 配列でしまれており、 属性は key となるような Hash に格納されている。

データの取りだし

限界値を超えたデータを確認できるようにしよう。