我正在使用 MySQL 和 PHP 设计一个相当复杂的 Web 应用程序,我需要为数据库编写一个 CRUD 接口。我有很多表,它们之间有各种一对多和多对多的关系。为简单起见,让我们关注三个表:“students”、“tutors”和“sessions”。访问/修改单个表中的记录的操作相当简单,即:
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 中的此类问题?