2

私はテーブル関係について読んだことすべてを適用し始めましたが、第3のテーブルがあると考えると、MANY-TO-MANYという関係のテーブルにデータを挿入する方法が混乱しています。外部キーまたは複合キー?

今、私はこれらのテーブルを持っています。 (多くのテーブルへの多くの)

被写体

name 
code PK 
units 
description 

schoolyear

schoolyearId PK 
yearStart 
yearEnd 

schoolyearsubjects

id PK 
code FK 
schoolyearId FK 

しかし、上記のschoolyearsubjectsテーブルの問題は、GUIからschoolyearIdをどのように挿入できるかわかりません。 GUIのスクリーンショットでは、できるだけ早く「保存」ボタンがクリックされると、(schoolyearsubjectsに挿入する) INSERT文(subjectに挿入する)とを含むTRANSACTIONが実行されます。私が上記に固執すれば、私は校長IDを挿入する必要があります。 schoolyearIdは明らかにGUIから来ません。

schoolyear

--composite keys (yearStart, yearEnd) 
yearStart (PK) 
yearEnd (PK) 

schoolyearsubjects(多くの多くのテーブルTO)

enter image description here

私はこれにschoolyearsubjectsschoolyearの列を変更すると思っています

id PK 
code (FK) 
yearStart (FK) --is this possible? 
yearEnd (FK) --is this possible? 

1.)列を変更して複合キーを作成するソリューションはschoolyearIdの代わりにyearStartyearEndの値を挿入するだけですか?

2.)ジャンクション/リンクテーブルの学校の対象は正しいですか?

3.)アドバイスはありますか?

ご協力いただきありがとうございます。

ありがとうございました。

INSERT INTO schoolyearsubjects (code, yearStart, yearEnd) 
SELECT @code, y.yearStart, y.yearEnd 
    FROM schoolyear y 
WHERE @yearStart <= y.yearStart 
     AND y.yearEnd <= @yearEnd; 

...しかし、私はそれは、例えば重複することができますので、あなたがあなたのschoolyearsubjectsと設計上の欠陥があると思う:

+1

私にとってデータベースは問題ではないようです(技術的なIDまたは自然な複合キーで作業することもできますが、どちらも問題ありません)。これはGUIです。あなたは何をしたいのですか?新しい科目を追加しますか?新しい学年を追加しますか?科目を学年に関連付ける?別の行動でなければならないこれらのものを混ぜているようです。 –

+0

ありがとうございます。学年を科目に関連づけたい。しかし、被験者の創造に関して被験者の関連が起こらなければならない。なにか提案を? – p3ace

+0

私はこの問題を十分に理解していません。あたかもそれが何らかの形で生成され、あなたによって書かれていないかのように、GUIのことを話します。それは事実ですか?なぜあなたは単にリストから学年を選択させることができないのですか(リストボックスやコンボボックスに文字列 '2015/2016'、'2016/2017 'など)を選択させ、それらに件名を入力させ、取引を開始させます、ステートメントを作成して実行して件名を保存し、教科書オブジェクトを保存するステートメントを作成して実行し、コミットしますか? –

答えて

1

私の場合、学年は期間であり、ここで代理キーを使用する必要はありません。これは常に物事をより混乱させます。そして、グラフィカルインターフェイスを開発することは常に難しくなります(私は、開発者としてのピリオドのモデル化について話しています)。

あなたが考えるのをやめると、ピリオド自体がユニークなものとして認識されます。他の期間と同等の期間がありますか?落ち着いて考える。たとえ持っていても、これは何年もの間に起こります。したがって、私たちはすでに学年の主キーを持っています。学校の年齢から "校庭PK"を取り除く。ここでは複合キーをyearStartと年末に使用してください。だから、(将来的には、テーブル)あなたschoolyearエンティティはようになります:中間テーブルでは

  • yearStart PK
  • 年末のPK

、あなたは複合主キーとして3つのフィールドを持つことになります(また、外部キー):!schoolyearから

  • yearStart PK FK()schoolyearから
  • YEAREND PK FK()
  • (被験者から)
  • コードPK FK

これは、期間は、単一の主題を持っていることを可能にします。一方、複数のサブジェクトを持つ期間が必要な場合は、代理キーをここに配置する必要があります。

これでグラフィカルインターフェイスを描画するために、選択ボックス(コンボボックス)を使用するだけで済みます。この場合、各項目は「年XからY」(期間)のようなテキストとして表示されます。あなたのユーザーはそれをよく理解して選択することができます。

:とにかく、あなたはインターフェイス内のレコードのIDを持っているが、それを識別値はないかもしれません。これは見ることが許されており、は残りのレコードを特定します

しかし、あなたに何かユニークなピリオドがない場合、 "yearStart"と "yearEnd"はサブジェクトエンティティのフィールドであり、学年エンティティはありません。正直言って、他のテーブルの他のレコードとの関係にそのレコードを再利用したい場合にのみ、実体 "schoolyear"を存在させるべきです。私はこれがそうであるかどうかを言っているわけではありません。また気をつけてください。これを行うと、各期間に1つのサブジェクト(フィールドとして)しかないということになります。これがまさにあなたが望むものなのかどうかわかりません。

  • CONTEXT

あなたのコンテキストを確認します。我々は常にER-ダイアグラムを形成する上で最も重要なことは覚えておく必要があります。それは何を求めるのですか?ご不明な点がございましたら、ご意見ください。あなたが私にここでより多くの文脈を提供できるなら、私はもっとあなたを助けることができます。

+0

アドバイスをいただきありがとうございます。 – p3ace

0

あなたはUIからの値を持つパラメータ@code@yearStart@yearEndを持っていると仮定すると

INSERT INTO schoolyearsubjects VALUES ('code red', '2016', '2017'); 
INSERT INTO schoolyearsubjects VALUES ('code red', '2016', '2017'); 
INSERT INTO schoolyearsubjects VALUES ('code red', '2016', '2017'); 

このようにすると、事実上重複する行が3つ発生するようです。あなたの現在のスキーム次のようにあなたが要求してschoolyearIdを挿入することができますして

+0

まず、アドバイスをいただきありがとうございます。私はまだそれを吸収して分析しようとしています。 schoolyearsの主題では、1つの科目が異なる学年に属することができ、学年は多くの科目を持つことができるので、科目コードの学年を保存することを考えています。さて、私はそれを見て、どのような変更を行うことができるかを見ていきます。再度、感謝します。 – p3ace

+0

ああ、あなたは正しい。複製しています。これを修正するためにUNIQUE制約を追加できますか?ちょうど私がそれを正しくやっていることを確かめる。 – p3ace

0

:これが機能するために


    INSERT INTO schoolyearsubjects (id, code, schoolyearId) 
    VALUES (${id}, 
      ${code_from_GUI}, 
      (SELECT schoolyearId 
       FROM schoolyear 
       WHERE yearStart=${start_from_GUI} AND yearEnd=${end_from_GUI}) 
      ); 

、schoolyearテーブル内(yearStart、年末)上で一意制約が必要です。

その他の質問については、
1)教授用テーブルで複合キーを使用することもできます。
2)joinyクエリを書くことができるので、schoolyearsオブジェクトが正しいです。 schoolyearIdの列を取り除くと、schoolyearテーブルにすべてのデータが含まれているため、おそらく学校のテーブルがすべて必要になることはありません。
3)このarticleは、使用するキーの種類を判断するのに役立ちます。