• 締切済み

学生 科目 課題のリレーション

テーブルの設計をしています。 現在はACCESS2003で設計しており、ゆくゆくはSQLSERVER2005にしたいと考えています。 今現在あるテーブルは学生・科目履修・科目です。 順に1対多、多対1でリレーションを作成しています。 これに課題テーブルを作成したいのですが、どのようにリレーションすればいいか、分りません。以下課題の条件です。 ・課題には課題コードがあります。 ・1科目には必ず複数個の課題があります。 ・科目により課題の個数は違います。 ・学生1人1人に課題の点数を入力する必要があります。 私なりに1週間ほど考えたのですが、結局は科目履修とは別に、学生・実習・課題のようにテーブルを定義して1対多、多対1のリレーションしかないのでしょうか? しかしあまりにひどいリレーションになってしまいます。入力も時間がかかります。もっときれいに理論的に整理されたリレーションが作れないでしょうか? お手数でしょうが、ご教授ください。

みんなの回答

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

リレーショナルデータベースでテーブルを分割するのは正規化するためです。 正規化の目的は入力の効率化・省力化ではなく、データの整合性維持です。 テーブルを分割すると一般的に入力負荷は増えます。しかし逆にいうと、ここまで分割しないとデータの整合性が失われる可能性があるということなのです。 今回のエンティティ群から部分関数従属と推移的関数従属を排除して第三正規化すると、質問者さんの結果になります。 これは質問者さんにとっては「理論的」ではないということでしょうか。 どうしてもテーブルの数を抑えたいという場合、(許されるならばですが)科目と課題を階層データと見做して、統合してしまうという方法はあるにはあります。 ・学生  (学生ID*, 氏名) ・科目課題(科目課題ID*,科目課題名,親科目課題ID) ・履修実習(学生ID*,科目課題ID*,点数) この場合、科目課題テーブルは親科目課題IDがないものが「科目」で、テーブル内にリレーションを持つ状態(自己参照)になります。 ただ、実務上は扱いやすい構造とはいえないでしょうね。

dorush
質問者

補足

jamshid6様 本当にありがとうございます。 テーブルの構造で本当にいろいろ悩んで最終的に上の結果になったのですが自信がなくて、本当に困っていました。回答を見てこれでよかったんだと思いました。 正規化はデータの整合性維持ですね。肝に銘じます。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

・科目[科目コード(PK),科目名] ・学生[学生ID(PK),氏名] ・科目履修[科目コード(FK→科目.科目コード),学生ID(FK→学生.学生ID)] に対して、 ・課題[課題コード(PK),科目コード(FK→科目.科目コード),課題名] ・実習[課題コード(FK→課題.課題コード),学生ID(FK→学生.学生ID),実習日,点数] の形で特に問題ないと思います。なんら論理的じゃないという風には思えません。課題は科目に対してぶら下がる必然性があり、実習は課題と学生に対してぶら下がる必然性がありますよね。  全テーブルで見るからごちゃごちゃしているように見えるだけで、「側面」ごとにテーブルレイアウトを見れば問題ないと思います。学生が科目を履修するから科目履修というリレーションが存在し(科目-科目履修-学生の側面)、学生が科目の課題をこなしたから実習結果が記録される(科目-課題-実習-学生の側面)。  入力の手間がかかるのはテーブルレイアウトとは別問題なのではないでしょうか。まずテーブル構造を見ると、学生と科目と課題がマスターテーブルとなり、実習はトランザクションテーブル(ジャーナルテーブルやログテーブルとも言われます)になりますよね。科目履修はマスターリレーションの場合もジャーナルリレーションの場合も考えられますが、ここではマスターリレーションとさせていただきます。つまり実習結果登録画面なるような画面があった場合、入力(画面初期表示処理)はマスターデータを取得し、(点数を初期値0として)実習テーブルに入れる内容をずんどこずんどこ作る処理を行い、点数をオペレーターに設定させた上で出力(登録処理)として実習テーブルに実際にずんどこ書き込んで行く、というIPO(Input-Process-Output)になるのが妥当なところだと思いますが、課題コード別に学生一覧を表示して点数を入れていく方式(以下「課題別点数一覧」)と学生ID別に課題一覧を表示して点数を入れていく方式(以下「学生別点数一覧」)ではだいぶ入力のしやすさが変わってくると思います。まさか課題と学生を組み合わせた一覧が画面に出てきてずんどこずんどこ点数を入れていくなんて画面ではないでしょう? 課題別点数一覧と学生別点数一覧はどちらが優れているというモノではなく運用によって変わってきますし両方の機能を用意する場合もある事でしょう。  長々と書きましたが結局私が言いたいのは「問題なのはテーブルレイアウトじゃなくて入力画面デザインではないか」という事です。  リレーションが複雑そうに見えるのは全く問題ではなく、それを解決するためにビュー(MS-ACCESSでは「クエリー」)があるという事ですね。テーブルは「データを格納するのに最も適した形」を考え、ビューは「データを取得するのに最も適した形」を考えるといいましょうか。  蛇足ですが、今設計段階なのであれば、後でSQL Serverにアップサイジングするよりも最初からSQL Serverをバックエンドにしておく方が良いと思います。SQL Server 2005はすぐインストールできますし、最初からADPで開発する事を強くお勧めします。

関連するQ&A

  • VBからリレーションの作成

    いつもお世話になっています。 SQLServerにAccessVBAからRDOで接続 テーブルの作成 インデックスの作成 リレーションシップの作成 という流れを行いたいのですが テーブル、インデックスの作成は SQL文で行えたのですが、リレーションの作成方法がわかりません。 SQL文で作成することはできないのでしょうか? なにかアドバイスをお願いします。

  • Accessの結合クエリフィールド選択について

    例えば、テーブルを2つ作成し、リレーションを設定し、 その2つのテーブルからフィールドをあわせた クエリを作成する際に、同じフィールド名があれば、 1対多の多の方を選択するようにと問題集などに書いてありますが、 なぜそうなのか考え方が分かりません。 教えて頂けないでしょうか? 環境:Access2003

  • Sqliteのリレーション

    ■利用環境 Sqlite3.3.5 データベース初心者で、 リレーションの概念等、理解出来てない 質問になってましたらすみません。 現在、テーブルを作成する事くらしかできません。 ■質問 Sqliteのテーブルプログラムから、 SQL関数を使ってつくっているのですが、 リレーションの設定の仕方がわかりません。 ■説明 Aと言うテーブルとBと言うテーブルがあるとき useridを主キーとして、お互いにリレーション を作るには、どのようにSQLを書けばよいですか?

  • リレーションで?

    ACCESS 2003を使って作成中なのですが、どうしてもわからないところがありましたので教えてください。 現在テーブルで、 「世帯テーブル」 ○ 世帯ID ○ 郵便番号 ○ 住所 ○ 電話番号 「個人テーブル」 ○ 世帯ID ○ 個人ID ○ 氏名 ○ 生年月日 ○ 性別 「詳細テーブル」 ○ 世帯ID ○ 個人ID ○ その他 とし、フォームで 「世帯フォーム」 ○ 世帯ID ○ 郵便番号 ○ 住所 ○ 電話番号 「個人フォーム」 ○ 世帯ID ○ 個人ID ○ 郵便番号 ○ 住所 ○ 電話番号 ○ 氏名 ○ 生年月日 ○ 性別 「詳細フォーム」 ○ 世帯ID ○ 個人ID ○ 郵便番号 ○ 住所 ○ 電話番号 ○ 氏名 ○ 生年月日 ○ 性別 ○ その他 というようにして、世帯IDでリレーションしてます。 入力の順番は、まず「世帯」に入力し、それから「個人」に入力し、最後に「詳細」に入力したいと思ってます。 そこで、個人フォームを入力するときに世帯IDを入力すると自動的に郵便番号、住所、電話番号が入力され、詳細フォームで入力するときに世帯IDと個人IDを入力すると該当項目が全て自動的に入力されるようにしたいと思ってます。 その場合、テーブルとフォームは作って世帯IDでリレーションするところまでいったのですが、ここから先どのようにしたらよいのかがわかりません。 どなたかお力を貸していただければと思います。 どうぞよろしくお願いいたします。

  • Accessでリンクしたテーブルのリレーションが設定できない

    PostgresへA5SQLとか言うツールを使ってテーブルを2つCreateTableしました。 テストデータも入力しました。 あらためてAccessでPostgresのテーブルをリンクテーブルとして参照しデータを見ることが出来ましたが、Access上でリレーションが未定義でサブフォームを作成することが出来ません。 リレーションを1:多で作成しようと思うのですが、設定フィールドが真っ白でいじれません。 何故でしょうか? 基本的にCreateTableするときに、なにやらリレーション設定する構文が必要だったのでしょうか? 今は、CreateTableしか構文は記述されていません。 どなたかご教授ください。 よろしくお願いします。

  • Access 一対一リレーションの編集

    こんにちは 現在、Accessと他のソフトとの連携をするために奮闘しています。。。知恵をお貸下さい。 Accessには元々受注テーブルがあります。 主キーID:オートナンバー 受注日:日付型 納期:日付型 図番:テキスト型 数量:数値 単価:数値 とあり、データがすでに存在しています。他のソフトへエクスポートを継続的に行うにあたって 新規にテーブルを作成し、一対一リレーションをしようとしています。 新規テーブルは 主キーID:オートナンバー 取引先コード:テキスト型 担当者コート:テキスト型 区分コード:テキスト型 実出荷日:日付型 エクスポート状況:数値 そして、受注テーブルと新規テーブルのIDを一対一でリレーションしクエリを作成し、エクスポートしようと思っています。 その際、新規テーブルの方はデータが空なのでクエリ結果が得られないと思うのですが。。。 どうやって既存の受注テーブルと一つ一つのレコードを繋げる事が出来ますか❓ 編集方法をどなたか教えて下さい。 素人ですみません。

  • [DB設計]多対多の問題点とは

    現在あるシステムを作成する上で、DB設計をしています。 このDB設計をする上で、多対多の状態だと良くない(できない?)とよく聞きます。 例)一人の学生は複数の講義を受講し、一つの講義には複数の学生が受講する。 この時に、学生の情報を格納する「学生DB(主キー:学生番号)」と、講義の情報を格納する「講義DB(主キー:講義番号)」を作成します。そうするとこの二つのDBの関係って、多対多になってしまうと思うのですが、この場合どのような問題が起きますか? 例がちょっとわかりにくいかもしれませが、要は 「DBを多対多の状態で設計した場合の問題点は何か?」 ということをお聞きしたいです。 よろしくお願いします。

  • ACCESSのリンクエラー

     「商品」テーブルと「仕入」テーブルで「1対多」のリレーションを構築し、この二つのテーブルからフォームを作成したのですが、「仕入サブフォーム」に新規Dataを追加しようとすると、 「”LinkMasuterFields/リンク親フィールド”プロパティの設定でエラー’このオブジェクトには、オートメーションオブジェクト’商品’は含まれません。’が発生しました。」 と出て、新規Dataを「仕入」サブフォームに入力しても「商品」テーブルとリンクされていません。  なんとか解決したいのですが、Helpだけでは良く判りません。どなたかよろしくお願いいたします。

  • Access2003 リレーションされたサブフォームの抽出

    Access顧客情報のデータベースを正規化(VBA)している初心者です。リレーションされているテーブルを元にクエリ(3つのテーブルをつなげただけ)を作成しメインフォームにサブフォームを作りました。3つのテーブルは、1対多でリレーションされています。テーブルAのGR_IDやグループ名で検索しそれに紐づいているCOmpanyは抽出できるのですが、サブフォームのテーブルBのCOmpany nameから抽出することができません。メインフォームからオプションボタンを使用してメインとサブの両方のテーブルを検索したいので、子・親リンクの設定をはずせませんよね?以前の類似質問で「サブフォームのフィルターに入力し、フィルター実行でうまくいきました」とありましたが、具体的にどのように設定(マクロやVBA、再クエリ?)すればいいのかわからず悩んでいます。どうぞ初心者向きのアドバイスをよろしくお願いいたします。 テーブルA GR_ID グループ名 ※テーブルA(1):テーブルB(多) テーブルB GR_ID Company_ID Company name ※テーブルB(1):テーブルC(多) テーブルC Company_ID salesman

  • 履修者名簿の作成と生徒の履修科目一覧の作成について

    各生徒の受講をする科目の番号が科目コードとして入力されてある表、および科目コードと科目名が対応した表があります(図を参照してください) そこから各科目の履修生徒一覧の表および各生徒ごとの履修科目リストの表を出力したいのですが、どのようにしてリレーションを組むなど分からないところがあって質問しました。 使用しているソフトはアクセスです。(画像はアクセス2003ですが、普段は2007を活用しています) 詳しい方教えていただけるとありがたいです。よろしくお願いします。