REST端点设计,用于检索多对多关系中的结果

时间:2017-04-25 22:50:38

标签: rest api many-to-many relationship restful-url

我已经阅读过很多关于设计多对多关系的帖子;但是,我无法找到我想要的答案。

基本上,我在数据库中有两个表,另一个多对多表连接这两个表。 为简单起见,我们称之为:

  • 课程(CourseID,CourseName)
  • 讲师(讲师ID,讲师名称)
  • CourseInstructor(CourseID,InstructorID,lectureRoomName)(MANY-TO-MANY)


我有两个问题:

1)我应该如何获得CourseInstructor表中的所有条目。

GET /courses/instructors是否正确? (或GET /instructors/courses或两者)

或者我应该有一个名为/ coursesinstructors的单独端点


2)此外,我希望能够通过传入CourseName来获取CourseInstructor表中的所有行。

通常情况下,如果我正在寻找课程,我想我会这样做,/courses?name=coursename。而且,我可能会使用端点/courses/{courseId}/instructors/{instructorId}来搜索多对多表中的特定条目。

因此,我很好奇这样的工作:/courses?name=coursename/instructors(这有可能吗?)

另一个选择是让另一个端点叫/coursesinstructors,我可以让/courseinstructor?name=coursename来获得结果。

或者我应该通过以下方式进行2次调用以获得结果: - 通过/courses?name=coursename获取ID - 并使用courses/{id}/instructors

关注它

除了上面提到的建议和解决方案之外,我愿意接受任何其他建议和解决方案(不确定我的是正确的解决方案)。

2 个答案:

答案 0 :(得分:1)

对于第一种情况,它实际上取决于您的用例。 GET /courses/instructors意味着(仅)检索教师,因此我个人只需要GET /coursesembed教师。

至于第二种情况,/courses?name=coursename应该足够好(加/courses/{courseId}/instructors/{instructorId}以深入到特定条目)。 2个电话是另一个有效的选择。但是,根据RFC 3986/courses?name=coursename/instructors之类的网址似乎无效。

答案 1 :(得分:1)

如果你真的需要(1),完全转储所有课程教师配对,那么我认为你最好的选择是支持

GET /course-instructors
GET /course-instructors?courseName=whatever

然后,您可以链接或嵌入课程和讲师。

{
    "course": "/courses/12",
    "instructor": "/instructors/54"
}

{
    "course": {
        "name": "Political Science",
        ...
    },
    "instructor": {
        "name": "Hober Mallow",
        ...
    }
}

您的回报取决于您客户的需求。也许您返回缩写信息加上完整表示的链接,或者可以只返回链接,因为课程和教师(应该!)高度可缓存。

顺便说一句,我认为你可以不再考虑数据库如何存储数据,而是考虑客户需要从API中获得什么。