データベースの設計と作成


データベースの設計と作成

データベースの論理設計

論理設計を行って ER 図の作成します。この過程で以下を行います

まずは Visio2000 で「ファイル->図面の種類の選択->データベース->Martin ERD」を選択します

  

自動で Martin ERD のステンシルが開きますが、追加で以下を使えるようにしておきます。

エンティティシェイプをドラッグ&ドロップしてクラス図をみてエンティティクラスのフィー ルドをカラムとして追加していきます。

正規化前のER図

正規化と外部キーの作成

データベースを正規化します。正規化についての説明は このページが分かりやすいです。

第一正規形

繰り返し項目はありませんので不要です。

第二正規形

第三正規形

正規化後のER図

データベースの物理設計

数値の範囲、文字列の長さなどを考慮して物理設計をおこないます。

となるはずですが今回はあまりにも簡単なテーブルなので主キーと外部キー の定義のみを設定して各カラムの属性は Enterprise Manager から直接作成します。

物理設計後のER図

データベースの作成

「スタート->プログラム->Microsoft SQL Server->Enterprise Manager」で起動でき る Enterprise Manager を使用してデータベースを作成します。大雑把に以下の順番で すすめていきます。

データベースの作成

(local)(Windows NT)のデータベースで右ボタンを押して「新規データベース」を 選択します。

  

全般名前lab (データベース名)(任意)
データファイル場所D:\lab\database_Data.mdf
ファイルの自動拡張チェック(デフォルト)
ファイル拡張10パーセントごと(デフォルト)
ファイルの最大サイズファイルを無制限に拡張(デフォルト)
トランザクションログ場所D:\lab\database_Log.ldf
ファイルの自動拡張チェック(デフォルト)
ファイル拡張10パーセントごと(デフォルト)
ファイルの最大サイズファイルを無制限に拡張(デフォルト)

ユーザデータベースのデータファイルの場所は C: に置かない方がいいでしょう。 データベースは日々増加していくものなのである日突然 C: がいっぱいになって いるとなにがおこるか分からないからです。 パフォーマンス的にもデータは別ディスクにおいた方が いいのですが VMWare でサーバを構築しているのなら関係ないです。

ユーザの作成

「セキュリティ->ログイン」でユーザを作成します。

  

全般名前labdb
認証SQL Server 認証
パスワードを設定
データベースlab
言語<規定値>
サーバーロールなし
データベースアクセスデータベースlab
データベースロールpublic/db_datareader/db_datawriter

Windows 認証と SQL Server 認証
Windows 認証と SQL Server 認証があります。どちらも使い勝手はそれほど 違いませんが、わたしは Sybase を使っていた経験から Windows 認証にそ れほど魅力を感じなかったため SQL Server 認証を使っています。クライアント サーバシステムでそれぞれにユーザアカウント発行する場合ならともかく Webシステムでアプリケーションサーバからコネクションプーリングを経由 して接続するのならどちらも使い勝手は変わらないとおもいます。

サーバロール
このユーザではデータベースの作成などは行いませんのでサーバロールはつけません

データベースロール

参照のみと更新も可能なユーザを分けることもありますがそれほど大きな システムではないため常に更新可能なユーザでアクセスすることにします。 後の権限の付与を省略するために db_datareader と db_datawriter を 付与しておきます。これでこのデータベース内のすべてのユーザテーブル にselect/update/delete の権限があることになります。もちろん、ロール は public だけにして個別のテーブルに権限を付与してもかまいません。

db_datareaderデータベース内のすべてのユーザー テーブルのデータを表示します。
db_datawriterデータベース内のすべてのユーザー テーブルでデータの追加、変更、または削除を行います。

テーブルの作成

「データベース->lab->テーブル」でテーブルを作成します。

  

物理設計を元に物理的な大きさを決めてテーブルを作成します。基本的に正規化 で発生した ID カラムは int 型を割り当てます。文字列型は適切な大きさ を割り当てます。

  

文字列カラムの大きさ
Webアプリの場合、文字列の長さは TEXT タグの maxlength 属性や JavaScript で行いますが、いずれも漢字が 1 文字として数えるので DB へ insert する段階でカラムの大きさを超えてしまっていることがあります。今回は Struts の Validator を使う予定なのでこのあたりに特別な対処を行うのは Validator を 使う価値が薄れてしまいます。日本語を入力される可能性のあるカラムはあらかじ め実際の2倍の大きさを用意して対処します。

例)

<html:text name="ent" property="name" size="2" maxlength="2">

このフィールドには SJIS や日本語EUC で"漢字"というで 4 バイトの文字列が含めること ができてしまいます。このため

NAME   CHARACTER(2)

ではなく

NAME   CHARACTER(4)

とする必要があります。もちろん 専用の Validator コードを書けばバイト単位でチェックすることは可能です。

  

日付・タイムスタンプ
日付やタイムスタンプは DBMS 間での差異がでやすいようにおもえます。 ここでは一番ポータブルな CHAR で表現してしています。 SQLServer 2000 では timestamp 型はひとつのテーブルで 1 つだけ持つことが できますので足らないという理由でもあります。

同様にして division テーブルと enroll テーブルを作成します。

  

  

インデックスの作成

employ テーブルのメールアドレスは重複を許しませんので UNIQUE INDEX を張ります。

デザインビューをあけて右ボタン->インデックス/キーを選択します

  

SQL Server 2000 では主キーはただの UNIQUE INDEX ですのでここの画面で PK_employ というインデックスが存在しています。新規作成ボタンを押してから 列名を選択し UNIQUE の作成にチェックを入れます。

  

外部参照制約の作成

ER 図を元に外部参照制約を作成します。

empoy テーブルの divisionid は divisionid に依存していますので employ テーブル のデザインビューをあけて右ボタン->インデックス/キーを選択します

employ.divisionid -> division.divisionid

  

新規作成を押してから主キーに依存先を記述します。

  

同様に以下のリレーションシップも作成します

enroll.empno -> employ.empno
enroll.courseid -> course.courseid

ふぅ〜、やっとできました。

関連リンク



Return to TOP