[pgsql-jp: 37225] Re2: フィールドの値で選択する他のフィールドを変えられますか?

Tetsuya Abe tetsuya @ mitene.or.jp
2006年 6月 16日 (金) 23:10:20 JST


okkezさん、Yu Oasaさん、川上 雅志さん、中西渉さん

 ご回答、本当にありがとうございました。

第1正規化のできていないテーブルをお見せしたこと、恥ずかしくて
穴があったら入りたい気持ちです。

 実をいいますと、昔データベース(DOS版のUnify)を少しさわったことは
あったのですが、正規化の部分は勉強していたとは言えず、お恥ずかしい
限りです。

 今回、学校のデータ管理、特に成績管理にデータの一元性を保つ必要が
出て、データベースの導入を決意しました。当初、成績というと Excel 等で
作る成績一覧表がイメージされて、

|‥‥|氏名|国語|欠課数|地歴|欠課数|数学|欠課数|‥‥

というようなテーブルが思い浮かんだのですが、これではデータベースの
データとしてはとても扱いにくいということに気づき、

|生徒ID|国語|欠課数|コメント|
|生徒ID|地歴|欠課数|コメント|
|生徒ID|数学|欠課数|コメント|
      ・
      ・
      ・

というようにレコードを定義すれば、非常に柔軟な扱いができるデータに
なると、成績部分のテーブル定義では偶然とはいえ第1正規化ができて
いたのですが、我流であったために思わぬところで、正規化ができて
いないことに気づきませんでした。

 正規化ができていないとのご指摘を受け、改めて調べ直して、肝心な
部分ではできていたのに、全体を見れば中途半端にしかできていなかった
ことに、あらためて勉強し直す必要性を感じました。

 分割できるテーブルは極力分割し、同じデータの重複を避ける作業は
かなり意識してテーブルを作成しましたので、第1正規化の部分ができて
いないことに気づきませんでした。というより、以前データベースを使った
ときも第1正規化については考えていなかったように思います。入試処理
で、特定の教科を全員が受験するという処理内容で、第1正規化ができて
いなくても困ることがなかった、という事情によるものです。

 ところが、私が勤めるのは総合高校で、全科が履修する科目を全て、
フィールドとして横に並べたのでは大変な列数になり、やたらと NULL 値
が入るという現象が起きてしまいます。これでは使い物にならないと、
成績管理のテーブルでは現実的な要求から第1正規化を思いついた
ようです。

 ただ、成績一覧表のイメージから「本当にこれでよいのか」という疑問が
どこかにあって、第1正規化の未処理の部分を残してしまったと思います。
また、もし本校が普通科高校であれば、成績の部分も第1正規化ができて
いたかどうか怪しいものです。

 PostgreSQL を導入するに当たって一応正規化の部分はそれを説明した
ウェブページを読んで、成績データの管理はこれでよいのだなと思ったの
ですが、正確な理解ができていなかったようです。

 今回、ここでご質問させていただいたのも、SQL をどう書いてよいか
わからなかったり、NULL 値がやたらと出てくるときはテーブルの構造を
疑った方がよいと漠然と思っていたからです。

 意外な収穫は CASE 文の出力に定数以外にもフィールドを指定できる
ことを学んだことです。CASE 文による出力は定数だけと勘違いしていた
ものですから。

 それと、中西さんのご指摘の

 > 高校のように留年のある学校だと,IDと学年と年度で照合する必要が出
 > てくることがあります。

は、「後の年度のデータを書けばよい」ぐらいにしか思っていなかったので
貴重な情報となりました。ありがとうございました。

 最後に一つ、正規化その他データベースの設計についてもう少し本格的
に勉強したいと思うのですが、わかりやすい参考書があったら教えて下さい。

 よろしくお願いいたします。

/// 阿部哲也 



pgsql-jp メーリングリストの案内