データベースのきほん #1-データベースの全体像

こんにちは、4年目エンジニアの nakaSay です。普段は在庫管理システムのフロントエンド・バックエンドの開発を行っています。

今回は「データベースのきほん」という書籍の内容をかい摘み、いくつかのパートに分けて記事を投稿しようと思います。
本書籍は入門書であり、記事では以下のような内容を取り上げる予定です。気になった方は是非気軽にお立ち寄りください。

1. [データベースの全体像](#データベースの全体像)
1. [リレーショナルデータベースとは](#https://qiita.com/nakaSay/items/a154bc026a13b2f9e256)
1. [データベースに関わるお金の話](https://qiita.com/nakaSay/items/d065b52c6fe55ba3070a)
1. [データベースとアーキテクチャ構成](https://qiita.com/nakaSay/items/a96293ce85f7e92766f0)
1. [DBMS を操作するときの基本知識](https://qiita.com/nakaSay/items/2c393f85ecec752390b8)
1. [SQL文の基本](https://qiita.com/nakaSay/items/86c49eec04e6e6748c9e)
1. [トランザクションと同時実行制御](https://qiita.com/nakaSay/items/df1073b0ed73d5389e60)
1. [テーブル設計の基礎](https://qiita.com/nakaSay/items/5b157c24f2237981592a)
1. [バックアップとリカバリ](https://qiita.com/nakaSay/items/cd6239ae500594b0784e)


# データベースの全体像
「データベースって何ですか？」
と聞かれるとみなさまはどのようにイメージされるでしょうか。
Oracle Database を提供するオラクルでは、以下のように定義されています。
> 構造化した情報またはデータの組織的な集合

少しイメージしやすくなるために、身の回りにあるデータを考えてみます。
- 写真フォルダ
- アドレス帳
- ゲームのデータ

今例に挙げたものはまさにデータの組織的な集合であり、これらはデータベースで管理されています。
（必ずしもそうとは限りませんが、ここでは一旦気にせず進行します）

定義から振り返ってみると、普段の生活でも実はデータベースに囲まれていることが実感できるかと思います。
それにも関わらずデータベースと距離が遠く思えるのは、データベースは我々から見えないよう意図的に隠されているからです。
これについては後ほど少し深掘りますので、ここでは「データベースって何ですか？」に対するイメージの共有だけに留めておきます。

## データベースの基本機能
データベースは以下の基本機能を持ちます。
1. [検索と更新](#検索と更新)
1. [同時実行制御](#掃除実行制御)
1. [耐障害性](#耐障害性)
1. [セキュリティ](#セキュリティ)

### 検索と更新
「データベースはアドレス帳から始まった」というのは有名な話なのですが、みなさまはアドレス帳をどのように利用されますでしょうか。

- 欲しい連絡先を検索する
- 新しい連絡先を登録する
- 誤った連絡先を修正する
- 不要な連絡先を削除する

ざっくりとこのようにまとめることが出来るのではないでしょうか。まさにこれが「検索と更新」です。
(ここでは更新を広義に捉え、登録・修正・削除としています）

我々は普段から様々な場所でデータの検索と更新を行っていますが、それこそがデータベースの提供する基本機能の一つとなっています。
特に「検索」は最重要機能であり、検索の快適さには重点を置くべきだと考えられます。それについては、別のパートで触れようと思います。

### 同時実行制御

例えば、以下のような状況を考えてみます。
「2人のユーザーが座席表アプリを同時に開こうと試み、偶然同じ席を指定しようとした」

この場合、動作は主に以下のようになります。
1. 最初の人がアプリを開いている間は、もう一人はアプリを開けない
1. 最初の人がアプリを開いている間は、もう一人はアプリを「読取専用」でしか開けない
1. どちらもアプリを開けるが、後に行われた更新が反映される

これらはトレードオフの関係になっており、1は後者の人から見れば制限が強いですが、前者の人から見れば安心です。逆に、3は後者の人から見れば自由度が高いですが、前者の人から見れば危なっかしく思えるでしょう。
一方にとって都合が良いが、もう一方では使いにくい状況となっている。まさにトレードオフの関係となっています。
この複数ユーザー間の更新をうまく整合させるための機能が「同時実行制御」または「排他制御」などと呼ばれます。
ここでは概要だけに留めておき、詳細については別のパートで深掘りします。

### 耐障害性
データベースでは重要なデータを保存していることがほとんどであり、まさにシステムの「心臓」です。
そのため、「壊れにくい、壊れても迅速に復旧できる」こと、その耐障害性も重要な機能です。

近年でもデータ損失がしばしば話題に挙げられることがありますが、対策としては主に以下の方針があります。
1. データの冗長化
1. バックアップ

データの冗長化とはデータを分散させておくことで、データが完全に消失することを防止する「予防策」です。
バックアップとは、データが壊れたときにデータを復旧する「事後策」です。

上記対策を十分に練っておくべきという総論は全会一致しているのですが、それでも先ほど述べたデータ消失が起きてしまうのは「コスト」に悩まされることが原因の一つにあります。「分かってはいるが、高いんだよね」というのが現実ではしばしば起きているのです。
これについても、別のパートで深掘りしていきます。

### セキュリティ
最後の基本機能はセキュリティです。
先ほども述べたように、データベースはシステムの「心臓」であり、機密性がとても高いものになります。
つまりデータベースをいかに隠すか、ということを考えなければいけません。

2024年8月現在、直近でも有名サービスの大規模な情報漏洩が記憶に新しいです。この件で運営会社は大きな損害を受けることとなりました。

このようなデータベースを扱う上でのリスクを鑑み、データベースはユーザーから意図的に隠されています。
そのため、スマートフォンや PC などの直接操作を行うクライアントを通じて、データベースのデータを扱える仕組みとなっているのです。

## まとめ
- データベースとは「構造化した情報またはデータの組織的な集合」である
- 我々は普段からデータベースに囲まれているが、それは注意深く隠されている
- データベースには次の4つの基本機能がある
    - 検索と更新
    - 同時実行制御
    - 耐障害性
    - セキュリティ

パート1はこれにて以上となります。
次回はデータベースの種類とその中でもリレーショナルデータベースについて触れていきます。
もしご興味がある方は続編もお読み頂けると嬉しいです。

## 参考

https://www.shoeisha.co.jp/book/detail/9784798135168

https://www.oracle.com/jp/database/what-is-database/