【初心者向け】DB設計の際に頻繁に利用するキー３選【＋２選】

<br>
## はじめに
最近ポートフォリオのDB設計をしていたのですが、その際にカラムに設定するキーで、頻繁に利用するものが３つ程ありましたので、今回はその紹介と解説をしようと思います。

これからポートフォリオを作成される方や、DBを学習する方には、かなりタメになる情報になると思いますので、ぜひ最後まで読んでみて、良いと思ったらLGTMして頂ければと思います！

それでは早速、解説に移ろうと思います。
<br>
<br>

## About Key
「そもそもキーて何？」

キーとは、RDB(リレーショナルデータベース)と言う、エクセルのような形をしたテーブルを並べたデータベースにおいて、カラム(テーブルの縦列)に制約を掛ける設定の事です。例えば

「同じ値で重複したく無い！」
「他のテーブルのカラムを参照したい！」

などの時に利用する設定の事です。
<br>
<br>

## Primary Key
恐らくどの教材やカリキュラムでも、まず最初に学習するのが、この `Primary Key(プライマリーキー)` と呼ばれるキーです。
特徴としては以下の通り。

<ul>
  <li>主キーとも呼ばれる。</li>
  <li>一意性(重複しない値)を持たせる。</li>
  <li>基本的にはテーブル内で1つだけ設定可能。</li>
  <li>NOT NULL制約(NULL値を拒否する制約)が自動で付与。</li>
  <li>他のテーブルに置いて、外部キーとして設定することが多い。</li>
  <li>インデックスと呼ばれる情報が、自動的に作成される為、テーブルを素早く検索可能。</li>
</ul>
<br>

クエリでテーブル作成時に `Primary Key` をカラムに付与する際は、以下のように記述します。

```sql
-- テーブル作成
CREATE TABLE users
	(
		id INT(5),
        name VARCHAR(255),
        email VARCHAR(255),
        age INT(3),
        PAIMARY KEY(id)
    );

-- またはこちらでもOK
CREATE TABLE users
	(
		id INT(5) PAIMARY KEY,
        name VARCHAR(255),
        email VARCHAR(255),
        age INT(3),
    );
```
使用する場面としては、上記のようにテーブル内に `idカラム` を持たせ、**レコード(テーブルの横列)に一意性を持たせたい時**などです。
<br>
<br>

## Foreign Key
次に、頻繁に使用されるキーは、`Foreign Key(フォーリンキー)` と呼ばれるキーです。
特徴としては以下の通り。

<ul>
  <li>外部キーとも呼ばれる。</li>
  <li>アソシエーションを組むキー。(テーブル同士に関係性を持たせる)</li>
  <li>他のテーブル内で `Primary key` に設定されているカラムを使用して、テーブル同士にアソシエーションを組む。</li>
</ul>
<br>

クエリでテーブル作成時に `Foreign Key` をカラムに付与する際は、以下のように記述します。

```sql
-- テーブル作成
CREATE TABLE orders
	(
		id INT(10),
        user_id INT,
        amount INT(20),
        price INT(20),
        PRIMARY KEY(id),
        FOREIGN KEY(user_id) REFERENCES users(id)
    );
```
`REFERENCES` の後に記述されているのは、他のテーブルの、どのカラムとアソシエーションを組むか？と言う情報です。上記の場合、`usersテーブル` の `idカラム` とアソシエーションを組むと言う意味になります。

使用する場面は、`正規化` と言う**テーブルの分割を行う際**に利用されます。
<br>
<br>

## Unique Key
次に、使用することの多いキーが、`Unique Key(ユニークキー)` と呼ばれるキーです。
特徴はこちら。

<ul>
  <li>重複した値を拒否する。</li>
  <li>テーブル内で複数設定が可能。</li>
  <li>インデックスとしても利用できる。</li>
</ul>

`Primary Key` と似ているのですが、大きな違いは**複数のカラムで設定可能**と言う点です。
<br>

クエリでテーブル作成時に `Unique Key` をカラムに付与する際は、以下のように記述します。

```sql
-- テーブル作成
CREATE TABLE users
	(
		id INT(3) AUTO_INCREMENT,
        name VARCHAR(255),
        email VARCHAR(255),
        age INT(3),
        PRIMARY KEY(id),
        UNIQUE KEY(email)
    );
```
使用する場面は、上記のように、**ログインIDなど**にも使用されることの多い、`emailカラム` などになります。
<br>
<br>

## その他（＋２選)
厳密言えば、キーとは異なるのですが、ここからは他のキーと一緒に、よく利用されるカラムの設定について、解説していきます。
<br>

### Auto increment
`Auto increment(オートインクリメント)` とは、自動でカラムに1から数値を、挿入してくれる設定になります。主に `Primary Key` と一緒によく使用されることの多い設定です。

クエリでテーブル作成時に `Auto increment` をカラムに付与する際は、以下のように記述します。

```sql
-- テーブル作成
CREATE TABLE users
	(
		id INT(3) AUTO_INCREMENT,
        name VARCHAR(255),
        email VARCHAR(255),
        age INT(3),
        PRIMARY KEY(id),
        UNIQUE KEY(email)
    );
```
<br>
<br>

### Not null
`Not null(ノットヌル)` とは、カラムに `NULL値` が入らないようにする設定です。

データベース設計において、この `NULL値` が入らないようにする設計は、エラーや障害の発生を未然に防止すると言う観点から、重要な役割を担っています。そのため、`Primary Key` では自動で付与されるのですが、他のカラムについても、ほとんどこの `Not null` 設定を行います。
<br>

クエリでテーブル作成時に `Not null` をカラムに付与する際は、以下のように記述します。

```sql
CREATE TABLE products
	(
		id INT(10),
        category VARCHAR(255) NOT NULL,
        price INT(20) NOT NULL DEFAULT 0,
        PRIMARY KEY(id)
    );
```
<br>
<br>

## まとめ
もう一度全体をまとめると、以下のようになります。

<ul>
  <li>
    Primary key<ul>
      <li>一意性を持たせるキー。</li>
    </ul>
  </li>
  <li>
    Foreign key<ul>
      <li>テーブル同士のアソシエーションを組むキー。</li>
    </ul>
  </li>
  <li>
    Unique key<ul>
      <li>重複した値を拒否するキー。</li>
    </ul>
  </li>
  <li>
    Auto increment<ul>
      <li>自動でレコードに数値を割り振る設定。</li>
    </ul>
  </li>
  <li>
    Not null<ul>
      <li>NULL値が入らないようにする設定。</li>
    </ul>
  </li>
</ul>

他にもキーの種類はありますが、最初に抑えた方が良いのは、この５つになります。ポートフォリオ作成時にはもちろん、実務でも役立つ可能性は高いと思われますので、ぜひ抑えておきましょう！

最後まで読んでいただき、ありがとうございました！
<br>
<br>
<br>

筆者：yuki｜IT業界のリアルな転職事情など発信｜元トップ営業マン(訪販)→未経験からエンジニア転職へ
Qiita：https://qiita.com/yuki4839
Twitter：https://twitter.com/yukifullstack