【面接対策】技術質問に対して簡潔な回答【２０選】

# ■ はじめに

現在、私は転職活動しているのですが、技術質問をされた際にうまく回答することができなかったので、反省として、これまで学習した技術について簡潔な回答を用意しておきたいと思います。
`「（答えられないかも・・・）」って質問`や`気になった質問`のみ見ていただいて、誰かの参考になれば嬉しいです。


:robot:「ここまで勉強してたら〇〇って知っているかな？」
:sweat_smile:「確か、アレですよね」
:robot:「・・・」
:joy:「（オワタ）」

こうならないためにも、`フワッとした理解`から`少しでも言語化できるレベル`になっておきたいですね:sunglasses:

**【関連記事】**
こちらも書いてみましてので、どなたかの役に立てれば嬉しいです。

https://qiita.com/gon0821/items/12741e11f2b75ed792c0

![段落テキストのコピー (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117662/f9849758-3a46-5e02-bfd2-02f3388587b7.jpeg)


# ■ 回答に対してのポイント
まず、面接官視点を意識しながら、気をつけておいたほうがよさそうなポイントを挙げてみました。

---
**【理想】**
- **正確かつ事実に基づいて、回答する。**
    - これまで学習してきた内容を思い出し、正確な用語を用いて説明しましょう。

---

**【微妙な時】**

- **不安そうな顔をして、答えない。**
    - 「エンジニアになりたい！」と話しているのだから、`自信を持っている`・`技術が好き・関心がある`そんな風に面接官に思ってもらえるように **<font color=tomato>笑顔</font>** で答えたいですね！
    - 技術質問だけではなく、これは面接のはじめから終わりまで意識しておきたいことですね！

- **回答に自信がない時は、自分の認識＆聞き返す。**
    - `「私は〇〇のように認識しておりますが、こちらの認識で合っていましたでしょうか？」`
    - このように回答することで、前向きな姿勢を見せれますし、面接官との認識のズレを小さくできると思います！

- **分からない場合は知ったかぶりはせず、分からないことは<font color=#4169e1>「分かりません」</font>と答える。**
    - 面接官からすると
     `「実務に入っても、分からないのに分かっているフリをするのではないか？」`
と不安を与えてしまいます。
    - `「差し支えなければ、その技術についてお伺いしてもよろしいでしょうか？」`
このように聞き返したほうが前向きな姿勢の方を評価していただけるかもしれません。


# ■ 想定技術質問

## ◎ プログラミング基礎

<details>
<summary><strong>Q1. オブジェクト指向とは何ですか？</strong></summary>

<br>

**<font color=#6a5acd> `オブジェクト指向`はデータや処理手順を１つのまとまりがあるモノと見なし、それらを組み合わせてシステムを構築する考え方</font>**

**【メリット】**
コードの再利用性とメンテナンスを向上させ、複雑なプログラムの開発を容易にします

**【三大要素】**
- カプセル化
    - クラスの外から干渉できないようにする
- 継承
    - コードの重複を避け、コードの再利用ができる
- ポリモーフィズム
    - 振る舞いを様々に変えられる仕組み

<sub>参考：[「オブジェクト指向とは？関連用語やメリットをわかりやすく解説」](https://it-trend.jp/development_tools/article/32-0025)より</sub>

余裕があれば以下の記事も理解できるようになっておきたい。
[【Qiita記事】オブジェクト指向と10年戦ってわかったこと](https://qiita.com/tutinoco/items/6952b01e5fc38914ec4e)

</details>

<details>
<summary><strong>Q2. MVCモデルとは何ですか？</strong></summary>

<br>

**<font color=#6a5acd> 「Model」「View」「Controller」の3つに分けてコードを管理し、役割ごとにコードを分けることでシステムの保守性や生産性を向上させることを目的とした考え方</font>**

- `【Model】`はビジネスロジックを担当する部分で、DBとデータをやり取りしたり、データの登録・更新・削除などの処理を行う。
- `【View】`は表示や入出力などのユーザーインターフェースを担当する部分で、HTMLなどユーザーが実際に見る画面にあたる。
- `【Controller】`はModelとViewの制御を担当する部分で、Modelにデータ処理の指示を出したり、Viewに画面表示の指示を出したりする。

<sub>参考：[「【解説】MVCモデルとは？メリット・デメリット」](https://system-kaihatu.com/archives/3204)より</sub>

</details>

<details>
<summary><strong>Q3. CRUD処理とは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>データベースに対して行う操作の総称で、Create（生成）、Read（読み込み）、Update（更新）、Delete（削除）の頭文字をとったもの</font>**

1. **Create（生成）**
    - データを新しく生成してデータベースなどの保存先に保存する操作
    - 例えば、新しいユーザーアカウントの作成や新しい記事の投稿など
1. **Read（読み込み）**
    - 保存されているデータを読み取る操作
    - 例えば、ユーザー情報の表示や記事の一覧の取得など
1. **Update（更新）**
    - 既存のデータの内容を変更する操作
    - 例えば、ユーザーのプロフィール情報の編集や記事の内容の修正など
1. **Delete（削除）**
    - 保存されているデータを削除する操作
    - 例えば、ユーザーアカウントの削除や記事の削除など

</details>



<details>
<summary><strong>Q4. 例外処理とは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>プログラムの実行の継続を妨げる例外が発生した際に、その内容に応じて実行される処理</font>**

**【なぜ例外処理が必要なの？】**
- 予想外のエラーが発生してもプログラムがクラッシュせず、適切に動作し続けることができる。
- エラーが発生した際にその情報をログに記録するなどし、デバッグや問題の特定を容易にするなど

</details>

<details>
<summary><strong>Q5. バリデーションとは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>入力されたデータが特定の条件や規格に適合しているかを確認するプロセスや手続きのことで、データの品質を保持し、不正なデータ・予期しないデータがシステムに悪影響を与えないために重要</font>**

**【バリデーションの用途・使用例】**
- **入力フォームの検証**
    - ユーザー入力が正しいフォーマットや範囲内にあるかをチェック
    - 例えば、Eメールアドレスの形式、パスワードの強度、電話番号の形式など。
- **データベースの整合性**
    - データベースにデータを保存する前に、そのデータが正しい形式や条件を満たしているかを確認
- **セキュリティ**
    - 入力を検証することで、セキュリティ攻撃からシステムを保護

**【☆併せて知っておきたい】**
- バリデーションはクライアントサイド（ブラウザ側）で行われる場合とサーバーサイドで行われる場合がある。
- セキュリティの観点から、クライアントサイドのバリデーションだけでなく、サーバーサイドでのバリデーションも重要

</details>

<details>
<summary><strong>Q6. 非同期処理とは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>プログラムがタスクを実行する際に、そのタスクが終了するのを待たずに次のタスクに移る処理のことを指し、複数のタスクを並行して実行することができる</font>**

**【目的・効果】**
- ユーザー体験の向上
- リソースの効率的な利用

**一方で、<font color=dodgerblue>「同期処理」</font>とは？**
- 一つのタスクが終わるまで、次のタスクに移れない。
- そのため、ユーザーが同期処理で実装されたWebサービスを使おうとすると、待ち時間が発生しやすい状況に陥る。
- この結果、ユーザー体験が悪く、ユーザーが離れていく可能性が高まる。

<sub>参考：[「非同期処理とは何か、何が嬉しいの？」](https://qiita.com/yunity29/items/7ccc84d47e139340ecbc)より</sub>


</details>


## ◎ Web技術

<details>
<summary><strong>Q7. HTTPとHTTPSの違いは何ですか？</strong></summary>

<br>

**<font color=#6a5acd> `HTTP`は暗号化されていない通信プロトコルで、`HTTPS`はSSL/TLSを使用して通信を暗号化するHTTPの安全なバージョン</font>**

|  | HTTP | HTTPS |
|:-:|:-:|:-:|
| 正式名称 | Hytertext Transfer Protocol | Hytertext Transfer Protocol Secure |
| 役割 | WebサーバとWebブラウザの間で、やりとりするためのプロトコル | HTTPの暗号化通信 |
| URL | http:// | https:// |
| ポート番号 | 80 | 443 |
| 必要なもの | Webブラウザ | Webブラウザ、SSLサーバ証明書 |


<sub>参考：[「HTTPとは？HTTPSとの違いをサイト移行で実施するリダイレクト設定などをもとに解説」](https://www.itmanage.co.jp/column/about-http-https/)より</sub>

</details>


<details>
<summary><strong>Q8. GETとPOSTの違いは何ですか？</strong></summary>

<br>

**<font color=#6a5acd> `GET`はデータをURLの一部として送信し、通常、情報の取得に使用され、`POST`はデータをリクエストボディに含めて送信し、データの送信や更新に使用される</font>**

|  | GET | POST |
|:-:|:-:|:-:|
| 目的 | リソースを取得する | リソースに対して特有の処理をする |
| データの送信 | URL内のクエリパラメータとして送信 | リクエストボディに含まれて送信され、URL内には表示しない |
| ブックマーク | できる | できない |
| データ量 | URLの長さに制限があるため、渡せる情報量が少ない | リクエストボディに含めるため、渡せる情報量が多い |

<sub>参考：[「GETとPOSTの違いについて」](https://qiita.com/kanataxa/items/522efb74421255f0e0a1)より</sub>

</details>

<details>
<summary><strong>Q9. レスポンシブデザインとは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>デバイスや画面サイズに応じてコンテンツやデザインが適切に調整されるWebデザインで、ユーザー体験を最適化するためのもの</font>**

- ある研究結果では、ネット使用時のデバイスは以下の通りとなっており、レスポンシブデザインは現代の環境において必須となっています。
    - スマホのみ：５４％
    - スマホ＋PC：４２％
    - PCのみ：１％

<sub>参考：[「〈調査報告〉インターネットの利用環境 定点調査（2022年上期）」](https://prtimes.jp/main/html/rd/p/000003907.000001594.html)より</sub>


</details>

<details>
<summary><strong>Q10. クッキーとセッション情報の違いは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>クッキーはブラウザに保存される小さなテキストファイルで、ユーザーがサイトを再訪した時にその情報が利用できるのに対し、セッション情報はサーバー上でユーザー情報を一時的に保存するためのもので、ユーザーがブラウザを閉じると情報が消える</font>**

- クッキーとセッション情報、両者の比較

|  | クッキー | セッション情報 |
|:-:|:-:|:-:|
| データの保管場所 | クライアントサイド | サーバーサイド |
| セキュリティ | 低い | 高い |
| データの保存量 | 少ない | 多い |

- **セッション**と**セッション情報**の違い
    - `セッション`はユーザーがシステムやアプリにアクセスしてからログアウトするまでの一連の操作やトランザクションを指す。
    - `セッション情報`はセッション中にシステムやアプリが保存する情報のことを指す。

<sub>参考：[「【IT基本】Cookieとセッションって初めて聞いたけど、ざっくりと何なん？」](https://qiita.com/gon0821/items/07100b161918e54dff68)より</sub>


</details>

<details>
<summary><strong>Q11. APIとは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>アプリケーションプログラム同士がデータのやり取りを行うためのインターフェースや規約のことで、データや機能を提供するプログラムと、それを利用するプログラムの間の仲介役として機能する</font>**

- `API`とは、「Application Programming Interface」の略
- APIの中でも、Web上で提供されるAPIを`WebAPI`と呼び、WebAPIはHTTPやHTTPSといったプロトコルを利用するため、Web上の様々なデバイスやプログラムから利用できる

<sub>参考：[「REST APIについてちゃんと理解する」](https://qiita.com/na_/items/84505c00c1540d317b35)より</sub>

</details>

<details>
<summary><strong>Q12. SPAとは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>「シングルページアプリケーション」の略であり、単一のページでWebアプリケーションを構成する設計構造のことで、SPAが実装されたページでは、遷移を行わずにコンテンツが切り替わるため、ユーザー体験（UX）の向上につながる</font>**

**<font color=dodgerblue>メリット</font>**
- ページのリロードなしでコンテンツがスムーズに更新され、UXの向上になる。
    - １回目のリクエストでは全てのデータを要求するが、２回目以降は１回目との差分データのみを要求するので処理が速い。

**<font color=tomato>デメリット</font>**
- 初期のロード時間が長くなる。
    - SPAを実装することで、JSのコードが増えて初期ローディングに時間がかかる。

<sub>参考：[「SPA、SSR、プリレンダリングの違いをまとめてみた」](https://qiita.com/amakawa_/items/e7d0720e1ab8632769bf)より</sub>


</details>



## ◎ 開発手法/ワークフロー

<details>
<summary><strong>Q13. アジャイル開発とは何ですか？</strong></summary>

<br>

**<font color=#6a5acd> `アジャイル開発`は短いサイクルで開発とフィードバックを繰り返し、途中の仕様変更などにも柔軟に対応できる開発手法</font>**

**<font color=tomato>メリット</font>**
- 不具合が発覚した際に戻る工数が少ない
    - 小さな単位で計画から設計、実装、テストを繰り返しているため、テストで問題が発生しても、ひとつイテレーション内を戻る分の工数で済む。
- 仕様変更や追加対応可能なので、ユーザーのニーズに最大限応えることができる点
    - 計画段階で綿密な仕様を決めないため、開発途中でユーザーとコミュニケーションを取りながら進めることができる。

**<font color=blue>デメリット</font>**
- 計画段階で厳密な仕様を決めていないため、開発の方向性がブレやすい
- 計画を詳細に立案しないため、スケジュールや進捗具合が把握しにくく、コントロールが難しい

<sub>参考：[「アジャイル開発とは？今さら聞けない開発手法のメリット・デメリット」](https://hnavi.co.jp/knowledge/blog/agile_software_development/)より</sub>

</details>

<details>
<summary><strong>Q14. なぜテストコードを書く必要がありますか？（テストコードの目的）</strong></summary>

<br>

**<font color=#6a5acd>いくつか理由挙げられますが、バグの早期発見、ドキュメントとしての役割、リファクタリングなどのコード変更後の動作確認などにおいて有効な手段であるから</font>**

**【併せて覚えておきたい】**

**<font color=dodgerblue>テストコードの対象</font>**
- **システムのメインとなる部分**
    - サービスの中心となる部分でバグを起こさせない。
    - メイン部分はコードの複雑さが増す可能性が高く、バグが発生する可能性が高いため。
- **セキュリティ部分**
    - 権限管理など
- **不具合があると致命的な部分**
    - 個人情報（メール送信先等）、決済関連
- **明らか自動化した方が速い部分**
    - アカウント作成時のロジックやシステム日時に依存するロジックなど
- **例外処理**
    - 例外処理のバグでさらに例外が発生すると、元の例外処理が失われる

**<font color=tomato>テストコードの対象外</font>**
- **外部ライブラリやフレームワーク**
    - それ自体が十分にテストされていると想定する。
    - 自分のコードが正しくフレームワーク等を利用できているかを確認すべき
- **シンプルな部分**
    - アプリケーションの基礎的な部分は他のテストコードを書いているうちに自然とテストできている。

**<font color=green>テストコード書く際に注意すべき点</font>**
- 抜け漏れがない、`必要最小限`のテスト項目を抽出する。
- データの更新や削除を伴うテストを書く場合は、`before/afterの両方`を検証する。（afterだけ検証して満足しないこと）
- `上から下に`、素直に読み下せるテストコードを書く。
- テストコード全体がなるべく`１画面`に収まるようにする。
- 複雑なテストコードのデメリットを理解する。

<sub>参考：[「【初心者向け】テストコードの方針を考える（何をテストすべきか？どんなテストを書くべきか？）」](https://qiita.com/jnchito/items/2a5d3e15761fd413657a)より</sub>

</details>

<details>
<summary><strong>Q15. ビルドとは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>ソースコード上に問題がないかどうかを解析を行った上で、問題がなければオブジェクトコードに変換し、複数のオブジェクトファイルを1つにまとめて実行可能なファイルを作成する作業</font>**

**【前提知識】**
- **ソースコード**：プログラミング言語を用いて開発者によって人間の言葉で書かれたコード
- **オブジェクトコード**：コンピュータは`ソースコード`が読めないため、コンピュータが読めるように変換されたのがオブジェクトコード
- **コンパイル**：`ソースコード` ⇒ `オブジェクトコード` への変換作業をコンパイルと呼ぶ
- **リンク**：`オブジェクトコード`に変換されたバラバラなファイルを一つの実行ファイルとしてまとめる作業

**【まとめ】**
- `コンパイル`、`リンク`などの一連の作業を<font color=red>**ビルド**</font>と呼び、つまり`コンパイル`もビルドの一環となる。
- その後、ビルドされたプログラムをサーバーに置いた上で、実行ファイルを実行できるようにすることを`デプロイ`と呼ぶ

<sub>参考①：[「ビルドとデプロイって結局なんやねん！？！？！？？？みたいな記事」](https://qiita.com/isoyam/items/3d1fc5cf7403cdf4818d)より</sub>
<sub>参考②：[「コンパイル、ビルド、デプロイの違いを解説」](https://cloudnavi.nhn-techorus.com/archives/2722#:~:text=%E6%8A%80%E8%A1%93%E6%94%AF%E6%8F%B4%E3%83%BB%E3%82%B3%E3%83%B3%E3%82%B5%E3%83%AB%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0-,%E3%83%93%E3%83%AB%E3%83%89%E3%81%A8%E3%81%AF,%E9%9B%86%E7%B4%84%E3%81%97%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)より</sub>


</details>

<details>
<summary><strong>Q16. デプロイとは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>開発したソフトウェアやアプリケーションを、実際の運用環境に展開し、実際に動作・使用できる状態にすること</font>**

**【デプロイのざっくりした手順】**
1. 開発中はGit/GitHubなどを利用したコードのバージョン管理
1. Webサーバー、APサーバーの設定
1. ライブラリーやパッケージのインストール、依存関係の解決
1. データベースのマイグレーションなどDBサーバーの設定
1. サーバーへコードを転送
1. サーバーの再起動、アクセス確認など

<sub>参考：[「「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典」](https://wa3.i-3-i.info/word16767.html)より</sub>


</details>

<details>
<summary><strong>Q17. CI/CDとは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>CIでビルドやテストを自動化し、CDでテストされたコードのマージや、本番環境向けのビルドの作成を自動的に行い、CIとCDの作業を合わせて、CI/CDと呼ぶ</font>**

**<font color=dodgerblue>CI(継続的インテグレーション)</font>**
- `Continuous Integration（継続的インテグレーション）`の略
- ソフトウェア開発において、アプリケーションへの新しいコード変更が定期的に`ビルド`、`テスト`され、共通リポジトリに統合されるような`自動化プロセス`を指す。

**【メリット】**
- バグの早期発見
- 品質の向上
- 効率的な開発
    - 安心してコード変更ができるため、開発やリリースの速度の効率が向上

**<font color=blue>CD(継続的デリバリー/継続的デプロイ)</font>**
- `Continuous Delivery（継続的デリバリー）`または`Continuous Deployment（継続的デプロイ）`の略
- `継続的デリバリー`は開発者によるアプリケーションへの変更に対して、バグがないか自動的にテストし、リポジトリにアップロードする。
    - このアプローチで、本番環境にデプロイする準備が整った状態となる。
- `継続的デプロイ`は開発者による変更をリポジトリから本番環境に自動的にリリースし、顧客が使用できるようにする。
    - 手動の作業は必要なく、変更はすぐにエンドユーザーに届けられる。

**【メリット】**
- 高速なフィードバック
    - 開発者はコードの変更がエンドユーザーにどのように影響するか迅速に知ることができる。
- 市場への対応
    - 新しい機能や修正を素早くリリースすることで、市場のニーズに迅速に対応できる。

<sub>参考①：[「CI/CDとは何か？」（Qiita）](https://qiita.com/choco_p/items/1bd1b106daee1fbd4449)より</sub>
<sub>参考②：[「CI/CDとは」（Red Hat）](https://www.redhat.com/ja/topics/devops/what-is-ci-cd#:~:text=CI%20%E3%81%A8%20CD%20%E3%81%AE%E6%84%8F%E5%91%B3%E3%81%A8%E5%BD%B9%E5%89%B2&text=CI%2FCD%20%E3%81%AE%E3%80%8CCI%E3%80%8D,%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E7%B5%B1%E5%90%88%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)より</sub>


</details>

## ◎ システム/セキュリティ

<details>
<summary><strong>Q18. Linuxとは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>オープンソースで無料で誰でも使用することができ、セキュリティが高く、主にサーバーで用いられるOS</font>**

**【併せて覚えておきたい】**

**<font color=green>カーネル</font>**
- Linuxの中核となる部分で、コンピュータのハードウェア制御を行うソフトウェアのことを指し、これが狭義のLinuxに該当する。
- ただしカーネルだけでは中核となる機能だけしか持っておらず、機能が少なすぎて実用的ではない。

**<font color=limegreen>ディストリビューション</font>**
- カーネルに色々なソフトウェアを組み合わせて、ユーザーがそのまま使えるようにしたものをディストリビューションと呼び、こちらが広義のLinuxに該当する。

- ディストリビューションには1000種類以上あり、独自のコミュニティが開発しており、Red Hat系（CentOS等）とDebian系（Ubuntu等）が主流となっている。

</details>

<details>
<summary><strong>Q19. SQLインジェクションとは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>検索ボックスや入力フォームなどに記入する文字列に不正な操作を行うSQL文を意図的に「注入」することにより、データベース内のデータの消去や改ざんといった操作やデータの盗用を図る攻撃</font>**

**【併せて覚えておきたい】**
- クロスサイトスクリプティング（XSS）
    - Webページにユーザの入力データをそのまま表示するフォーム、または処理があるときに、第三者が悪意あるスクリプトを埋め込むことで、`cookie`等のデータを盗み出す攻撃

- SQLインジェクションとXSSの違い

|  | SQLインジェクション | クロスサイトスクリプティング（XSS） |
|:-:|:-:|:-:|
| 攻撃対象 | データベース | エンドユーザー |
| 影響 | データベースに直接影響を与える | ユーザーのブラウザ上で影響を及ぼす |

<sub>参考：[「【初心者向け】SQLインジェクションの5つの対策と被害事例」](https://www.nttpc.co.jp/column/security/sql_injection.html#:~:text=SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%AF,-%E3%80%8CSQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%8D%E3%81%AF&text=%E3%80%8CSQL%E3%80%8D%E3%81%AF%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E6%93%8D%E4%BD%9C,%E7%9B%97%E7%94%A8%E3%82%92%E5%9B%B3%E3%82%8B%E6%94%BB%E6%92%83%E3%81%A7%E3%81%99%E3%80%82)より</sub>


</details>

## ◎ データベース

<details>
<summary><strong>Q20. DB設計の正規化とは何ですか？</strong></summary>

<br>

**<font color=#6a5acd>DBの論理設計において、テータの重複を避け、データの整合性を保つための手法</font>**

**【正規化のプロセス】**
- 正規化のレベルは第５まであるが、実用レベルでは第３正規形まで理解すれば十分

**<font color=dodgerblue>第1正規形</font>**
- 定義「一つのセルの中には一つの値しか含まない」
- 理由「セルに複数の値を許せば、主キーが各列の値を一意に決定できないから」

**<font color=dodgerblue>第２正規形</font>**
- 定義「テーブル内で部分関数従属を解消し、完全関数従属のみのテーブルを作る」
- 主キーの一部の列に対して従属する列がある場合、この関係を`部分関数従属`と呼ぶ
- 一方で、主キーを構成するすべての列に従属性がある場合を`完全関数従属`と呼ぶ


**<font color=dodgerblue>第3正規形</font>**
- 定義「テーブル内で推移的関数従属を解消する」
- テーブル内部に存在する段階的な従属関係のことを、`推移的関数従属`と呼ぶ

参考図書：[「達人に学ぶDB設計 徹底指南書」](https://www.shoeisha.co.jp/book/detail/9784798124704)

</details>


# ■ おわりに

面接では全く想定していない質問が飛んでくると、思考停止になってしまうときがあるので、
頭の片隅に置いとくだけでも全然違うのかなと思い、この度記事にまとめてみました:writing_hand_tone1:

また、技術質問に関する記事が意外と少なく、「こんな記事があればいいな」と思い浮かべながら作成しました！

少々時間はかかりましたが、これまで学習した内容について復習でき、とてもいい機会になりました:relaxed:

間違っている点などございましたら、ご指摘いただけますと幸いです。

最後まで読んでいただき、ありがとうございました:four_leaf_clover: