0

MySQL と PHP を使用してかなり複雑な Web アプリケーションを設計しており、データベース用の CRUD インターフェイスを作成する必要があります。多くのテーブルがあり、それらの間にさまざまな一対多および多対多の関係があります。簡単にするために、「学生」、「チューター」、「セッション」の 3 つのテーブルに注目しましょう。個々のテーブルのレコードにアクセス/変更する操作は非常に簡単です。つまり、次のとおりです。

createStudent($name, $email, ...)
fetchStudent($student_id)
updateStudent($student_id, $name, $email, ...)
deleteStudent($student_id)

他のテーブルの同様の機能。オプションのフィルターパラメーターを使用して、いくつかのブラウジング機能もあります。

fetchStudents($limit, $sort, ...)
fetchSessions($limit, $sort, ...)

これらもかなり簡単に見えます。ただし、複数のテーブルを含むブラウジング機能を整理するための「健全な」設計に苦労しています。私の現在のアプローチは次のようなものです:

// Fetch a list of tutors for a specified student
fetchStudentTutors($student_id, $limit, $sort, ...) 

// Fetch a list of students for a specified tutor
fetchTutorStudents($student_id, $limit, $sort, ...) 

// Fetch a list of sessions for a specified student
fetchStudentSessions($student_id, $limit, $sort, ...) 

// Fetch a list of sessions with a specified tutor for a specified student
fetchStudentSessionsWithTutor($student_id, $tutor_id, $limit, $sort, ...) 

ただし、クエリの可能なタイプ、つまり必要な機能は、理論的には、新しいテーブルごとに指数関数的に (または階乗的に) 増加します (実際には、複数のチューターを単一のセッションにマッピングするなど、いくつかの関係は存在しません)。私の質問は、より良いアプローチはありますか? 次のような単一の関数を作成しようとする必要があります。

// $tutor_id, $student_id are also optional parameters
fetchSessions($tutor_id, $student_id, $limit, $sort, ...)

他のテーブルの制約はフィルタリングの一部ですか? この場合、これらすべてのフィルターを考慮して、上記の関数内に単一のモンスター クエリを作成する必要がありますか? または、考えられるすべての順列を処理するために、一連の if-else ブロックをコーディングする必要がありますか?

さらに良いことに、PHP と SQL でこの種の問題に取り組みやすくする既存のプロジェクトはありますか?

4

2 に答える 2

0

本格的なフレームワークは必要ないことがわかりました。私が探していたのは「オブジェクト関係マッパー (ORM)」です。ほとんどのフレームワークには ORM が組み込まれていますが、RedBeanPropelなどのスタンドアロン ORM もあります。

于 2014-08-25T19:10:19.527 に答える