1. データベース基礎知識
1.1. データベース概論
1.1.1. データベースとは
データベースはある特定の条件に当てはまる「データ」を複数集めて、後で使いやすい形に整理した情報のかたまりのことを表のようなものを指す。 特にコンピュータ上で管理するデータをデータベースと呼ぶことが多いが、紙の上で管理する「電話帳」や「住所録」なども、立派なデータベースである。
また、コンピュータ上でデータベースを管理するシステム(DBMS:Database Management System)のことや、そのシステム上で扱うデータ群のことを、単に「データベース」と呼ぶ場合もある。 データベースを使ってデータを管理するメリットには、次のようなものが挙げられる。
- 複数のデータをまとめて管理できる
- 目的のデータを簡単に探すことができる
- 簡単に編集して使うことができる
1.1.2. DBMS(Data Base Management System)
DBMSはDBを管理するためのシステム。
RDBMS
RDBMS(関係データベース管理システム)は様々な会社が提供しており、有料のものには以下のようなものがある。
- Oracle DB
- SQL Server
RDB
有名どころのRDB。
- MySQL
- PostgreSQL
- SQLite
1.1.3. RDB(Relational Data Base)
RDB(リレーショナルデータベース)は表の形でデータを管理するデータベース。 以下の要素で構成される。
種類 | 説明 |
---|---|
表(テーブル) | 複数のデータを収容する場所 |
行(レコード) | 1件分のデータを表す |
列(フィールド) | データを構成する項目を表す |
RDBの例
1.1.4. SQL(Structured Query Language)
SQLとはデータベースを操作するための言語。 DBMS上でデータの追加や削除、並べ替えなどを行うようコンピュータに命令することができる。
基本的に1行ずつ入力して確定し、直ちに実行される。複数のSQLを組み合わせて大きな一つの塊のSQLとして実行することもできるが、通常のプログラミング言語のように一連の操作をまとめてセットすることのできる「ストアドプロシージャ」という機能のあるDBMSもある。
ストアドプロシージャ
ストアドプロシージャはDBMSにSQL文を1つのプログラムにまとめ保存しておくことを指す。 一連の処理が実行される。
また、メリットは以下の通り。
- ネットワークの負荷削減
- 処理速度の向上
1.1.5. NoSQL
NoSQLはNot only SQLの略で、SQLに限定されることなく非定型な構造を持つデータを柔軟に管理することができるもの。 NoSQLはデータモデルによって、「キー・バリュー型」「カラムストア型」「グラフ型」「ドキュメント型」の4つに大きく分けられる。
NoSQLのメリット
- 非定型データの格納に対応可能な、柔軟かつ動的なデータモデルを利用できる
- データスキーマ/戦略の大幅な見直し、あるいはパフォーマンスの低下をともなわずに、データベースのスケーリングが可能
- ビッグデータ運用にも耐えうる大容量データ処理を実現できる
NoSQLの有名どころ
- redis
- MongoDB
1.1.6. ORM
ORM(Object-Relational Mapping)ことオブジェクト関係マッピングはオブジェクトと関係(RDB)とのマッピングを行うもの。
ORMを使うとSQLを直接書くことなく、オブジェクトのメソッドでDB操作ができると言う特徴がある。
1.2. データベース基礎
1.2.1. カラムとデータ型
テーブルをつくる時、どんなデータを入れるか構造を指定する。カラム型には以下のようなものがある。
ここではMySQLの場合の例を記載する。
数値型
UNSIGNED を指定すると正の数しか格納できなくなる。(UNSIGNEDでデータ範囲:0~2n)
名称 | 型 | 概要 |
---|---|---|
TINYINT | 整数型 | -128 ~ 127 |
SMALLINT | 整数型 | -32768 〜 32767 |
MEDIUMINT | 整数型 | -8388608 〜 8388607 |
INT、INTEGER | 整数型 | -2147483648 〜 2147483647 |
BIGINT | 真数型 | -9223372036854775808 〜 9223372036854775807 |
BOOL、BOOLEAN | Boolean型 | TINYINT(1) で指定した場合と同じ。true と false の2択を保存したいときに使うことが多い。 |
BIT | BIT型 | 111 や 10000000 といったビットフィールド値を格納するのに使う。ビット値を指定するには、b'111' や b'10000000' のように指定する。 |
DECIMAL、DEC、NUMERIC | 小数点型 | 誤差のない正確な小数を格納できる。 |
FLOAT | 小数点型 | おおよそ小数第7位まで正確な小数を格納できる。 |
DOUBLE | 小数点型 | おおよそ小数第15位まで正確な小数を格納できる。 |
日付型・時間型
型 | 用途 | フォーマット |
---|---|---|
DATE | 日付 | '年-月-日'(例: '2020-01-01') |
DATETIME | 日付と時間 | '年-月-日 時:分:秒'(例: '2020-01-01 12:15:03') |
TIMESTAMP | タイムスタンプ | '年-月-日 時:分:秒'(例: '2020-01-01 12:15:03')) |
TIME | 時間 | '時:分:秒'(例: '12:15:03') |
YEAR | 年 | 年(例: 2020) |
値の指定方法
日付や時間を扱う型のカラムに値を挿入する場合、以下のような基本フォーマット以外の形も使える。
- '2020-01-01 12:15:05' (基本)
- '20-1-1 12:15:5'
- '2020/01/01 12:15:05'
- '20200101121505'
文字列型
文字列を扱う型は以下の種類があり、それぞれ用途が違いがある。
型 | 用途 |
---|---|
CHAR | 固定長文字列を格納。CHAR(10) のようにして格納できる文字数(0〜255・デフォルトは1)を指定できる。 |
VARCHAR | 可変長文字列を格納。VARCHAR(10) のようにして格納できるバイト数(0〜65,535)を指定できる。 |
BINARY | 固定長バイナリバイト文字列を格納。BINARY(10) のようにして格納できる文字数(0〜255・デフォルトは1)を指定できる。 |
VARBINARY | 可変長バイナリバイト文字列を格納。VARBINARY(10) のようにして格納できるバイト数(0〜65,535)を指定できる。 |
TINYBLOB | バイナリデータを格納。最大長は 255 (2^8 − 1) バイト。 |
BLOB | バイナリデータを格納。最大長は 65,535 (216 − 1) バイト。BLOB(10) のようにして格納できるバイト数を指定できる。 |
MEDIUMBLOB | バイナリデータを格納。最大長は 16,777,215 (2^24 − 1) バイト。 |
LONGBLOB | バイナリデータを格納。最大長は 4,294,967,295 または 4G バイト (2^32 − 1) バイト。 |
TEXT | 文字列を格納。最大長は 65,535 (216 − 1) 文字。TEXT(10) のようにして格納できる文字数を指定できる。 |
1.2.2. 正規化
関係データベースにおいて蓄積データの重複や矛盾が発生しないように最適化するのが一般的。 同じ内容を表のあちらこちらに書かないように表を分割するなどすることは正規化と呼ばれる。
正規化の実行
非正規形(正規化を行っていない元の形の表)を何回か正規化を行い最適化行う。 | 正規化 | 説明 | | ---- | ---- | | 非正規形 | 正規化されていない繰り返し部分を持つ表 | | 第1正規形 | 繰り返し部分を分離させ独立したレコードを持つ表 | | 第2正規形 | 部分関数従属しているところを切り出した表 | | 第3正規形 | 主キー以外の列に関数従属している列を切り出した表 |
非正規形
非正規型の表は繰り返し部分を持ち、関係データベースで扱えない表の形である。
第1正規形
非正規形の表から繰り返し部分を取り除いたものは第1正規形となる。 また表の形は2次元の表となる。
第2正規形
第1正規形の表から部分関数従属している列を分離した表が第2正規形の表である。
第3正規形
第2正規形の表から主キー以外の列に関数従属している列を分離した表が第3正規形の表である。
1.2.3. 関係演算
関係演算は表の中から特定の行や列を取り出したり、表と表をくっつけ新しい表を作り出したりする演算のことである。 選択、射影、結合などがある。
- 選択 ・・・ 行を取り出す演算
- 射影 ・・・ 列を取り出す演算
- 結合 ・・・ 表同士を結合する演算
このような演算を行い仮想的に作る一時的な表はビュー表と呼ばれる。
1.2.4. スキーマ
スキーマは「概念、要旨」という意味を持ち、データベース構造や使用の定義をするものである。 標準使用されているスキーマにはANSI/X3/SPARC規格は3層スキーマ構造をとり、外部スキーマ、概念スキーマ、内部スキーマという3層に定義を分けることでデータの独立性を高める。
1.2.5. 主キーと外部キー
データベースの表には行を識別できるようにキーとなる情報が含まれており、それは主キーと呼ばれる。また表同士を関連付けするときの主キーは外部キーと呼ばれる。
また複数列を組み合わせて主キーにしたものは複合キーと呼ばれる。
関数従属と部分関数従属
- 関数従属 ・・・ 主キーが決まったとき列が一意に定まる関係
- 部分関数従属 ・・・ 複合キーの一部の項目のみで列の値が一意に定まる関係
1.2.6. トランザクション管理と排他制御
トランザクション管理と排他処理は複数人がデータベースにアクセスし同時変更などをした際にデータ内容に不整合が生じる問題からデータベースを守る処理。
トランザクション
データベースにおいてトランザクションは一連の複数の処理をひとまとめにしたもののことを指す。 具体的にはデータの整合性を保つための概念と言える。
トランザクションが必要なケースは以下のようなものがある。
- 手動でSQLを操作する場合
- 複数データの整合性を保つ場合
排他制御
排他制御は処理中のデータをロックし他の人が読み書きできないようにする機能である。 ロックする方法には共有ロックと専有ロックがある。
- 共有ロック ・・・ 各ユーザはデータを読むことはできるが、書き込みができない状態
- 専有ロック ・・・ 他ユーザはデータを読み書きすることができない
また、デットロックと呼ばれる現象がロック機能を使いすぎると起こる場合がある。
ACID特性
DBMSではトランザクション処理に対して4つの特性(ACID特性)が必要とされる。
1.2.7. データベースの障害対策
データベースは定期的にバックアップを作ったり、更新前後の状態をジャーナルファイルに記録したりし障害の発生に備える。 バックアップ後の更新はジャーナルと呼ばれるログファイルに更新前の状態と更新後の状態を逐一記録しデータベースの更新履歴を管理するようにする。
障害が発生した際にはこれらのファイルを用いてロールバックやロールフォワードなどの障害回復処理を行い、元の状態に復旧する。
コミットとロールバック
データベースでは更新処理をトランザクション単位で管理しる。 トランザクションは一連の処理が問題なく完了できたときに、最後にその更新を確定することでデータベースへ更新内容を反映させる。これはコミットと呼ばれる。 またトランザクション処理中に障害が発生し更新に失敗した場合、データベース更新前の状態を更新前ジャーナルから取得しデータベースをトランザクション処理直前の状態に戻す。この処理はロールバックと呼ばれる。
分散データベースと2相コミット
分散データベースシステムは物理的に分かれている複数のデータベースを見かけ上1つのデータベースとして扱えるようにしたシステムのこと。
これはトランザクション処理が各サイトにわたり行われるので、全体の同期をとりコミット、ロールバックを取らないと、データの整合性が取れなくなる恐れがある。 そのため全サイトに問い合わせを行い、その結果を見てコミット、ロールバックを行う。この処理は2相コミットと呼ばれる。
ロールフォワード
データベース自体が突然障害に見舞われた場合、バックアップ以降の更新ジャーナルから更新情報を取得し、データベースを障害発生直前の状態に復旧させる一連の処理がある。
この処理はロールフォワードと呼ばれる。
1.3. DBホスティングサービス
一部のみの記載。
1.3.1. DB
名称 | 種類 | ホスト元 |
---|---|---|
Amazon Aurora | RDBMS | AWS |
Cloud SQL | RDBMS | GCP |
Azure SQL Database | RDBMS | Azure |
Amazon Aurora | NoSQL | AWS |
Cloud Bigtable | NoSQL | GCP |
1.3.2. サーバレスDB
サーバレスDBではサーバ管理を考える必要がないため、開発者はプログラムの開発に集中できる。
名称 | 種類 | ホスト元 |
---|---|---|
AWS Lambda(NoSQL) | - | AWS |
Amazon Aurora Serverless | - | AWS |
PlanetScale | RDB |