初めてのデータベース設計

第5回 制約とインデックス

この記事を読むのに必要な時間:およそ 2 分

主キー制約

主キー制約は,一意性制約と非NULL制約を組み合わせたものであり,列のデータが重複せず,NULL値ではないことを保証する制約です。テーブルにおいて主キーとなる列に対して定義します。

たとえば,⁠製品(products)⁠テーブルでは「製品番号(id)⁠列が主キーとなるため,これまで一意性制約と非NULL制約を定義していましたが,以下のように主キー制約として定義することができます。

  CREATE TABLE products (
      id integer PRIMARY KEY,
      name text NOT NULL,
      price integer NOT NULL CHECK (price > 0)
  );

外部キー制約

外部キー制約は,列のデータが他のテーブルのデータを参照する際にそれらのデータが一致していることを保証する制約です。テーブルにおいて外部キーとなる列に対して定義します。

外部キー制約を定義することにより,参照先のテーブルに存在しないデータを格納したり,参照されているデータを参照先のテーブルから削除したりする際,どのように振る舞うかといったことを指定することができます。標準ではそのような場合にはエラーとなります。

たとえば,⁠注文明細(order_details)⁠テーブルでは,⁠注文(orders)⁠テーブルの「注文番号(id)⁠列と「製品(products)⁠テーブルの「製品番号(id)⁠列をそれぞれ外部キーとして参照しています。これらの列は以下のように外部キー制約として定義することができます。

  CREATE TABLE order_details (
      order_id integer REFERENCES order (id),
      product_id integer REFERENCES product (id),
      quantity integer CHECK (quantity > 0),
      PRIMARY KEY (order_id, product_id)
  );

インデックスとは

インデックスとは,データベースの性能を向上させる方法の1つです。インデックスを日本語に直訳すると索引となります。インデックスによって検索の性能が向上することは,書籍から目的のページを探す際に最初から1ページずつ探していくより索引から探したほうがすばやく見付けることができる,ということを思い出せばわかりやすいと思います。

多くのRDBMSでは,主キー制約や一意性制約が定義された列には自動的にインデックスが定義されます。それ以外の列にも,検索や結合の条件としてよく使用されるものにインデックスを定義することによって,検索の性能を向上させることができます。

ただし,インデックスは単純に定義すればいいというものではありません。それは,インデックスによって検索の性能を向上させることができる反面,データを更新する際にはインデックスも更新する必要があり,更新の性能が低下するためです。

どの列に対してインデックスを定義するべきかということは,どのような問い合わせがどのくらいの頻度で実行されるかということによって変化するため,アプリケーションの設計が完了してからインデックスを追加したとしても遅くはありません。


本特集では,データベース設計の基本についてキーワードをかい摘んで説明してきました。多少説明が駆け足になってしまいましたが,全体的な流れについては理解してもらえたと思います。

しかし,データベース設計はそれだけで一冊の書籍になってしまうほどいろいろな手法があり,非常に奥の深いものです。本特集をきっかけにそういった書籍を手に取ってもらい,データベース設計に関する知識や技術を深めてもらえるといいと思います。

著者プロフィール

佐藤友章(さとうともあき)

SRA OSS, Inc. 日本支社 チーフエンジニア。入社以来,オープンソースデータベースPostgreSQLに関する業務に携わり,現在,PostgreSQLのサポートやコンサルティング,トレーニングの講師を務める。

URLhttp://www.sraoss.co.jp/

コメント

コメントの記入