我应该如何为多表CRUD设计一个接口?


How should I design an interface for multi-table CRUD?

我正在使用MySQL和PHP设计一个相当复杂的web应用程序,我需要为数据库编写一个CRUD接口。我有许多表,它们之间有各种一对多和多对多关系。为了简单起见,让我们关注三个表:"学生"、"导师"answers"会议"。访问/修改单个表中记录的操作相当简单,即:

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?

使用框架,如Yii。它已经完成了所有的工作。

CRUD和关系是很容易做到的。

事实证明,并不需要一个完整的框架。我要找的是一个"对象关系映射器(ORM)"。大多数框架都有内置的ORM,但也有一些独立的ORM,如RedBean和Propel。