チームラボ オンラインスキルアップ課題

STEP2-9.データベースを設計してみる

前回の画面仕様書を元に、作成するサイトに必要となるデータベースを設計してみましょう。ここでは非常に簡単に説明します。詳細の説明は初めてのデータベース設計|技術評論社などを参照してください。

データベース設計には概念設計、論理設計、物理設計の3つのフェーズがあります。

概念設計

まずはデータベースで何を管理するかということを明確にするために概念モデルを作成します。

エンティティ抽出

エンティティとはデータベースで管理する実体です。例として[つぶやき画面]からは以下のようなエンティティと属性が抽出できます。

  • つぶやき:ユーザ名、本文、日時
  • ユーザ:ユーザ名、投稿数、フォロー数、フォロワー数

他の画面からもエンティティを抽出し、過不足がないか確認します。

リレーションシップ設定

各エンティティの関係を設定します。リレーションシップには一対一、一対多、多対多の3種類があります。今回の場合、ユーザとつぶやきは一対多の関係、ユーザ同士のフォローは多対多の関係となります。

論理設計

概念設計で作成した概念モデルをリレーショナルデータベースで扱える形式(リレーショナルモデル、つまり表)に変換する作業です。まずは多対多の関係はテーブルで表現できないため、中間テーブルを作成することによって2つの一対多の関係に分割して取り除きます。

多対多の関係が取り除かれたらテーブルに変換することができます。しかし、そのままではリレーショナルモデルとして非常に良くない形であるため正規化によって修正します。

第1正規化

複数の値が含まれる列を別のテーブルに分割する作業です。

第2,第3正規化

ある項目が決まると一意に定まる項目を別のテーブルに分割する作業です。これは、1つのデータはただ1回だけ書かれるべきであるというリレーショナルデータベースの原則に則っています。例えば上記のつぶやきテーブルでは、ユーザIDが分かるとユーザ名は一意に定まるためユーザ名は必要ありません。

物理設計

作成したリレーショナルモデルから実際にテーブルを作成します。使用できるデータ型や制約はデータベースシステムごとに異なるため、MySQLについて説明します。

データ型

各列のデータ型を適切に決定します。主に以下のような型があります。もっと詳しい内容や、これら以外の型についてはMySQL 5.1 データタイプを参照してください。

  • INT: 整数型
  • DOUBLE: 浮動小数点数型
  • TIMESTAMP: 日付・時刻型、ON UPDATE CURRENT_TIMESTAMP属性などが使用できる。
  • CHAR: 固定長文字列型、長さを指定する必要がある。必ず同じ長さになるハッシュ値などを格納する際に使用。
  • VARCHAR: 可変長文字列型、最大長を指定する必要がある。長さを制限する際に使用。
  • TEXT: 可変長文字列型
  • BINARY, VARBINARY, BLOB: バイナリ型
  • ENUM, SET: 文字列定数型、作成時に格納できる文字列定数のリストを指定。SETは複数個格納できる。

制約

格納できるデータを制限します。制約は最大限定義しておくべきです。主に以下のような制約があります。

  • NOT NULL: NULLの入力を禁止。
  • UNIQUE: 他の行との重複を禁止。
  • PRIMARY KEY: 主キーとする。NOT NULL + UNIQUE
  • FOREIGN KEY: 他の表に存在しない値を禁止。
  • CHECK: 条件式によって制限。ただしMySQLではサポートされていない。

[課題]実際に設計しよう
前回の画面仕様書を元に、作成するサイトに必要となるデータベースを設計してみましょう。