DBMSと関係データベース

# データベースの初め
さまざまなデータが存在する。その中にデータ同士が繋がっていることもある。
また更新時期も別々になる。
なのでややこしい。
そこで```データベース```を使う。データの基地とも言える。

## データベースの目的
データペースは、```アプリケーションのデータを保存蓄積するための一つの手段```。
複数の利用者が大量のデータを共同利用する用途で強みを発揮する。

### データベースは一元的に管理する
これはシステムやユーザの扱うデータを一元的に管理する。
一元的とは```何かが中心となって全体が統一される```こと。
データの読み書きはデータベースが管理する。

## データベースの種類
データベースの種類は
```関係型データベース```
```階層型データベース```
```ネットワーク型データベース```
中でも主流は関係型データベースやRDB（リレーショナルデータベース）と言われている。

## データベースと表の関係
データベースはデータを溜め込めることを目的としている。
表計算は表を作ることが目的としている。
なので
データベースがデータを与え、それを基に表計算ソフトが整形して表示する。

## インデックス
```インデックス（索引）```は、```データベースの性能を向上```させる方法の一つです。インデックスは「探すレコードを識別するデータの項目」「対象レコードの格納位置を示すポインタ」で構成されており、これを利用して```データの格納位置を特定し、その位置を直接アクセス```する事で、```表の検索速度を上げる```ことができます。
出典 https://atmarkit.itmedia.co.jp/ait/articles/1703/01/news199.html

## インデックスの設定
膨大な量のデータをデータベースに格納されている場合、データ検索には時間がかかる。そこで、アクセス頻度の高い列に対して、```検索の手がかりとなるインデックス```をあらかじめ設定しておくことで、```検索効率の向上を図る```方法が用いられている。

## インデックスの実現方法
木構造を利用した```B+木インデックス```、一意に特定する```ハッシュインデックス```がある。
後者は一致検索では```高速化を実現```できるが、```範囲検索や不一致検索は使えない```。

## DBMS
アプリケーションから簡単に扱えるようにしたのが```データベース管理システムというミドルウェア```。

### データベースの定義機能
```データベース作成```を行う機能。
データスキーマを決定し、```与えられた論理構造からの物理構造```を決める。
```データ定義言語(DDL)```を用いる。

### データベースの操作機能
データに指示を出し、```データベースへの操作を行う機能```。データベースへの操作（検索・抽出など）は、データ脳格納場所や、アクセス方式などを詳細な情報を知らなくても可能。
操作は、```データ操作言語（DML）```を用いる。

### データベースの管理（制御）機能
データベースは複数で使う。矛盾が生じないようにデータを保つことが必要だ。そのために保全機能（排他制御、障害回復など）、データ機密保護機能（アクセス制御、データの暗号化など）といった機能を持つ。

#### アクセス権
ユーザIDやパスワードを使ってユーザ認証を行う。
ユーザの属するグループごとにアクセス権限を設定し、```権限外のデータアクセスを防ぐ```。

# 気づき
データベースはデータの基地とも言えるのか。今までデータベースとしか捉えていなかった。
かっこいい。
一元的の説明をもっと知りたい。
## 一元的とは？
* さまざまな事物が根源を一つにしているとみえるさま。
  出典　https://dictionary.goo.ne.jp/word/%E4%B8%80%E5%85%83%E7%9A%84/#:~:text=%E3%81%84%E3%81%A1%E3%81%92%E3%82%93%E2%80%90%E3%81%A6%E3%81%8D%E3%80%90%E4%B8%80%E5%85%83%E7%9A%84%E3%80%91,%E3%81%AA%E8%80%83%E3%81%88%E6%96%B9%E3%80%8D%E2%87%94%E5%A4%9A%E5%85%83%E7%9A%84%E3%80%82
* すべての事物の種々の現象の本質をただ一つのものと見るさま。
  出典 https://kotobank.jp/word/%E4%B8%80%E5%85%83%E7%9A%84-433290

さまざまなものを一つのものとして捉えるのか。

データベースと表計算ソフトの関係性が取り出しそれを整形している関係であることがわかった。

# 関係データベースは表、行、列でできている。
関係データベースは表の形でデータを管理している。
データ一件が一つの表として記録されているイメージ。
```この行が複数集まることで表の形```が出来上がる。

## 表、行、列の別の呼び方
表（```テーブル```)複数のデータを収容する場所
行(```レコード、組、タプル```)一件分のデータを表す。
列(```フィールド、属性```）データを構成する各項目を表す。

## 定義域（doamain: ドメイン）
各列（属性）が取りうる値（データ型や各桁及びその範囲など）の集合

## 関係データベースの由来
データの内容次第で複数の行を関係づけして扱うことができるから。
この関係を```リレーションシップ```という。

# 気づき
## タプルやレコードや組の違いは何か？
データベースの関係型、OSの機能、データベース管理システム、表計算ソフトで呼び方が違うようだ。
出典　https://ascii.jp/elem/000/000/486/486127/img.html
また色々あるかもしれない。

# 表を分ける「正規化」という考え方
関係データベースでは蓄積されているデータに矛盾や重複しないように表を最適化するのがお約束だ。
新しい情報と古い情報が混在することを予測できる場合は表を分割してする。
これを```正規化```という。

p２９２の図ので部署名が変わる場合この表のレコードを全部書き直さなければならなくなる。
そうなると修正漏れが生じてくる。
なので分割(正規化)するとこの手間と```修正漏れ```がなくなる。

正規化することは矛盾や重複を未然に防ぐことを意味する。

# 関係演算とビュー表
表がどんどん分割されて、細切れになった表が一つあっても使い物にならないようになる
どのデータを溜め込んで効率的になるか？
溜め込んだデータは活用できなきゃ意味がない。
なので```関係演算```が出てくる。
## 関係演算
関係演算とは特定の行や列を取り出したり、表と表をくっつけて新しい表を作り出したりする演算のこと。
演算は```選択```、```射影```、```結合``の３つだ。`
### 選択
行を取り出す演算。
特定の条件に合致する行だけを取り出す。

### 射影
列を取り出す演算。
特定の条件に合致する列だけを取り出す。

### 結合
表と表をくっつける演算。
共通の列を介して２つの表をつなぎ合わせる。

## ビュー表
関係演算を行い、```仮想的に作る一時的な表```のことを言う。

# 集合演算
### 和
複数の表を併合する操作。
```併合後の表に行の重複はない```。

### 差
表a-表bの演算。
```表aにあって表bにない```行の表が作成される。

### 積
```２つの表に両方存在```する行からなる表を作成する。

### 直積
２つの表を掛け合わせる操作。
```行の数は、それぞれの表の行数をかけた数```になる。

# データ構築
データベースの構築には、```現実世界のデータをどのように構造化して、コンピュータ内部で表現するかを考える必要```がある。これをモデル化という。
```データベースの構造を表す仕様```をスキーマという。

# スキーマ
データベースの構造や使用を定義するもの。
標準的に使用されているANSI/X3/SPARC規格では```三層スキーマ構造```をとっています。
これは```外部スキーマ```、```概念スキーマ```、```内部スキーマ```と３つの層に分けることでデータの独立性を高める。

### 外部スキーマ
利用者の必要とするデータの見方を表現する
```ユーザやプログラムに対して必要なデータ```だけを提供する。
プログラムに加えた変更は、このスキーマまでしか影響しません。

### 概念スキーマ
データの論理的関係を表現
```プログラムからもハードウェアからも切り離されている```のでどこにも```依存せず、データの独立性```が保たれています。

### 内部スキーマ
データの物理的関係を表現
```ハードウェア的な変更はこのスキーマで影響を吸収```します。
物理的に記憶させてるハードウェアが変わっても、プログラムの修正は必要ない。

# 気づき
三層スキーマの説明がなんか腑に落ちない。
もっと説明を聞こう。

## 三層スキーマとは？
* 外部スキーマは```システム利用者であるユーザー、もしくはアプリケーションから見たデータベースのデータ構造やデータの関係```を定義するスキーマであり、言ってみれば「```ユーザーから見たデータベース```」です。データベースのビューに相当します。(ビュー以外に、実際の画面に出力するデータのことも含みます。)

    概念スキーマは「```開発者から見たデータベース```」です。概念スキーマの設計を「```論理設計```」と呼び、データベース設計の中で重要な位置を占めます。

    内部スキーマは「DBMSから見たデータベース」です。コンピュータ上で動く以上、```データベースのデータもその実体は「ファイル」```となります。```そのファイルをディスク上にどのように格納するかを定義```します。内部スキーマの設計を```「物理設計」```と呼びます。

    このようにわざわざスキーマを3つの階層に分けるのは、例え、```ひとつのスキーマに変更があったとしても他の2つのスキーマは影響しない```ようにするためです。(そのように各スキーマが独立していることをデータ独立性と言います。)

    実際の開発現場では仕様変更対応の連続です。その際、```ひとつの変更がデータベース設計全体に影響を受けてしまっていては、開発工数がいくらあっても足りません```。

    3層スキーマの思想に従って設計していれば、```変更の範囲を局所化```することができるでしょう。3層スキーマは、```変更対応を可能な限り少ない労力でできるようにと、先人たちが編み出した知恵```というわけです。
出典 http://db-study.com/archives/36

* 外部スキーマ
ユーザーの視点からデータベースの構造を定義したスキーマのことです。アプリケーションの開発者側からみた構造や、データの指定方法などを示したもので、具体的には```SQLによるビューがなどが外部スキーマの代表例```です。データベースの利用者側から、当該データベースがどうみえるかを定義したものといえるでしょう。

    ※SQL(Structured Query Language)：リレーショナルデータベースを操作するための言語で、国際標準規格として決められている。ユーザーはSQLを使ってデータベース管理システムに命令を出し、必要なデータを検索・利用することができる。

    概念スキーマ
開発者側からみたデータベースで、```保存するデータの要素やデータ同士の関係性を定義```します。リレーショナルデータベースでは、データをテーブルに格納しますが、このテーブルを作成するための設計図と捉えることができます。

    内部スキーマ
概念スキーマによって定義したデータを、```どのようにデータベースに格納するかを決めるもの```です。```データベースの物理設計の段階で決められます。```

    ※データベースの物理設計：データの格納方法や管理方法を決めることで、```システムの要件に合致した物理的な設計を行う段階```を指す。その前段階として、```データベースの構造が決められており、これを論理設計```と呼ぶ。
    出典 https://meetsmore.com/product-services/databases/media/99441
SQLを使って表を表示していたがあれが外部スキーマなのか。
概念スキーマは保存するデータの要素やデータ同士の関係性を定義されているのか。
内部スキーマはどのようにデータベースに格納するかを決めるもの、データベースの物理設計の段階で決められる。

とりあえずこのスキーマの役割がわかった気がする。

# 問題を解いた時の気づき
## 埋め込みSQLとは？
アプリケーション・プログラムに記述されているSQL文のこと
出典 https://docs.oracle.com/cd/E57425_01/121/LNPCC/GUID-D244197E-032F-4F23-81FF-F6985A80739C.htm#:~:text=%E5%9F%8B%E8%BE%BC%E3%81%BFSQL%E3%81%A8%E3%81%AF%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3,%E5%9F%8B%E3%82%81%E8%BE%BC%E3%82%80%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

プログラムの中にSQL文が含まれていることを指すのかな。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

https://gihyo.jp/book/2020/978-4-297-11781-8