我已经阅读过很多关于设计多对多关系的帖子;但是,我无法找到我想要的答案。
基本上,我在数据库中有两个表,另一个多对多表连接这两个表。 为简单起见,我们称之为:
我有两个问题:
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
除了上面提到的建议和解决方案之外,我愿意接受任何其他建议和解决方案(不确定我的是正确的解决方案)。
答案 0 :(得分:1)
对于第一种情况,它实际上取决于您的用例。 GET /courses/instructors
意味着(仅)检索教师,因此我个人只需要GET /courses
和embed教师。
至于第二种情况,/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中获得什么。