• ベストアンサー

ACCESSで成績管理

成績管理DBを作っています。わからないことがあるので教えてください。 Aテーブル No(主キー) 名前 住所 TEL 成績 とあります。 「成績」レコードですが、これまでの履歴もちゃんと保存していきたいと考えております。 その場合、もう一つ下記のようなテーブルを作ってみました。 Bテーブル ID(とりあえず主キーを設定するため) No. 国語 数学 理科 社会 AテーブルとBテーブルの「No.」でリレーションシップを設定。 質問なんですが、こんな(変な)やり方でいけるでしょうか?別の効率のよい方法があったら教えてください。 ※テーブルの概念を言葉で伝えるのは本当に難しいですね。補足がありましたら入れてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • angband
  • ベストアンサー率51% (86/168)
回答No.3

すいません。#1のangbandです。 もし試しに作られるのでしたら、Cテーブルに、Bテーブル のIDが必要です。抜けてました。 正規化はちょっとややこしいかもしれませんが、 簡単に説明してみます。 第一正規形にするという場合は、要するに1レコードに 繰り返す値があってはだめ、ということです。点数や 教科は生徒一人あたり複数でてくる項目なので分けましょう というのが第一正規化です。さらにぶっちゃけていえば 生徒一人あたり1つしかないもの(名前、生年月日など) はあってもOKです。生徒一人に複数あるものは別テーブル へというのが第一正規化ですね。 ここまでだけでも教科が増えたり、テスト回数が増えても OKになっていますね。 第二正規化は、レコードを縦に見て、IDや数値以外で 同じものがあってはだめということです。他のテーブルの IDや、テストの点数、年齢などは同じでも仕方ないです。 第三正規化は、レコードごとに比較してみて、レコード内 に連動して変化する値があってはだめ、ということです。 具体的には今回ならば、もし郵便番号と住所などがあれば それが第三正規化でひっかかります。なぜこれがだめなの かというと、生徒に兄弟がいる場合などに同じ住所に なる場合があるはずです。となれば生徒と住所は1対1の 関係になく、1住所に複数の生徒が対応しているという ことなので、テーブルをわけるべきだということなのです。 正規化の説明って難しいですね・・

Scotty_99
質問者

お礼

再回答ありがとうございます。いま鋭意製作中なんですが難しいですね^^;。正規化の意味を理解したつもりなんですが、リレーションを作成するとどうしても思うように動かないんですよね。No2の方の方法もいい線行くんですが、多少思惑とずれたりします。 まだがんばってやってみたいと思います。必ずご報告致します。

その他の回答 (2)

  • nika
  • ベストアンサー率14% (66/470)
回答No.2

一つにまとめて 名前 住所 Tel 実施日 国語 算数 理科 社会 成績 テーブルにします。直感的にわかりやすいでしょう。 データが増えてきたら、これをアクセスの正規化にかけます。 すると、#1のような正規化されたテーブルが出来上がります。 この方法は、正規化がわかりにくい人にとって便利です。

Scotty_99
質問者

お礼

回答ありがとうございます。とても参考になりました。 そんな方法は知りませんでした。 まだ検証できてないので検証次第、返信申し上げます。

  • angband
  • ベストアンサー率51% (86/168)
回答No.1

ちょっときついと思います。 お勧めは「正規化」というキーワードでgoogleで調べて みてください。おそらくそこに答えがあります。テーブル は誰が作ってもほぼ同じ構造になるルールがあります。 一案ですが、 ----------------------------------------------- Aテーブル:生徒名簿 ID kana lname:姓 fname:名 などの生徒固有の情報をAテーブルへ ----------------------------------------------- Bテーブル:教科テーブル ID name:教科名 ----------------------------------------------- Cテーブル:テストテーブル ID date:実施日 name:テスト名(中間、期末など) min:最低点 avg:平均点 max:最高点 ----------------------------------------------- Dテーブル:生徒テスト成績テーブル ID AのID BのID CのID num:テストの成績 ----------------------------------------------- のようにすれば何年でも使えますし、一応正規化できて ますね。必要な項目が分かればもっと正しい正規化が できると思いますよ!がんばってくださいね。

Scotty_99
質問者

お礼

回答ありがとうございます。 すばらしいテーブル構成ですね。まだ私には理解できない部分があります。作ってこれから検証しようと思います。 正規化をかじってみましたが、どんどんむずかしくなるのですね。 >誰が作ってもほぼ同じ構造になるルールがあります そんなことも知らずデータベースを作っていました。面白いことを聞きました。 まだ検証中なので検証できたら再回答したいと思います。

関連するQ&A

  • Accessのリレーションシップ

    Access初心者です。 Access2010でデータベースを作っていて、行き詰ってしまいました。 テーブル1にフィールドABCDEFがあって、Aに主キーが付いています。(Aはテキスト型でフィールドサイズ10です。) テーブル2にはフィールドAGHがあり、Aに主キーが付いてます。(Aはテーブル1と同じです。) テーブル3にも同じくフィールドAIJがあり、Aに主キーが付いています。(Aはテーブル1と同じです。) テーブル1のフィールドAを主テーブルとし、テーブル2・3のフィールドAにリレーションを組んでいます。 この時のリレーションシップで参照整合性と連鎖更新と連鎖削除にチェックを入れ、種類が一対一になりました。 その後、テーブル1でレコードを追加しようとすると、「テーブル'2'にリレーションシップが設定されたレコードが必要なので、レコードの追加や変更を行うことができません。」と出ます。 これを解決する方法はどうするのか、お教えお願いします。 分かりにくい説明ですいません。

  • Access 複数テーブルのレコード自動更新

    Access初心者です。会社で業務の進捗状況を、Access2002を使って管理しています。 フィールド数が増えたので、以下のようにテーブルを分けることになりました。 Aテーブル(メイン)   管理No.(主キー、オートナンバーではない)    カテゴリ    作業内容    : Bテーブル   管理No.(主キー、オートナンバーではない)    チェック項目B-1   チェック項目B-2    : Cテーブル   管理No.(主キー、オートナンバーではない)    チェック項目C-1   チェック項目C-2    : という形式で、AとB・Cはクエリのリレーションシップで、「管理No.」を1対1で関連づけています。 AテーブルのもとのデータはExcelからインポートしますが、 Aテーブルのレコード数は増えますが、クエリには反映されません。 Aのレコードが増えたら、BやCも同時に増やすことはできますか?

  • アクセスでの複数のテーブルでのオートナンバーについて

    こんにちはアクセス2000で在庫管理をしています。 超初心者です 商品テーブルで 商品コードをオートナンバーにしていますが 仕入先でテーブルを分けることになり 商品マスタA、商品マスタBとわけたのですが 主キーである商品コードを AB重複しないようにすることは可能ですか? またやり方はどうすればいいのでしょうか? リレーションシップなどの設定かなと思い いじくってみましたが、どうもうまくいかず悩んでいます。 よろしくお願いいたします

  • Access2002 参照整合性について

    テーブル間にリレーションシップを設定する場合、リレーションテーブル側に主テーブルにないレコードがあると参照整合性を設定できないにも関わらず、「結合の種類」で「3」(リレーションテーブル側の全レコードと主テーブル側の同じ結合フィールドのレコードだけを含める)を選べるのは何故でしょうか。 参照整合性を設定できた時点で、リレーションテーブル側には主テーブルにないレコードは無いということだと思うのですが・・・。 よくわからなくなってしまいました。 お答え、よろしくお願いいたします。

  • access97でのデータ利用方法について

    AテーブルのレコードとBテーブルのフィールドをリレーションさせる方法はあるのでしょうか やろうとしている事は、Bテーブルの各フィールドにはそれぞれの商品数量があって、そのフィールド(商品名)の単価をAテーブルから参照させたいのですが 主キーがAテーブルでは、商品名に出来そうですが、Bテーブルは、商品名が フィールドとなっているので 配列のような概念が利用できないかとも思ってマニュアル探してみましたが判りませんでした。それともデータベースの考え方が間違っているのでしょうか? ご存知の方いらっしゃいましたら宜しくお願いします。

  • ACCESSで一括レコード更新

    あるテーブルのレコードを、別のテーブルのレコードで更新したいです。具体的には、 二つのテーブルは同じフィールドを持っています。 フィールド名はID、名前、住所、電話で構成されています。 テーブルA  001 山田 東京 123456  002 田口 千葉 234567  003 鈴木 埼玉 345678  004 斉藤 佐賀 456789  005 上野 大阪 567890 テーブルB  003 鈴木 長野 345678  004 斉藤 佐賀 890123  008 野口 京都 090909 テーブルAとBでIDが一致するレコードだけテーブルAのレコード をそっくり入れ替えるにはどうしたらいいでしょうか。 この場合、003と004のレコードだけ更新します。 テーブルAのIDは主キーでオートナンバー型になっています。

  • Access 分割したテーブルを一対一で結合。新規レコードが作れなくなりました

    過去に同様の質問が無かったようなので質問します。 Access2002です。 これまで顧客名簿を一つのテーブルで管理していたのですが、フィールド数が増えてきたので、 テーブルを5分割しました。 主テーブルに対し副テーブル4つを、主テーブルのID(主キー、オートナンバー型)と副テーブルそれぞれのID(数値型)で一対一結合しています。 下記のようなイメージです。 テーブルA-テーブルB テーブルA-テーブルC テーブルA-テーブルD テーブルA-テーブルE すると、 新規レコードの登録が出来なくなってしまいました。 全部のテーブルを結合させたクエリを作って、そのクエリを基にフォームを作ったり、 主テーブルのフォームに副テーブルのサブフォームを4つ設置したり、 幾つか方法を試みたのですが、どれも同じエラーメッセージが出ます。 ↓ 「インデックス、主キー、またはリレーションシップで値が重複しているので、テーブルを変更できませんでした。重複する値のあるフィールドの値を変更するか、インデックスを削除してください。または重複する値を使用できるように再定義してください。」 非常に基本的な質問なのかも知れませんが、お手上げです。 どなたかご教授くだされば幸いです・・・。

  • Accessの主キーについて

    お願いいたします。 Accessの主キー設定について教えてください。 主キーの役割は、テーブルの中のレコードを区別 するための機能だと思いますが、 フィールドのデータ型をオートナンバー型にして おけば主キーの設定は必要ないのではないでしょう か? 主キーを設定する理由としては、参照整合性のため に行うという考え方で良いでしょうか? また、複数の主キーを設定するという場合のテーブ ル構成はどのような場合のシステムなのでしょうか? どうぞ教えてください。

  • 2つのaccessテーブルのレコード数を合わせたい

    一つは200レコードあるリンクテーブルです。 このリンクテーブルとあるテーブル(Bテーブル)を合体させたいと思いました。 そのあるテーブルは主キーであるIDとチェックボックスの2つのフィールドだけです。 このB]テーブルの主キーとリンクテーブルの主キーとリレーションでつなげました。 しかし、そのBテーブルはレコードが全く無いのでチェックボックスが出て来ません。 リンクテーブルのレコード数分、手動で作成したらチェックボックスと組み合わさります。 これでは、毎回毎回リンクテーブルのレコード数を数えて同じ分だけBテーブルでレコードを作成しなくてはいけません。 自動で同じだけのレコードを作ることはできますでしょうか? VBAでレコード数を数えて・・・・とかするのでしょうか?

  • Access で更新クエリー

    教えてください。アクセス2000 Win2Kです。 あるDBから1つのレコードだけ抽出し(オートナンバーをキーにしてテーブル作成クエリでローカルテーブルを作成します。)その後、そのレコードを加工して元のDBにもどしたいのですが、1レコード上にフィールドが60近くあるので一括で更新したいのです。「T_ローカル.*」みたいな感じで・・・。なにか良い方法はありませんか?一旦、DBから削除して加工したレコードを追加する方法も考えたのですが、DBのオートナンバーが変わってしまうのでやめました。 なにか良い方法をご存じの方、是非ご教授ください。 よろしくお願いします。