データベースについての重要な周辺知識6つ

# はじめに
データベース(RDB, NoSQL)の勉強を行うにあたり、初心者が知っておくべき重要な周辺知識をそれぞれ簡潔に纏めました。各項目は[roadmap.sh](https://roadmap.sh/backend)[^example]というロードマップサイトを参考に列挙しています。学ぶべき知識を網羅しているわけではありませんが、勉強のとっかかりとなればという想いでこの記事を纏めました。

各項目について概念的な説明に留めているので、具体例や詳しい説明が知りたい方は参考サイトを見ていただければ幸いです。

[^example]: このサイトは知識のロードマップを役割ごとに公開しており、例えば"バックエンドエンジニアが学ぶべき知識とその順番"について知ることが出来ます。これから勉強を始めるエンジニアにおすすめのサイトです。

# この記事の対象となる人
- RDBについてある程度基礎知識がある人（クエリ、トランザクションなどの概念が分かる）
- オブジェクト指向について基礎知識がある人（クラス、インスタンスなどの概念が分かる）

# 重要な周辺知識6つ

## 1. ORM(オブジェクトリレーショナルマッピング)
RDBに対するデータの操作を、オブジェクト指向型言語のやり方で扱えるようにするための手法です。具体的には、RDBへの操作がカプセル化されたライブラリ（裏でSQLの生成など行ってくれる）を使用することで、複雑なSQL文を書く手間を省くことができます。


- RDBをオブジェクト指向で操作するとは、どんなイメージか？
以下のサイトの説明が分かりやすかったです。➡https://zenn.dev/myuki/books/02fe236c7bc377/viewer/d2422a
要は、
　オブジェクト指向のクラス⇔DBのテーブル
　オブジェクト指向のインスタンス⇔DBのレコード
　オブジェクト指向の内部変数⇔DBの属性
　オブジェクト指向の公開メソッド⇔DB操作
のように対応付けられ、例えば更新する際はメソッドに値を代入するなりします。
- ORMを使わないと何が困るのか？
  DB操作を動的なSQLで行う必要がありますが、SQL周りのエラーは実行するまで分かりません。開発効率的によろしくないです。
- ORMを使うメリット
  - SQLを書く必要が無く、開発効率が高まる
  - オブジェクト指向言語で書けるため、慣れている人は直感的なDB操作が可能
- ORMを使うデメリット
  - 内部挙動が把握しづらい。複雑なSQLに相当する処理を実行する場合はORMが使いにくいこともある。
  - ORMツールの使い方を勉強する必要がある

## 2. ACID特性
DBのトランザクションを定義する4つの重要な特性のこと。Atomicity(原子性)、Consistency(一貫性)、Isolation(独立性)、Durability(永続性)の頭文字を取っている。
- Atomicity(原子性)
…トランザクションのステートメントが一つの単位として扱われること。ステートメントは「全て実行される」か「全て実行されない」かのどちらかとなる。
　➡要は、**All or Nothing**の原則
- Consistency(一貫性)
…トランザクションがテーブルに、事前定義された予測可能な方法でのみ変更を加えること。例えばNOT NULL制約が定義されたカラムに対し、NULL値が入るような変更は行わない。
　➡**変なデータは発生させない**原則
- Isolation(独立性)
…複数ユーザが同じテーブルに読み書きを同時にしても、互いのトランザクションが干渉されないこと。
　➡**同時に変更しても整合性が担保される**原則
- Durability(永続性)
…システム障害が発生した場合でも、正常に実行されたトランザクションの結果は保存されること。DBの冗長化やログ保管、障害復旧設計などに関連する概念。
　➡**変わらずデータが保持される**原則

※ACID特性とは別に、RDBMSを含むシステム全体が持つべき特性としてBASEという考え方もあります。ここでは省略しますが、興味のある方はこちらも学習してみてください➡https://qiita.com/suziq99999/items/2e7037042b31a77b19c8

(参考)
[https://www.databricks.com/jp/glossary/acid-transactions](https://www.databricks.com/jp/glossary/acid-transactions#:~:text=ACID%20%E7%89%B9%E6%80%A7%EF%BC%9A%E5%8E%9F%E5%AD%90%E6%80%A7%E3%80%81%E4%B8%80%E8%B2%AB,%E3%82%92%E3%81%A8%E3%81%A3%E3%81%9F%E7%95%A5%E8%AA%9E%E3%81%A7%E3%81%99%E3%80%82)
[https://it-biz.online/it-skills/acid/](https://it-biz.online/it-skills/acid/)

## 3. N+1問題
大まかには、ループ処理の中で都度SQLを発行してしまい、結果として大量のSQLを実行して処理時間が膨大になってしまう問題のことを指します。
例えば、
- 一覧に表示するデータを取得するため、SELECTを1回実施（Nレコード返される）
- 各データの関連データを取得するため、SELECTをN回実施
- SELECTが合計N+1回実行される

という状況が考えられます。
N+1問題の対応案としては、以下の２種類が挙げられます。

- JOIN句によるテーブル結合
…テーブル間で共通のIDなどを使用し、JOIN句によりテーブルを結合します。結合の処理時間はかかりますが、１件のクエリで欲しい情報を取得できます。
- 必要なデータを事前にロード
…テーブルのデータを全て取得（1回クエリ発行）し、別テーブルから今後の処理に必要なデータを1回のクエリでまとめて取得します。２件のクエリで完結します。

(参考)
https://qiita.com/muroya2355/items/d4eecbe722a8ddb2568b

## 4. 正規化
データの重複を無くし、整合的にデータを扱えるようにデータベースを設計することです。正規化を行うことで、データ更新に伴って不整合や喪失が起きるのを防ぐことができ、メンテナンス効率を高めることができます。正規化の段階は複数ありますが、以下では一般的に用いられる第一正規系～第三正規系の定義を記述します。
- 非正規系
…一行に複数の繰り返し項目が含まれているテーブルを非正規系といいます。
- 第一正規系
…一行に複数の繰り返し項目が含まれておらず、また導出項目（他の項目から計算して導出可能な項目）が排除されたテーブルを第一正規系といいます。
- 第二正規系
…主キー以外の項目について、主キーに完全関数従属しているテーブルを第二正規系といいます。第二正規系でないテーブルは、非キー属性が主キーに部分関数従属しています（主キーの一部だけで決まる）。その場合、別テーブルに分離させる必要があります。
- 第三正規系
…主キー以外の項目について推移的関数従属性が排除されたテーブルを第三正規系といいます。推移的関数従属性とは、ある非キー属性に別の非キー属性が依存している状態です。

以上が一般的な正規化の概念です。他にもボイスコッド正規系や第4,5正規系といった概念が存在しますが、業務上取り扱うことは稀です。まずは上記の概念を頭に入れておけば良いと思われます。
また正規化は絶対的な正義ではなく、例えば検索効率を考慮してあえて正規化の程度を落とす場合も存在します。その時々の要件に合わせ、適切な正規化フローを選択していく必要があります。

(参考)
https://oss-db.jp/dojo/dojo_info_04

## 5. データベースの様々なFailure Modes
データベースにおける故障や障害の発生の仕方を纏めています。システムの異常系やセキュリティ対応などを検討する際の切り口となるため、最初は何となくで良いので頭に入れておくべきと思われます。
- 読み取り競合
…複数のクライアントまたはプロセスが、データベース内の同じ場所から同時にデータを読み取ろうとしたときに発生。遅延やエラーが発生する可能性があります。
- 書き込み競合
…複数のクライアントまたはプロセスが、データベース内の同じ場所に同時にデータを書き込もうとするときに発生。遅延やエラーが発生する可能性があります。
- Thundering herd
…多数のクライアントまたはプロセスが同じリソースに同時にアクセスしようとした場合に発生。リソースが枯渇し、パフォーマンスが低下する可能性があります。
- Cascade
…データベースシステムの一部での障害が連鎖反応を引き起こし、システムの他の部分での障害につながる場合に発生します。
- デッドロック
…2つ以上のトランザクションが互いにリソースのロックを解放するのを待っているときに発生。
- 破損
…データベース内のデータが破損した場合に発生。データベースの読み取りまたは書き込み時にエラーや予期しない結果が発生する可能性があります。
- ハードウェア障害
…ディスクドライブやメモリなどのハードウェアコンポーネントに障害が発生した場合に発生。データの損失や破損につながる可能性があります。
- ソフトウェア障害
…データベース管理システムやアプリケーションなどのソフトウェアコンポーネントに障害が発生した場合に発生。エラーや予期しない結果が生じる可能性があります。
- ネットワーク障害
…データベースとクライアント間のネットワーク接続が失われると発生。データベースにアクセスしようとするとエラーやタイムアウトが発生する可能性があります。
- サービス拒否 (DoS) 攻撃
…悪意のある攻撃者がデータベースにリクエストを大量に送り込み、リソースの枯渇とパフォーマンスの低下を引き起こそうとするときに発生します。

(参考)
https://roadmap.sh/backend

## 6. データベースのパフォーマンスの監視/分析
データベースのパフォーマンスを監視/分析する場面と手段を纏めています。監視/分析したい対象や内容、問題が発生している箇所によって適切なツールを選択することが重要です。
- システムのパフォーマンスを監視する
…WindowsのタスクマネージャーやUnix/Linuxのtopコマンドなどのツールを使用して、データベースサーバーのパフォーマンスを監視する方法です。システムの全体的なCPU、メモリ、ディスクの使用状況を確認でき、リソースのボトルネックを特定するのに役立ちます。
- データベース固有のツールを使用する
…ほとんどのデータベース管理システム (DBMS) には、パフォーマンスを監視するための独自のツールがあります。たとえば、Microsoft SQL ServerにはSQL Server Management Studio (SSMS) とsys.dm_os_wait_stats動的管理ビューがあり、Oracle には Oracle Enterprise Managerとv$waitstat ビューがあります。ロックの待機時間や物理的な読み取りと書き込みの数など、特定のパフォーマンスメトリクスを確認できます。
- サードパーティツールを使用する
…SolarWinds Database Performance Analyzer、Quest Software Foglight、Redgate SQL Monitorなどのツールが挙げられます。詳細なパフォーマンス分析を提供し、特定の問題やボトルネックを特定するのに役立ちます。
- 遅いクエリを分析する
…実行が遅い特定のクエリがある場合は、MySQLまたはSQL ServerのEXPLAIN PLANやSHOW PLANなどのツールを使用してクエリの実行計画を確認し、潜在的な問題を特定できます。MySQLスロー クエリログやSQL Server Profilerなどのツールを使用することもできます。
- アプリケーションのパフォーマンスを監視する
…データベースを使用している特定のアプリケーションでパフォーマンスの問題が発生している場合は、Application InsightsやNew Relicなどのツールを使用してアプリケーションのパフォーマンスを監視し、データベースに関連する可能性のある問題を特定できます。

(参考)
https://roadmap.sh/backend

## まとめ
以上、roadmap.shを参考にデータベースについての重要な周辺知識6つを纏めました。このページに記載してある内容は概念的な説明に留まるので、知らなかった方は是非関連ワードで検索して詳しく勉強してみてください。
私もRDB, NoSqlの勉強中なので精進します。