【问题标题】:How should I design an interface for multi-table CRUD?我应该如何设计多表 CRUD 的接口?
【发布时间】:2014-08-26 03:10:19
【问题描述】:

我正在使用 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 中的问题?

【问题讨论】:

    标签: php sql relational-database crud multi-table


    【解决方案1】:

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

    CRUD 和关系很容易用它来处理。

    【讨论】:

    • 但是,框架真的可以更轻松地构建我所描述的复杂查询类型吗?从other posts are saying 来看,至少在 Yii 中,你基本上还是会编写查询。据我所知,唯一的区别是您必须处理 Yii CDbCriteria 接口的额外层,这也可能只是查询不同部分的字符串连接。
    • 简单多了!看看 CActiveRecord 中的关系。 yiiframework.com/doc/guide/1.1/en/database.arryou 还要查看 beforeSave、afterSave 和 afterDelete 事件。
    • 嗯,有趣,这听起来很有希望。我特别喜欢他们提供的“统计查询”选项,这听起来比到处写COALESCE(SUM()) 语句要好得多。不过,我有点担心将我的整个代码库改造成一个框架。尤其是考虑到当我还是一名 C++ 程序员时使用 .NET 框架的糟糕经历;)
    • 还可以查看博客演示 yiiframework.com/demos/blog/index.php/post/admin 的管理部分,其中包含完整的内容。它包含在演示文件夹中的 Yii 源代码中。
    【解决方案2】:

    事实证明,一个成熟的框架是不必要的。我一直在寻找的是“对象关系映射器(ORM)”。大多数框架都有内置的 ORM,但也有一些独立的 ORM,例如 RedBeanPropel

    【讨论】:

      猜你喜欢
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多