[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 メーリングリストの案内