コンテンツにスキップ

3. データベース

3.1. DBMSと関係データベース

DBMSはデータベース管理システムのことであり、データベースの定義や操作制御などの機能を持つミドルウェアである。

データベースには関係型、階層型、ネットワーク型の3種類があり、関係型が現在の主流である。

3.1.1. 関係型データベース

関係データベースは表の形でデータを管理するデータベースであり、表で構成される。 また関係データベースはリレーショナルデータベース(RDB) と呼ばれる。

種類 説明
表(テーブル) 複数のデータを収容する場所
行(レコード) 1件分のデータを表す
列(フィールド) データを構成する項目を表す

3.1.2. データの正規化

関係データベースにおいて蓄積データの重複や矛盾が発生しないように最適化するのが一般的です。 同じ内容を表のあちらこちらに書かないように表を分割するなどすることは正規化と呼ばれる。

データ

3.1.3. 関係演算とビュー表

関係演算は表の中から特定の行や列を取り出したり、表と表をくっつけ新しい表を作り出したりする演算のことである。 選択、射影、結合などがある。

  • 選択 ・・・ 行を取り出す演算
  • 射影 ・・・ 列を取り出す演算
  • 結合 ・・・ 表同士を結合する演算

このような演算を行い仮想的に作る一時的な表はビュー表と呼ばれる。

3.1.4. スキーマ

スキーマは「概念、要旨」という意味を持ち、データベース構造や使用の定義をするものである。

標準使用されているスキーマにはANSI/X3/SPARC規格は3層スキーマ構造をとり、外部スキーマ、概念スキーマ、内部スキーマという3層に定義を分けることでデータの独立性を高める。

スキーマ

3.2. 主キーと外部キー

データベースの表には行を識別できるようにキーとなる情報が含まれており、それは主キーと呼ばれます。また表同士を関連付けするときの主キーは外部キーと呼ばれる。 また複数列を組み合わせて主キーにしたものは複合キーと呼ばれる。

3.3. 正規化

非正規形(正規化を行っていない元の形の表)を何回か正規化を行い最適化行います。

正規化 説明
非正規形 正規化されていない繰り返し部分を持つ表
第1正規形 繰り返し部分を分離させ独立したレコードを持つ表
第2正規形 部分関数従属しているところを切り出した表
第3正規形 主キー以外の列に関数従属している列を切り出した表

3.3.1. 非正規形の表

非正規型の表は繰り返し部分を持ち、関係データベースで扱えない表の形である。

3.3.1.1. 第1正規形

非正規形の表から繰り返し部分を取り除いたものは第1正規形となる。

また表の形は2次元の表となる。

関数従属と部分関数従属
  • 関数従属 ・・・ 主キーが決まったとき列が一意に定まる関係
  • 部分関数従属 ・・・ 複合キー日舞の項目のみで列の値が一意に定まる関係

関数

3.3.1.2. 第2正規形

第1正規形の表から部分関数従属している列を分離した表が第2正規形の表である。

3.3.1.3. 第3正規形

第2正規形の表から主キー以外の列に関数従属している列を分離した表が第3正規形の表である。

3.3. SQLによるデータベース操作

SQL(Structured Query Language)はDBMSへ支持を伝えるために用いる言語である。 SQLには表の定義(CREATE)やレコードの挿入(INSERT)、削除(DELETE)、レコードの一部を更新(UPDATE)する命令がある。

これらの命令はスキーマ定義や表の作成を担当するデータ定義言語(DDL) とデータの抽出や挿入、更新、削除といった操作を担当するデータ操作言語(DML) に区別できる。

SELECT文

SELECT文の基本書式は以下の通りです。

SELECT 列名 FROM 表名 WHERE 条件
特定の列の抽出(射影)
SELECT 列名 FROM 表名
特定の行の抽出(選択)
SELECT * FROM 表名 WHERE 条件式

なお条件式には比較演算子や論理演算子を用いる。

表同士の結合(結合)
SELECT * FROM 表名1, 表名2 WHERE 表名1.ID = 表名2.ID

ORDER文

ORDER文は抽出結果を整列させておきたい場合に用います。

ORDER BY 列名 ASC(or DESC)

ASC:昇順、DESC:降順

例)商品表の価格順に商品表を並べる場合

SELECT * FROM 商品表 ORDER BY 単価

関数を使った集計

SQLにはデータを取り出す際に集計を行う様々な関数が用意されている。

関数 説明
MAX(列名) 列の最大値を求める
MIN(列名) 列の最小値を求める
AVG(列名) 列の平均値を求める
SUM(列名) 列の合計を求める
COUNT(*) 行数を求める
COUNT(列名) 列の値が入っている行の数を求める

例)扱う商品の数を取り出す場合 SELECT COUNT(*) FROM 表

GROUP文

グループ化は特定の列が一致する項目をまとめて1つにすることを指す。

グループ化には以下文を用いる。

GROUP BY 列名

グループの条件絞り込み

グループ化なおかつそこから条件を絞り込む場合はHAVINGを用います。

GROUP BY 列名 HAVING 絞り込み条件

3.4. トランザクション管理と排他制御

トランザクション管理と排他処理は複数人がデータベースにアクセスし同時変更などをした際にデータ内容に不整合が生じる問題からデータベースを守る処理です。

3.4.1. トランザクション

データベースにおいて、一連の処理をひとまとめにしたものはトランザクションと呼ばれます。

3.4.2. 排他制御

排他制御は処理中のデータをロックし、他の人が読み書きできないようにする機能である。 ロックする方法には共有ロックと専有ロックがある。

  • 共有ロック ・・・ 各ユーザはデータを読むことはできるが、書き込みができない状態
  • 専有ロック ・・・ 他ユーザはデータを読み書きすることができない

また、デットロックと呼ばれる現象がロック機能を使いすぎると起こる場合がある。

デットロック

3.4.3. ACID特性

DBMSではトランザクション処理に対して4つの特性(ACID特性)が必要とされる。

ACID

3.4.4. ストアドプロシージャ

DBMSにSQL文を1つのプログラムにまとめ保存しておくことはストアドプロシージャと呼ばれます。 一連の処理が実行される。 また、メリットは以下の通り。

  • ネットワークの負荷削減
  • 処理速度の向上

3.4.5. データベースの障害管理

データベースは定期的にバックアップを作ったり、更新前後の状態をジャーナルファイルに記録したりし障害の発生に備える。

バックアップ後の更新はジャーナルと呼ばれるログファイルに更新前の状態と更新後の状態を逐一記録しデータベースの更新履歴を管理するようにする。 障害が発生した際にはこれらのファイルを用いてロールバックロールフォワードなどの障害回復朱里を行い、元の状態に復旧する。

3.4.6. コミットとロールバック

データベースでは更新処理をトランザクション単位で管理する。

トランザクションは一連の処理が問題なく完了できたときに、最後にその更新を確定することでデータベースへ更新内容を反映させる。これはコミットと呼ばれる。

また、トランザクション処理中に障害が発生し更新に失敗した場合、データベース更新前の状態を更新前ジャーナルから取得し、データベースをトランザクション処理直前の状態に戻す。この処理はロールバックと呼ばれる。

3.4.7. 分散データベースと2相コミット

物理的に分かれている複数のデータベースを見かけ上1つのデータベースとして扱えるようにしたシステムは分散データベースシステムと呼ばれる。

これはトランザクション処理が各サイトにわたり行われるので、全体の同期をとりコミット、ロールバックを取らないと、データの整合性が取れなくなる恐れがある。 そのため全サイトに問い合わせを行い、その結果を見てコミット、ロールバックを行う。この処理は2相コミットと呼ばれる。

3.4.8. ロールフォワード

データベース自体が突然障害に見舞われた場合、バックアップ以降の更新ジャーナルから更新情報を取得し、データベースを障害発生直前の状態に復旧させる一連の処理がある。この処理はロールフォワードと呼ばれる。