巡礼サイト制作 mission9
今回は掲示板テーブルのスキーマについて考えます。 発言に付随する全情報を横一列に並べただけのテーブル1つで済ますことも可能ですが、パフォーマンスとデータサイズについて考慮しておきたいと思います。 レスポンスを重視したいのは、タイトル一覧のページ送りです。そのためタイトル一覧を表示するのに必要最小限のデータだけをカラムにしたテーブルを作りました。bbs_title_dev テーブルです。 bbs_title_dev id parent_id title username userinfo_id body_id tt_entry tt_last type INT INT VARCHAR(80) VARCHAR(40) INT INT DATETIME DATETIME prop PKauto_inc NOT NULL NOT NULL NOT NULL NOT NULL NOT NULL idは自動採番で主キー。parent_idは親発言id。title、usernameは名前の通り。大方未入力になるであろうURLとMailは、別テーブルに切り分けました。URLとMailの両項目が未入力ならuserinfo_idはNULLになります。 bbs_userinfo_dev id username url mail type INT VARCHAR(40) TINYTEXT VARCHAR(40) prop PKauto_inc NOT NULL 別テーブルにしたからといって、事前にメンバー登録するタイプになったわけではありません。発言登録毎にusernameで検索し、入力データが完全に一致すれば当該レコードのidを使いまわします。つまり、別テーブルであることが、利用者の側からは分からない仕組みです。body_id は、bbs_title_devと1対1になるbbs_body_devテーブルの外部キーです。分ける意味があるのか実は不明です。今回PHPにmbstringを入れて、内部コードとMySQLのデフォルトエンコードを共にUTF-8に統一させましたので、なおさらです。 bbs_body_dev id body tt_correct type INT TEXT DATETIME prop PKauto_inc NOT NULL NOT NULL tt_entry は発言の初回登録日時。tt_last は当該スレッドの最終更新日時。コメントがつけば、parent_idがNULLになる元発言まで辿って、元発言のtt_lastをその日時に更新しておきます。これでスレッド一覧は where parent_id == NULL order by tt_last DESC で取得しようという狙いです。発言者が自らの発言を修正した場合はbbs_body_dev.tt_correctを更新し、その場合もbbs_title_dev.tt_lastを更新します。MySQLのデータ型の補足。urlのTINYTEXT型は、最長255Byteの文字列を格納できます。bodyのTEXT型は最長65535Byteです。単純に一文字2Byteとして32000字は入るから十分でしょう。各テーブル名の末尾(dev)が掲示板のKey文字列になります。同一サイトで複数の掲示板を設置して使うケースにも対応します。〃 /〃〃,,','',´`, '.