4

データベースとオブジェクト指向プログラミングを (精神的に) 接続することに混乱しています。

たとえば、表の行に生徒を表示し、列に課題を表示する UI を備えた、教師の成績表アプリケーションを想像してみてください。基盤となるデータベースには、多対多の関係が含まれる場合があります。学生には多くの課題があり、課題には多くの学生がいます。

基礎となるコードはどのように機能しますか? 課題のリストを参照する変数を持つ Student クラスがありますか? それとも、学生のリストを参照する変数を持つ割り当てクラスですか? 両方?... Student と Assignment のインスタンスをリンクするある種の StudentAssignment クラスがありますか? (もしそうなら、50 人の生徒と 10 個の課題を持つクラスは、500 個の StudentAssignment オブジェクト、50 個の Student オブジェクト、および 10 個の Assignment オブジェクトを同時にメモリに持つことを意味しますか?!) ... そして、これらのさまざまなクラスは主に次のもので構成されていますか?例) 基礎となるデータベースで動作する SQL ステートメント?

ここには多くの質問があることは承知していますが、それらはすべて一緒です...多対多の関係をコーディングするための一般的に受け入れられている戦略は何ですか?

ps私が怠け者だと思わないようにコードで多対多の関係をモデル化する方法など、他の質問を見ましたか? 属性との多対多の関係をモデル化する。

4

2 に答える 2

3

データベースには、Student Table、Assignmentテーブル、およびStudentAssignmentの交差テーブルが必要です。これのOOP表現は、各生徒が課題のコレクションを持っているだけの場合があります。どの生徒が特定の課題を持っているかを確認する必要がありますか?その場合は、必ずその情報を割り当てオブジェクトに入力してください。または、すべての生徒に特定の課題があるかどうかを確認することもできます。それはあなた次第です。

データベースには、データの表現方法とアクセス方法に制限があり、OOP言語である必要はありません。

ただし、StudentAssignmentオブジェクトは絶対に必要ありません。その表は、エンティティではなく、関係を表しています。

編集:

課題からその課題を持っている生徒、および生徒からすべての課題に移動する必要がある場合は、50個の生徒オブジェクトと10個の課題オブジェクトが必要になります。これらのオブジェクトを作成するときは、これらの各オブジェクトのコレクションに関連するオブジェクトを入力する必要があります(生徒にはリストの割り当てがあり、その逆も同様です)。

あなたがこれをしたとしましょう:

すべての生徒のオブジェクトを作成し(これにより50レコードが返されます)、課題コレクションを空のリストに設定します。

SELECT
    StudentName,
    ID
FROM
    Student

すべての課題のオブジェクトを作成し(これにより10レコードが返されます)、生徒のコレクションを空のリストに設定します。

SELECT
    AssignmentName,
    ID
FROM
    Assignment

次のようなものですべてのデータを照会したとします。(各学生が各課題を持っていると仮定すると、これは500レコードを返します)

SELECT
    Student.ID [StudentID],
    Assignment.ID [AssignmentID]
FROM 
    Student
    INNER JOIN StudentAssignment ON Student.ID = StudentAssignment.StudentID
    INNER JOIN Assignment ON Assignment.ID = StudentAssignment.AssignmentID

これらの500レコードをループして、各関係に対応するオブジェクトを追加する必要があります。まだ60個のオブジェクト(50 + 10)しかありませんが、それらの関係は、各オブジェクトが持つ課題または生徒のコレクションによって定義されます。

于 2012-04-19T16:21:20.573 に答える
1

SQL スキーマを OO に変換すると、パラダイムが異なるため、しばしば混乱する可能性があります。

オブジェクト指向が基礎となる実装を抽象化する方法を提供すると考える場合、答えへのより明確な道筋が得られます。すべての SQL テーブルに対してオブジェクトを作成しても、明確さや抽象化レイヤーの向上という点では何も得られません。

課題のリストを参照する変数を持つ Student クラスがありますか? それとも、学生のリストを参照する変数を持つ割り当てクラスですか? 両方?

データ アクセスのパターンによっては、両方を行う可能性があります。

Student と Assignment のインスタンスをリンクする何らかの種類の StudentAssignment クラスがありますか?

いいえ、これは必要ありません。この実装の詳細StudentAssignmentクラスで非表示にします。

そして、これらのさまざまなクラスは、主に (たとえば) 基礎となるデータベースを操作する SQL ステートメントで構成されていますか?

それらは可能であり、実際にはそうなることがよくありますが、たとえば、リポジトリ パターンを使用して、実際にデータにアクセスする他のクラスを呼び出させることもできます。

于 2012-04-19T16:19:52.040 に答える