【まとめ】RDB(リレーショナルデータベース)における各種制約について

Web

 

RDSに設定できる各種制約について、備忘も兼ねてまとめてみます。


 

UNIQUE制約とは

 

UNIQUE制約について、様々な記事を調べてみました。

データベースの制約の1つに一意制約(UNIQUE)があり、一意制約(UNIQUE)を設定した列では、重複したデータを追加することができない。

https://www.purin-it.com/db-unique-behavior

UNIQUE制約は「重複した値を許さないフィールド」のことです。

https://sona.hateblo.jp/entry/2018/03/21/212959

 

つまり、UNIQUE制約とは、あるフィールド内で重複を許さない制約のことです。

 

主キー制約

UNIQUE制約との違いを一緒に説明されることが多い主キー制約についても調べてみました。

主キー制約もUNIQUE制約と同様に、あるフィールド内で重複を許さない制約であるが、違いとして主に下記の2つがあります。

  • Table内で行データを識別するために1つだけ設定できる
  • NULLが許容されない

外部キー制約

あるテーブル(子テーブル)の列に外部キー制約を設定すると、参照先のテーブル(親テーブル)の指定された列に記録された値しか書き込むことができないようになります。

また、参照先の列に対しても、子テーブルから参照されている値は削除することができない制約が設けられます。

NOTNULL制約

データを追加・更新する際に課すことができる制約の一つで、指定した列には必ず値を設定しなければならないとするものです。

値が未設定の状態(NULL)であることは許されません。

 

インデックス

まず、インデックスの概念を確認するために、MySQLのリファレンスマニュアルを確認してみます。

 

インデックスは特定のカラム値のある行をすばやく見つけるために使用されます。 インデックスがないと、MySQL は関連する行を見つけるために、先頭行から始めてテーブル全体を読み取る必要があります。 テーブルが大きいほど、このコストが大きくなります。 テーブルに問題のカラムのインデックスが含まれている場合、MySQL はすべてのデータを調べる必要なく、データファイルの途中のシークする位置をすばやく特定できます。 これはすべての行を順次読み取るよりはるかに高速です。

https://dev.mysql.com/doc/refman/8.0/ja/mysql-indexes.html

 

また、特徴も調べましたので、下記に示します。

  • インデックスを付けるカラムの候補は、where, order by, group by で指定されるカラム
  • 主キーには元々インデックスが自動的に付いている
  • 1テーブルにつき、1つしか使われない。
  • 複合インデックスはカラム1つ目、2つ目..の順で使われる。(2つ目以降を最初の条件に使うことはできない。)
  • インデックスを使うと対象カラムの検索が速くなる

 

インデックスには幾つか種類があり、今回は代表的な「B+木インデックス」及び「ハッシュインデックス」について記載します。

 

B+木インデックス

木構造を使ってデータ管理する方式で、RDBSで最も一般的に使用されています。下記のような特徴があります。

  • 木構造の深さが一定のため、どのようなキー値でも探索コストが大きく変わらない
  • 大量のデータに対する捜査であっても、ある程度の速度が期待できる
  • インデックスノードはソートされた状態になっているので整列処理が高速

ハッシュインデックス

ハッシュ関数を使用してキー値とレコードの格納場所を直接関連づける方式です。

格納場所をキー値から一意に検索可能のため、B+木インデックスよりも高速にアクセスが可能です。ただし、範囲検索やキー値を順番に読み込んで処理を行う用途には使用できない。

 

コメント