データベースの必須機能について「なぜそれが必要なのか」個人的まとめ



## はじめに
データベースの学習をし始め、思いのほか覚えることが多く
しっかり前提知識を覚えているかの確認と自分への備考禄として記事を書きました。
初学者ゆえ、もし間違っていることがありましたらコメントでのご指摘もお待ちしております。

（記事を書く上で参考にした書籍はこちら）
[おうちで学べるデータベースのきほん](https://www.amazon.co.jp/%E3%81%8A%E3%81%86%E3%81%A1%E3%81%A7%E5%AD%A6%E3%81%B9%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E3%83%9F%E3%83%83%E3%82%AF-ebook/dp/B00TTRZFDC)

## この記事の対象読者
データベースの勉強を始めたての初学者の方
データベースの勉強を始めるとっかかりが欲しい方

## データベースに無くてはならない基本機能
最初に端的に結論だけまとめておきます。以下の四つがデータベースに必須な基本機能になります。
- 「データ検索と更新」
- 「同時実行制御」
- 「障害への耐性」
- 「セキュリティ」

それでは、一番上から順番に詳細を解説していきます。

## データ検索と更新
### 検索
データベースで一番大きな機能と言えば「検索」の機能だと言えます。
例えば、皆さんはココにたどり着くまでGoogleなどで「qiita データベース」と打ってこの記事に来たのかもしれません。
検索エンジンは大量のデータの入ったデータベースから検索に使ったキーワードを使ってヒットしたWebサイトを表示させて検索結果として出しています。
「検索」は調べ物をするときになくてはならない機能です。

### 更新

また`「更新」`も重要な機能です
ここで僕の実体験の一例に上げてみましょう
むかしむかし、ある日のこと
その日、僕は自分の誕生日でした。ツイッターのプロフィールの年齢を嫌々+1の年齢に書き換えお酒を飲みながら何を考えたのかツイッターをして友達のアカウントにクソリプを送り、後日二日酔いから覚めるてあわててツイートを削除。友達に誤り、取り合えずジュースを一本おごりました。
めでたし、めでたし。
今回の事故（？）はかわいいものですが重要なデータを間違えてツイッターに投稿してしまうケースだって全然ありますよね？
データベースには既にあるデータを削除したり修正したりする機能がなくてはいけません。
引き続きツイッターの例をだしますとツイッターは3つの「更新」をしているのが分かります
`「登録」…クソリプをデータベースに登録している`
`「削除」…クソリプをデータベースから消す`
`「更新」…しぶしぶツイッターのプロフィールの年齢を+1する`

この3つの機能は言い換えてしまえばすべて「データベースを更新する機能」とも捉えられるわけです。
このよう僕たちは知らず知らずのうちに4つの機能
`「検索」「登録」「削除」「更新」を使っていたんですね。

## 同時実行制御
同時実行制御というのは言ってしまえば「複数のユーザーが同時にデータベースの同じところを編集。更新しようとしたらどうする？」ってことです。
現実で例えてみましょう
例えば、「AとBという双子がいます。部屋には最後の一ページだけが白紙の自由帳があります。二人はお絵描きがしたくて同時に手を伸ばしている状況」だと想像してください
この時おき得る状況として3パターンあります

### パターン1. 片方(今回はA)が持ち去ってしまう
A: 自由帳読める, 自由帳書ける
B: 自由帳読めない, 自由帳返ってくるまで書けない

### パターン2. 一緒に自由帳をつかう。 
A: 自由帳読める, 自由帳書ける(条件アリ)
B: 自由帳読める, 自由帳書ける(条件アリ)

:::note warn
条件アリ
最後に絵を書いたほうに自由帳が上書きされる
（片方が記録したデータが無くなる or 書き換えられる）
:::

### パターン3. 片方が読み書きしてる間、片方が見てるだけ
A: 自由帳読める, 自由帳書ける
B: 自由帳読める, Aが書き終わるまで書けない


Aの視点からするとパターン１が最高ですが
パターン１はBからすると最悪です

パターン2はBからすると一番いい条件ですが
Aは自分の記録が上書きされるのを嫌がるでしょう

このように複数人が同じものを更新しようとすると
片方の人にとって有利で片方の人には不平等な状況が出てきてしまいます
また、こういった片方を絶たせるともう片方が倒れる状況を`「トレードオフ」`と言います。
実際のデータベースでは状況を見ながらパターン1か3の方法で同時実行制御が行われることが多いようです。

## 障害への耐性
データベースには「なかなか壊れにくく、壊れたとしても復旧が可能」なものが好まれます。
データを入れてそのデータをやり取りすることが仕事のデータベースに「何もデータありません」では困ってしまいますからね。
しかもデータベースにあるべきデータがないという状況はソフトウェアの方にも異常として伝播してしまいます。ソフトウェアも「データベースにデータが入ってる前提」で動いていることが多いためです。
そういったデータ消失問題への対策は大きく分けて二つあります

1.データの冗長化
2.バックアップを取っておく

:::note warn
冗長化とは

もし壊れても別のモノを用意しておいてもしもの事故に備えること。
例えば大事なデータが入ったハードディスクを他のハードディスクに保存しておけば
データが失われることを防ぐことができるわけです
:::
:::note warn
バックアップとは

実際にデータ消失が起きたときにデータ復旧をするための事後策
:::

## セキュリティ
セキュリティとは結論から言うと「データベースに保存されている情報をいかに隠すか」ということです。
データベースは電子通信機器が発達した昨今生活になくてはならないものですが
僕たち使う側がデータベースの存在を意識することはほぼないですよね。
なぜかというと**ユーザーから隠されているから**なんですね！

理由は2つあります

①**ユーザーはサーバー側を意識する必要がないから**
多くのユーザーはそのユーザーが使っているスマホやパソコンの基本的な操作や技術は知る必要がある（それ知らないと動かせないから）けど
裏でどんなデータが行き来してるとか裏でどんな技術が動いているとかは知らなくていい
それが「何をすればどんなことをしてくれるのか」だけ知ってればいいよねって話です

②**データベースは機密性が高い**

システムを作る側からすると「データベースは絶対にユーザーから触らせない」という意思をもって作っていたりします
なぜならデータベースの中身のデータは機密性が極めて高く一般に公開できないものが多く含まれているからです。
ネットでオンラインバンキングやスマホでソシャゲに課金するときなどに
クレジットカード番号や銀行口座の番号を保存するときに使っているケースも少なくありません。
そういった状況で入力したことがある人も大勢いると思います(僕もUdemyで教材を購入するときしましたし）
このようなデータを自由にアクセス出来てしまってはそれを利用する側のリスクは図り知れませんよね。
なのでユーザー側からは徹底的にデータベースを隠し
神経質なほどにデータベースへアクセスするハードルを高くする必要があるのです

しかし、セキュリティの強度の高さは開発者側もまたアクセスしにくいという状況を
作り出しますし、ユーザー側の使い勝手の良さと天秤にかける必要があるので
バランスを取るのが難しい所でもあります。

:::note warn
機密性とは

特定の死人だけが知っているべき情報やデータやシステムを外部から守ること。
例えば、自分のお財布から見ず知らずの他人にお金を取ることができたらダメなので
自分だけが空けられるようにすることと同じ。
:::