データベース設計演習1

(2012.12 更新)

ここまでで学んだ概念をもとに、データベースの設計演習をこれから講義終了まで(残り4回)行っていく。

最終的にデータベースが仕上がらなかったもの(未完成)には単位は出ないのでそのつもりで。
(未完成のものに部分点を与えて合格とすることはない)

※ 100%の完璧な状態でなくても、試作品としてテスト運用できる段階までは完成させること!


開発手順

開発モデル:
 ソフトウェアの開発手法には様々なモデルがあるが、今回は プロトタイピング という手法で開発を行う。
 プロトタイプとは試作品のことで、プロトタイピングモデルでは、早期にユーザに動作可能な開発システム(試作品)を確認してもらい、システムの要件の不足を早い段階で把握する。これにより大きなコストを要する開発終盤での設計変更を避けることができる。
(ちなみに、他の開発モデルとしてはウォーターフォールモデルやスパイラルモデル、アジャイルソフトウェア開発などがある。関連の講義参照。)

プロトタイピングによるシステムの開発工程:

  1. 要件定義: 開発するシステムに必用な要件(機能)を決める。
    要件を、文章や図にまとめて残しておく。
  2. システム設計: システム開発に必要な事項を決める。
    データベースの設計では、テーブルの設計とリレーション図の作成を行う。
  3. 開発: 第1段階の開発目標として、システムのプロトタイプ(試作品)を設計する。
    プロトタイプには、開発システムの必要最小限の機能を実装する。
  4. レビュー: プロトタイプの動作テスト(試験運用)。
    実際にデータベースを使用するユーザに利用してもらい、プロトタイプに追加・変更の必要な点を見つける。
  5. フィードバック: 4.に基づきプロトタイプを改良。
  6. 以後、十分な結果が得られるまで 1.-4.を繰り返す。
    繰り返しにより、開発システムを成熟させ完成に近づけて行く(問題点・不具合などを減らす)。

今回と次回以降の講義の流れ(4回分の内容)

  1. 設計演習1

    課題1 <要件定義>
     基本的な仕様を決める。

     要求分析: 自分が作成するデータベースに必要な機能を見つけ出し、確認する。
      データベースで業務のどの部分を処理するか決める。
      データベースの利用目的と、利用方法・状況の確認。

     要件定義: どのような情報を、どのような形式でデータベースに格納し、どのようにデータベースから取り出す必要があるかを <書面> にまとめる。

    課題2 <内部設計>
     プロトタイプの概念スキーマ設計
      ・プロトタイプのテーブル設計(テーブルのデータ定義域(ドメインと正規化)
      ・テーブルのリレーション設定(等結合・内部結合・外部結合)

     プロトタイプの外部スキーマ(ビュー)設計
      ・プロトタイプのクエリー設計

  2. 設計演習2
    <外部設計>
     ・レコード入用・表示用フォームの設計
     ・レコード印刷用レポートの設計
  3. 設計演習3
    <運用テスト>
    データベースを試験的に利用してみる。
    ・何件か試験用データを入力
    ・自分の設計したデータベースを他の受講生に利用してもらい、感想などを調査する。
  4. 設計演習4
    プロトタイプの運用をもとに、仕様の不足部分・設計バグ等を調査し改良を行う。
    データ入力などのユーザインタフェース部分に、データの一貫性を保つ為のエラーチェックなどを付け加える。
     重複データの入力拒否・データ削除における不整合の回避・誤った定義域の値のデータに対する処理 など。

今回は、上記の1〜4のうち、最初の 要件定義から始める。


本日の演習内容:

設計演習1

例題 「科目履修データベース」 の開発手順を参考に、各自で

 ■ 要件定義書 (ワープロで作成)

 ■ 内部設計1 (Access または、 XAMPP でテーブルと、リレーションを作成)

 ■ 内部設計2 (クエリーの作成)

について作業を行う。

※データベースの開発に利用するDBMSは、MS-Access でも XAMPPのMySQL でも、どちらでもOK。
※ただし、MySQLではデータの登録・表示・修正・検索の為のWebページをPHPで作成する知識を要する。
※多くの受講生は MS-Accessで課題を制作することになると予想 。


■課題1 要件定義書の作成

<要件分析>
自分が企画するデータベースの「開発システム名」・「利用者」・「要件定義」についてワープロなるべく具体的に書いておく。
タイトルはキャッチフレーズのような言葉遊び的な意味不明のものは用いないこと。出来るだけ作成対象が具体的にイメージ出来るようにしておく。
コツとしては、(固有)名詞をいくつかタイトルに混ぜてみると具体的になる。

例) 名古屋文理大学|学生用駐車場|予約システム

システムの名称が具体性であれば、どんな記録を取ればよいかの見当がついて、
システムの要件も具体的に見えてくる筈である。

この例では、 記録するのは「誰が、いつ駐車場を利用したいのか」を記録し、「駐車場の空きを確認」、「予約状況の表示」などがデータベースの処理として必要なことがイメージできる。

    ファイル名は「学籍番号(要件定義)」としてレポートフォルダに提出する。

例題: 要件定義の例

以下の形式を参考に、ワープロで要件定義を書いて提出する。

<要件定義>

開発システム名: 名古屋文理大学履修登録データベース

利用者: 名古屋文理大学教学課職員

要件:
○概要
 学生の科目の履修と成績をデータベースで管理したい。

 多数の受講生が複数の科目を履修する。
  その際、
 科目履修では、既修得科目の重複登録など履修不能科目が登録されない様にしたい。

 科目の履修には、学籍番号と、時間割表に記載の科目番号を用いる。
 
 履修した科目について、成績の管理を行い、取得単位数の合計が分かるようにしたい。

 学生の単位取得状況について、カリキュラムごとの平均取得単位を求めたい。

○入力項目と出力項目について

 履修登録に必要な入力項目と、利用者別の出力項目は以下とする。

 <入力項目>
  学生データ
   学籍番号 (7桁数字)
   名前 (全角文字10文字まで 苗字と名前は分けずに入力)

  科目データ
   科目名 (文字で入力)
   単位数 (数値で入力)

  時間割データ
   講義番号 (講義番号はデータベース側で自動設定)
   担当者 (文字で入力)
   科目名 (科目データの値を使用)

  履修データ
   学籍番号 (学生データの値を使用)
   講義番号 (時間割データの値を使用)
   成績 (優・良・可・不可 で入力)

 <出力項目>
  担当者別科目履修者表
   (講義番号ごとにまとめて表示)
   講義番号
   担当者
   科目名
   学籍番号
   名前

  学生別履修科目表
   (学籍番号ごとにまとめて表示)
   学籍番号
   名前
   科目名
   単位数
   成績

  学生別取得単位数合計表
   学籍番号
   名前
   取得単位合計

○データ管理上の留意点など
 ・学生データや科目データの重複登録は出来ないようにする
 ・1人の学生が同じ講義番号の科目を重複して履修登録できないようにする(再履修は別の講義番号の同一科目名の科目を履修することで記録)
 ・履修データで単位取得済みの科目を履修できないようにする
 ・データ入力画面では、なるべく入力の省力化を計る(キーボードからの入力を減らし、メニュー選択方式を利用する)
 ・成績表を印刷する際には、ディスプレイのコピーではなく印刷専用のレイアウトで印刷すること


■課題2 データベースの設計

<内部設計>

上記の例題について、データベースをAccessで作成する際の、内部設計部分について例を示す。

Accessを起動→新しいデータベースを作成→空のデータベース→
 保存場所「ユーザホーム(マイドキュメント)」→ファイル名「学籍番号(試作品)」

テーブルの設計

テーブル新規作成→デザインビュー

(テーブル名は、フィールドの設計終了後、テーブルを閉じるときに入力する)

テーブル名 フィールド名と(データ型)データ型の詳細については各自で決定 主キー
学生テーブル ■学籍番号(数値型・ フィールドサイズ:長整数型)
■名前(テキスト型)
例)学籍番号は以下の様に設定する
フィールドサイズ: 長整数型
値要求: はい
インデックス: はい(重複なし)
学籍番号
科目テーブル ■科目名(テキスト型)
■単位数(数値型)
科目名
時間割テーブル ■講義番号(オートナンバー型
■担当者名(テキスト型)
■科目名(テキスト型)
講義番号
履修テーブル ■学籍番号(数値型)
■講義番号(数値型
■成績(テキスト型)
学籍番号・講義番号
例)

Accessのデータ型について:

ヘルプ→Microsoft Accessヘルプ→キーワード→データ
で、内容をよく確認しておくこと。

例)上記テーブルでは以下を使用した。

型名 サイズ 内容
オートナンバー型 4バイト レコードを追加する度に自動的に重複しない値を記録
数値型(長整数型) 4バイト 32bit整数。約9桁の範囲の整数を記録可能
数値型(整数型) 2バイト 16bit整数。-32768〜+32767まで
テキスト型 255バイト 最大255バイトまで文字を記録可能

テーブルのリレーション設定(内部結合・外部結合)

ツール→リレーションシップ→(各テーブルを追加)

ドラッグ&ドロップでリレーションを設定。結合の向きを指定すること。

リレーションの向きについて:

リレーションの向きに注意すること!
<<矢印の向きの考え方>>

テーブルA    テーブルB
 フィールドX → フィールドX

の向きにリレーションを設定すると、
 「AのXについて関連する情報は、BでXを調べると分かる」
状態になる。

レコードの対応関係から考える

一対多」  を 「A→B」 で表現する。 上の例では、
■科目テーブルの科目名「データベース演習1つに対して時間割テーブルの科目名は複数の担当者や開講曜日があり得るので、「科目→時間割」となる。
■時間割テーブルの講義番号1つに対して、複数の学生が履修しえるので、「時間割→履修」となる。
■学生テーブルの学籍番号1つに対して、複数の科目を履修しえるので、「学生→履修」となる。

テーブルの結合方法から考える

表Aに対して、表Bを結合して出来る表には3通りある。

上記のリレーションシップの図で、「A→B」となっている場合、AとBを結合すると、左外部結合LEFT JOINを行うことになる。

例)
時間割に載っていない科目が有ってもよい(開講しない場合など)。逆に科目にない講義は時間割に載せてはいけない。よって、科目テーブルに時間割テーブルを左外部結合することになる。
SELECT a.担当者名, a.科目名, b.単位数
FROM 科目テーブル as b LEFT JOIN 時間割テーブル as a ON b.科目名 = a.科目名;

科目名 担当者名
データベース演習 小橋
データベース 佐野
SQL入門

クエリー設計

○履修単位合計クエリ

SELECT 履修テーブル.学籍番号, Sum(科目テーブル.単位数) AS 単位数の合計
FROM (科目テーブル LEFT JOIN 時間割テーブル ON 科目テーブル.科目名 = 時間割テーブル.科目名) LEFT JOIN 履修テーブル ON 時間割テーブル.講義番号 = 履修テーブル.講義番号
GROUP BY 履修テーブル.学籍番号;

○取得単位合計クエリ

SELECT 履修テーブル.学籍番号, Sum(科目テーブル.単位数) AS 単位数の合計
FROM (科目テーブル LEFT JOIN 時間割テーブル ON 科目テーブル.科目名 = 時間割テーブル.科目名) LEFT JOIN 履修テーブル ON 時間割テーブル.講義番号 = 履修テーブル.講義番号
WHERE 履修テーブル.成績<>"不可"
GROUP BY 履修テーブル.学籍番号;

デザインビューで 単位取得合計クエリを作成する場合の例)
「Σボタン」 をおして、集計機能を有効にする必要がある。

上の2つのクエリーを内部結合で表現する場合、

FROM 履修テーブル, 時間割テーブル, 科目テーブル
WHERE
時間割テーブル.講義番号 = 履修テーブル.講義番号
AND
科目テーブル.科目名 = 時間割テーブル.科目名

と書いても良い。


テスト

作成したデータベースにテスト用のデータをいくつか入力し、クエリーの動作を確認する。入力データにはクエリーが正常に機能していることを確認可能なパターンを何通りか用いてチェックする。

テスト用データ例)
クエリー実行例)

課題2:(講義中に仕上がらない場合は宿題とする。次回は続きの作業を行う)

データベースを企画するにあたって、何を記録し、どう利用(表示や集計方法)するかを考えよう。
また、どんなデータベースを造ればよいのかさっぱりイメージできない人は、 まずは上記の例題のまねをしてみて、次に、自分の企画にアレンジしてみてはどうだろうか?
 ただし、 最終課題はあくまで自分で企画したデータベースを作成する である。

<内部設計>
自分が企画したデータベースについて、Access または、XAMPP でデータベースのテーブル(複数)、リレーション、クエリを作成する。


    ファイル名は「学籍番号(試作品)」としてレポートフォルダに提出する。


 XAMPPで課題を作成する受講生は、自分の利用しているXAMPPがインストールされているPCの番号を 講義担当者までメールで連絡すること。