職場実習13日目

今日は昨日の作業の続きを行った。

ファイルのアップロードの不具合

昨日に引き続き、ファイルがアップロードできない原因を探っているが、まだ見付からない。
サーバーはApatch2.0を使っているが、設定ファイルを読んでもそれらしき場所は見付からず、引き続き原因を探っていこうと思う。

DBの修正

DB仕様を考える時に、親グループ(シリーズ・本・部・章)に属する子グループ(本・部・章・節(SS))に、順番がある事を見落としていたため、以前作っておいたサークルと所属メンバーの関係情報を扱うテーブルを参考に、親グループに属する子グループの順番情報を保持するテーブルを急遽作り、それに従い、他のテーブルとデータを連動させた。グループの親子関係情報は既に別のテーブル内で定義していたので、それを消すわけにはいかず、このような形になった。

ルールシステム

PostgreSQLには、"CREATE RULE"という文があり、テーブルへの操作(INSERT, UPDATE, DELETE)を行う際、条件を満たせば、連動して別の操作を行えるというものである。PostgreSQL独自の拡張命令らしいので、標準SQLには無いとの事。
詳細は、PostgreSQL 8.1.0文書「第34章ルールシステム」に詳しく載っている。(文書のバージョンが古くなっているが、現在使っているバージョンが8.1.1のため、8.4で搭載された機能が使えないのが分かり、混乱を避けるために使用しているバージョンにできるだけ近い文書を選んだ。)
これでルールを定義する事で、あるテーブルのレコードを削除した時、それを参照する別のテーブルの外部キーの値をわざわざ書き換えなくても、1回の操作で自動的にやってくれる。
そして、グループ情報テーブルの中の、親グループIDを変更した場合、それまでの親グループとの関係は消滅し、別の親グループとの関係が生まれるため、順番情報のテーブルも書き換える必要がある。ここでルールを使えば、それらの作業を同時に行ってくれる。問い合わせは1回で済む。

トランザクション

それでも、どうしても複数回操作しなければならない時がある。
ビューを使えばデータの参照に要する問い合わせは1回で済むが、複数のテーブルデータの操作をビューから1回で行う事はできないし、ルールを使うのにも限界がある。
プログラム上から1つのトランザクションとしてまとめて扱いたい操作もあるので、Perl DBI上からトランザクションを扱う方法を調べた。

DBの後戻り作業

ここで、グループの親子関係は別のテーブルをわざわざ作らなくても、グループ情報とSS情報に列(親グループ内での順番)を追加するだけでいい事に気が付き、早速修正を行った。それに従い、上で書いたテーブル書き換えルールの一部を削除した。
結果、テーブル同士の関係が前よりスッキリした。サークルとサークルメンバーの関係は多対多であるのに対し、親グループと子グループの関係は一対多なので、わざわざ関係情報テーブルを作る必要など無かったのである。なぜもっと早く気が付かなかったのだろう。
とにかく、これで目次が作れる。

ページレイアウトの吟味

ページ全体の構成や、ジャンル・サークルなどのリスト表示を行うにあたり、書式はスタイルシートで全て管理している。
今日は、ページの可読性を上げるため、スタイルシートリファレンス(目的別)を参考にして、見やすいレイアウトに改良した。また、これから追加する部分も、最初から見やすいレイアウトで作る予定。