DBサーバとは（DBMSとSQLについて）

# 初めに
データベース（DB：DataBase）サーバに関して、主に利用されているRDBを中心として情報をまとめた。

 * [データモデル](#データモデル)
 * [DBMS：データベース管理システム](#dbmsデータベース管理システム)
 * [RDBMS：関係データベース管理システム](#rdbms関係データベース管理システム)
 * [CRUD：システムに必要な4つの主要機能](#crud) 
 * [SQL：データベース言語](#sql)

# DBサーバとは
DBサーバ（DataBase Server）とは、データ管理機能を有するサービスを提供するサーバ。
データ保管のためのストレージを有し、[データの管理(DBMS)](#dbmsデータベース管理システム)と、[データの操作（CRUD）](#crud)を行うものとして本記事ではまとめる。

# DBMS：データベース管理システム
データベース管理システム（DBMS: DataBase Management System）とは、DB構築のための運用・管理システムのこと。
基本的に、DBサーバは管理システムを有しているので、DBMSを有していると言える。

DBMS内では、データを値や表のような形式で[永続化](#永続化)して管理し、また、データ間の関係も[永続化](#永続化)して管理している。
このように、データを抽象的な形で表現する方式のことを[データモデル](#データモデル)という。
[データモデル](#データモデル)は主に、関係モデル、階層モデル、ネットワークモデル、オブジェクト指向モデルがある。
近年では、[関係モデル](#関係モデル)に基づいて設計する関係データベース（RDB: Relational DB）が多く利用されている。
RDBを管理するDBMSを[関係データベース管理システム (RDBMS)](#rdbms関係データベース管理システム) という。

 * 関係データベース（Relational DB） ← 本記事で取り上げる
 * 階層型データベース（Hierarchical DB）
 * ネットワーク型データベース（Network DB）
 * オブジェクトデータベース （Object DB） 

## 永続化
永続化とは、データ構造に対して永続性（プログラムの実行と実行の間でも情報を保持する性質）を与えること。
実態としては、データを不揮発性の記憶装置に記憶すること。
また、電源が切れてもデータを保持する装置を永続性記憶装置（例: HDD）という。

# データモデル
データモデルとは、アプリケーション設計のための計画として使うソフトウェア工学の抽象モデルの1つ。
データ管理システムでの記憶装置のための構造化されたデータを記述する。
データの定義とフォーマットを提供することによって、情報システムの開発を支援する。

 * [関係モデル](#関係モデル)
 * [階層モデル](#階層モデル)
 * [ネットワークモデル](#ネットワークモデル)
 * [オブジェクト指向モデル](#オブジェクト指向モデル)

## 関係モデル
関係モデルとは、データを「関係（relational）」と呼ぶ概念でモデル化し、表に似た構造概念で管理するモデル。
クエリ（問い掛け）により、データを検索したり、変更する。
以下に関連するキーワードとその概要をまとめた。

|キーワード|概要|
|---|---|
|関係スキーマ|属性の組み合わせ。表で表現すると表そのもの。テーブルとも呼ばれる。|
|属性（アトリビュート）|関係スキーマで管理するデータの種類。表で表現すると列。|
|組（タプル）|関係スキーマに格納されたデータ。表で表現すると行。インスタンス、レコードとも呼ばれる。|
|定義域（ドメイン）|ある属性が値としてとりうる可能性のある値の集合。|
|候補キー（主キー）|タプルを一意に識別するための属性。識別子（ID）やプライマリーキーとも呼ばれる。|
|リレーションシップ|テーブル同士の関連性。関係、リレーションとも呼ばれる。|

関係モデルによって管理された情報は、SQLなどに代表されるデータベース言語（問い合わせ言語）を用いて、
その関係に対して代数演算や論理演算（制限・射影・結合・和・差・交わりなど）を行うことで任意の情報を取り出せる。

データベース設計（論理設計・スキーマ）を行う場合、取り扱う情報の整合性を備え、論理的な構造を構成する必要がある。
情報の整合性を設計する際は、制約の宣言などを行う必要がある。論理的な構造を決定する際は、関係の正規化を行う必要がある。
設計に関する情報の詳細は煩雑なので本記事では割愛する。

## 階層モデル
階層モデルは、階層構造（木構造）を構成し、データを管理するモデル。
データの関係は、親データと子データという関係のみ存在し、「1対多」の関係となっている。

## ネットワークモデル
ネットワークモデルは、各データが任意の個数の親データと子データを有するモデル。
階層型モデルに対して、親データと子データが「多対多」の関係となることが許容される。

## オブジェクト指向モデル
オブジェクト指向モデルは、オブジェクト指向プログラミングで使うオブジェクトの形式で表現されるデータを格納するモデル。
データとその処理手続きを一体化したオブジェクト指向のデータ構造を持つ。

# RDBMS：関係データベース管理システム
RDBMS（Relational DBMS）とは、[関係モデル](#関係モデル)に基づいて設計するRDBを管理するDBMS。
関係データベース（RDB）の管理システム（DBMS）と同義。

## データベース言語
データベース言語とは、DBMSに対してさまざまな指示を伝えるための言語。
データベース言語を用いて利用者は、データベースにアクセスし、必要な操作を実施する。
概念的には、[CRUD](#crud)と略される機能を備え、データ定義言語 (DDL)、データ操作言語 (DML)、データ制御言語 (DCL) の構成要素からなる。
RDBMSでは、関係モデルに基づいたデータベース言語を備え、主に[SQL](#sql)が用いられている。

# CRUD
CRUDとは、システムに必要な4つの主要機能であるイニシャル（Create, Read, Update, Delete）を並べた用語。
曖昧に主要機能の略語は複数あるが、特にRDBMSではCRUDが用いられる。
各文字は標準の[SQL](#SQL)では次のようにマッピング可能である。

|名前|データ操作|SQL|
|---|---|---|
|Create|	生成|	INSERT|
|Read|	読み取り|	SELECT|
|Update|	更新|	UPDATE|
|Delete|	削除|	DELETE|

## SQL：Structured Query Language
SQLとは、RDBMS においては、データの操作や定義を行うためのデータベース言語であり、ドメイン固有言語である。
※プログラミング言語と併用されるが、チューリング完全を満たさないため厳密にはプログラミング言語ではない。
文法の種別は、以下の3つに大別される。

 * [データ定義言語 (DDL: data definition language)](ddlデータ定義言語)
 * [データ操作言語 (DML: data manipulation language)](dmlデータ操作言語)
 * [データ制御言語 (DCL: data control language)](dclデータ制御言語)

### DDL：データ定義言語
データ定義言語は、ユーザがコンピュータのデータを定義するもの。 
SQLのデータ定義言語の文は関係データベースの構造を定義する。
例は次のとおり。

|命令文|内容|
|---|---|
|CREATE| データベースオブジェクト（表、インデックス、制約など）の定義
|DROP |データベースオブジェクトの削除
|ALTER|データベースオブジェクトの定義変更

### DML：データ操作言語
データ操作言語は、ユーザがコンピュータのデータベースに対してデータの検索・新規登録・削除・更新を行うためのもの。
RDBに対して検索や更新などのデータ操作を行うために使われる。 
文の最初の単語によって示される機能をもち、ほとんどの場合は動詞を用いている。 
例は次のとおり。

|命令文|内容|
|---|---|
|INSERT INTO |行データもしくは表データの挿入
|UPDATE 〜 SET| 表を更新
|DELETE FROM| 表から特定行の削除
|SELECT 〜 FROM 〜 WHERE| 表データの検索、結果集合の取り出し

### DCL：データ制御言語
データ制御言語は、コンピュータのデータベースにおいてデータに対するアクセス制御を行うためのもの。
例は次のとおり。

|命令文|内容|
|---|---|
|GRANT |特定のデータベース利用者に特定の作業を行う権限を与える
|REVOKE |特定のデータベース利用者からすでに与えた権限を剥奪する
|SET TRANSACTION| トランザクションモードの設定
|BEGIN |トランザクションの開始
|COMMIT| トランザクションの確定
|ROLLBACK |トランザクションの取り消し
|SAVEPOINT| 任意にロールバック地点を設定する
|LOCK| 表などの資源を占有する

## SQLが運用されているDBMS

文化的背景を含めてDBMSは複数の種類が公開（販売）されている。
主なRDBMSでは基本的にSQLが運用されている。

|DBMS|SWの種類|対応|
|---|---|---|
|Oracle Database|プロプライエタリ|UNIX, Linux, Windows|
|MySQL|オープンソース|UNIX, Linux, Windows|
|Microsoft SQL Server|プロプライエタリ|Windows|
|SQLite|オープンソース|※|
|PostgreSQL|オープンソース|UNIX, Linux, Windows|
|Ingres|オープンソース|UNIX, Linux, Windows, MacOS|
|Sybase Adaptive Server Enterprise|プロプライエタリ|UNIX, Linux, Windows|
|Firebird|オープンソース|Linux, Windows, MacOS, Solaris, HP-UX|
|InterBase|プロプライエタリ|Linux, Windows, Solaris, MacOS|
|IBM DB2|プロプライエタリ|AS/400, z/OS, UNIX, Linux, Windows|
|IBM Informix Dynamic Server|プロプライエタリ|UNIX, Linux, Windows|

※C言語で実装されており再コンパイルであらゆる環境に対応

# 最後に
DBサーバの概要と、基本であるDBMSとCURDの概略をまとめた。
大量のデータを取り扱うDBでは最適な運用・管理のために多数の形態があり、
実際に開発（データベース設計）する際には各要素・特徴を考察し、個別の理解を深めることがかなり必要となる。

## 自身の関連記事

https://qiita.com/flcn-x/items/9b8c3e5657124b68139c

https://qiita.com/flcn-x/items/3b15fcae62df2e6b6667

# 参考・引用
[基礎から始めるデータベース入門セミナー](https://www.oracle.com/jp/technical-resources/article/introductory-database-seminar.html)