2012-01-06 5 views
0

現在、私は2つのクラス、学生とコースを作成しました。私たちがここで重点を置くのは、熟練です。したがって、各course_typeには独自の習熟度セットがあります(course_proficienciesに保存され、各コースにはコースタイプがあります)。学生がコースにサインアップすると、完了した熟練度を追跡することができます(学生が熟練を完了すると、student_proficienciesに行が追加されます)。PHP OOP:作成するクラスの数

a schema http://slickrocksolutions.com/test/schema.png

は今..習熟度(完成習熟度)を得るために、私は何かを行う必要があり、getCourseProficiencies()とgetCompletedProficienciesByStudent($ studentID)でStudentProficienciesと呼ばれる新しいクラスを作成するか、または必要があります。

$course->getCourseProficiencies(); 
$student->getCompletedProficiencies($courseId); 

そして、どのように私に熟練を追加することをお勧めしますか?新しいクラスを作成しない場合、次のようになります。

$student->completeProficiency($proficiencyId, $courseId); 

簡単な使用を記述してみ...

  1. 学生
  2. コース
  3. CourseType
  4. CourseProfiency
  5. StudentProfiency方法については

+0

命名規則:とは異なり、テーブル名(およびいくつかは、あまりにもその上で主張するだろう)、クラス名本当にすべきだ単数形「学生」と「コース」。 –

+0

私は、いくつかのショートカットを取ることはまったくいいと思います。通常は、 'student_proficiencies'のような接続テーブル用のクラスを作成する必要はありません。 –

+0

これがあります。クラスは:学生とコース – execv

答えて

1

3つのクラス:

学生、 コース、 能力

Course_typeは、コースのプロパティです。

ハッシュテーブルを次のように course_type_to_proficiency、 course_to_student、

が、私はそれはあなたがこれに似たクエリを使用して習熟度を調べるために学生の方法を行うことができるようにすべきだと思う course_to_course_type:

スチューデント> get_proficiencies(// DB等、 に接続 'はINNER cttp course_type_to_proficiency FROM cttp.proficienciesを選択course_to_course_type CTCT ON cttp.course_type_id = ctct.course_type_id内部結合course_to_student CTS ON ctct.course_id = cts.course_id WHERE STUDENT_ID = ###をJOIN'

もちろん、コース、学生、熟達度以上に参加していない限り、自分のクラスにコースタイプを入力する必要はありません。コースごとに完成したフィールドを追跡する必要がある場合、またはcourse_typeを使用して別のハッシュテーブルを作成します。

0

私はあなたがそのようなクラスが必要だと思いますあなたのモデルのケース - それはあなたがどのインタフェースを見るのに役立ちます(メソッド)では、クラスに本当に必要です。


StudentProfiencyについては、これは、いくつかの具体的なパラメータによっていくつかのクラスインスタンス(具体的なオブジェクト)を取得するのに役立つリポジトリパターンの実装です。

+0

どうすればすべてを一緒にしたいですか?それは次のようなものでしょうか: $ student = new Student($ mysqli、$ studentId); $コース=新しいコース($ mysqli、$ courseId); $ sp =新しいStudentProfiency($ student、$ course); // IDまたはオブジェクトだけを渡しますか? $ sp-> add($ proficiencyId); – execv

+0

この記事を読むhttp://en.wikipedia.org/wiki/Active_record_pattern たとえば、このパターンがYiiフレームワークでどのように実装されているかを見ることができます。 –

+1

imhoこれは、ORMのようにテーブルをモデリングする場合にのみ適切です。さもなければ、最初のクラスのオブジェクトはサムトレスラーの記述である –

0

これは好みの問題です。私は、一般的なエンティティごとにクラスを使用することをお勧めします。学生とコースは良いスタートでした。

オブジェクトに関連しないメソッドがある場合は、静的オブジェクトを「ツールボックス」として作成することは、たとえば学生をフェッチすることは悪い考えではありません。

熟練を得るためには、それぞれの授業でstudent_proficienciesとcouse_proficienciesから取得する習熟度を得るためのメソッドを作成します。

student_proficienciesとcouse_proficienciesには、同じ値の重複を避けるために、proficienciesテーブルの外部キーが必要です。

これが役に立ちます。

0

ユースケースの2つのデータエンティティを正しく識別しました。 StudentおよびCourse。あなたの関係にある他のすべてのテーブルは、これらの2つのエンティティの正規化された形式です。構文はC#にありますので、それに応じて翻訳してください。

class Student 
{ 
    // To uniquely identify each student. This is not the same as the id 
    // that you use in your Student table. 
    public string RegistrationId {get; set;} 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
    public Course Course {get; set;} 
    public Proficiency {get; set;} 

    // Get the list of courses completed by this student 
    public IEnumerable<Course> GetCompletedProficiencies() 
    { 
     // ... 
    } 

    // Add a completed course 
    public bool AddCompletedProficiency(Course completedCourse) 
    { 
     // ... 
    } 
} 

class Course 
{ 
    public string Id {get; set;} 
    public string Name {get; set;} 
    public string Location {get; set;} 
    public string Type {get; set;} 
} 

ただし、データベースにはいくつかの変更が必要です。 Studentテーブルでは、各生徒は人間に解読可能な一意の識別子(したがってRegistrationId)を参照する必要があります。Studentテーブルの主キーを維持するために使用するidと同じではありません。

プライマリキーとして使用されるidは、通常は整数であり、データベースシステムのみに認識されます(通常はAUTOINCREMENTIntegerフィールドです)。 RegistrationIdIdCourseクラスに適用されますUniversity NameSchool NameYear of AdmissionAlphabetical Order of Student's nameなど

同じ識別を含めることができるものでなければなりません。

GetCompletedProficiencies()AddCompletedProficiency()のメソッドは、データベースの操作をカプセル化します。

OOPの提案は、データベース設計の部分に入る前に、まずユースケースまたは要件のクラスを特定することです。

詳しい情報

関連する問題