全体の設計
==============

要求分析に基づいて、このブログアプリケーションの永続データを保存するために以下のデータベーステーブルを使うことにします。

 * `tbl_user` はユーザ名、パスワードを含むユーザ情報を格納します。
 * `tbl_post` は記事情報を格納します。主に以下のカラムから成ります:
	 - `title`: 必須、記事のタイトル
	 - `content`: 必須、[Markdown フォーマット](http://daringfireball.net/projects/markdown/syntax) で記述された記事の本文
	 - `status`: 必須、記事のステータス(公開状態)。以下のいずれかの値をとる
		 * 1, 記事は下書きで、公開されていない
		 * 2, 記事は公開されている
		 * 3, 記事は公開期間を過ぎ、記事リストには現れない(しかし個別のアクセスによる表示は可能)
	 - `tags`: オプション、記事をカテゴリ化するためのカンマ区切りの単語のリスト
 * `tbl_comment` 記事へのコメント情報を格納します。各コメントは一つの記事と関連付けられ、主に以下のカラムから成ります:
	 - `author`: 必須、コメント作成者名
	 - `email`: 必須、コメント作成者のメールアドレス
	 - `url`: オプション、コメント作成者のウェブサイトの URL
	 - `content`: 必須、プレーンテキストで記述されたコメントの内容
	 - `status`: 必須、コメントのステータス(公開状態)。コメントが承認された(値は2)か、未承認(値は1)かを示す
 * `tbl_tag` は、タグクラウド機能を実装するために必要な、記事のタグ頻度情報を格納します。このテーブルは主に以下のカラムから成ります:
	 - `name`: 必須、ユニークなタグ名
	 - `frequency`: 必須、タグが記事に出現する回数
 * `tbl_lookup` は汎用のルックアップ情報を格納します。これは本質的には整数値とテキストのマッピングです。
前者はコード中のデータ表現であり、後者は対応するエンドユーザのための表現です。
例えば、整数値1を記事が下書きであることを表すものとして使用しますが、エンドユーザに表示するテキストは `下書き` となります。このテーブルは主に以下のカラムから成ります:
	 - `name`: データ項目のテキスト表現(エンドユーザに向けて表示)
	 - `code`: データ項目の整数値表現
	 - `type`: データ項目の型
	 - `position`: 同じ型のデータ項目の中での相対的な表示順序


以下の ER 図が上記のテーブルのテーブル構造とリレーションをあらわします。

![ブログデータベースの ER 図](schema.png)

上記 ER 図に対応する完全な SQL 文が [ブログデモ](http://www.yiiframework.com/demos/blog/) に付属しています。
Yii のインストールディレクトリの中では `/wwwroot/yii/demos/blog/protected/data/schema.sqlite.sql` というファイルにあります。

> Info|情報: テーブル名とカラム名は全て小文字で命名します。これは、異る DBMS はしばしば異るケースセンシティビティを持つからであり、それによるトラブルを避けたいためです。
>
> 同時に、全てのテーブルに `tbl_` というプレフィクスを付けています。これには二つの目的があります。
第一に、同じデータベースで他のテーブルと共存する必要があるときには、プレフィクスでテーブルに名前空間を導入することが解決策となります。
これは共用ホスティング環境で、複数のアプリケーションが単一のデータベースを使用する場合にしばしば見られます。
第二に、プレフィクスを用いれば DBMS の予約語と同じテーブル名を使う可能性が低くなります。


ブログアプリケーションの開発を、以下のマイルストーンに分割します。

 * マイルストーン 1: ブログシステムのプロトタイプを作成します。必要な機能のほとんどを含みます。
 * マイルストーン 2: 記事の投稿機能を完成させます。記事の作成、リスト表示、記事の表示、更新、削除を含みます。
 * マイルストーン 3: コメント管理機能を完成させます。コメントの作成、リスト表示、承認、更新、削除を含みます。
 * マイルストーン 4: ポートレットを実装します。ユーザメニュー、ログイン、タグクラウド、最近のコメントを含みます。
 * マイルストーン 5: 最終調整と配備を行います。

<div class="revision">$Id$</div>
