用于在多对多关系中检索结果的 REST 端点设计
REST endpoint design for retrieving results in many to many relationship
我已经阅读了许多关于安心设计多对多关系的其他帖子;但是,我无法完全找到我正在寻找的答案。
基本上,我在数据库中有 2 个 table 和另一个连接这 2 个 table 的多对多 table。
为简单起见,我们称它们为:
- 课程(课程 ID、课程名称)
- 讲师(讲师 ID、讲师姓名)
- CourseInstructor(CourseID、InstructorID、lectureRoomName)(多对多)
我有两个问题:
1) 我应该如何获取 CourseInstructor 中的所有条目 table.
GET /courses/instructors
是否正确? (或 GET /instructors/courses
或两者)
或者我应该有一个名为 /coursesinstructors 的单独端点
2) 我还希望能够通过传入 CourseName 来获取 CourseInstructor table 中的所有行。
通常我想我会这样做,/courses?name=coursename
如果我正在搜索课程。而且,我可能会使用端点 /courses/{courseId}/instructors/{instructorId}
在多对多 table.
中搜索特定条目
因此,我很好奇这样的东西是否可行:/courses?name=coursename/instructors
(这甚至可能吗?)
另一种选择是使用另一个名为 /coursesinstructors
的端点,我可以使 /courseinstructor?name=coursename
获得结果。
或者我应该通过以下方式调用 2 次来获取结果:
- 通过/courses?name=coursename
获取id
- 并跟随 courses/{id}/instructors
除了我上面提出的建议和解决方案之外,我对任何其他建议和解决方案持开放态度(不确定我的解决方案是否正确)。
对于第一种情况,这实际上取决于您的用例是什么。 GET /courses/instructors
意味着(只)找回讲师,所以我个人只选择 GET /courses
和 embed 讲师。
至于第二种情况,/courses?name=coursename
应该足够好(再加上 /courses/{courseId}/instructors/{instructorId}
以深入到特定条目)。 2 次调用是另一个有效选项。然而,根据 RFC 3986.
,像 /courses?name=coursename/instructors
这样的 URL 似乎无效
如果您确实需要 (1),所有课程-教师配对的完整转储,那么我认为您最好的选择是支持
GET /course-instructors
GET /course-instructors?courseName=whatever
然后您可以 link 或嵌入课程和讲师。
{
"course": "/courses/12",
"instructor": "/instructors/54"
}
{
"course": {
"name": "Political Science",
...
},
"instructor": {
"name": "Hober Mallow",
...
}
}
您 return 取决于客户的需求。也许您 return 缩写信息加上 link 到完整表示,或者 return 只是 link 是可以的,因为课程和讲师(应该是!)高度可缓存。
顺便说一句,我认为您最好停止考虑数据库如何存储数据,而是考虑客户需要从您的 API.
我已经阅读了许多关于安心设计多对多关系的其他帖子;但是,我无法完全找到我正在寻找的答案。
基本上,我在数据库中有 2 个 table 和另一个连接这 2 个 table 的多对多 table。 为简单起见,我们称它们为:
- 课程(课程 ID、课程名称)
- 讲师(讲师 ID、讲师姓名)
- CourseInstructor(CourseID、InstructorID、lectureRoomName)(多对多)
我有两个问题:
1) 我应该如何获取 CourseInstructor 中的所有条目 table.
GET /courses/instructors
是否正确? (或 GET /instructors/courses
或两者)
或者我应该有一个名为 /coursesinstructors 的单独端点
2) 我还希望能够通过传入 CourseName 来获取 CourseInstructor table 中的所有行。
通常我想我会这样做,/courses?name=coursename
如果我正在搜索课程。而且,我可能会使用端点 /courses/{courseId}/instructors/{instructorId}
在多对多 table.
因此,我很好奇这样的东西是否可行:/courses?name=coursename/instructors
(这甚至可能吗?)
另一种选择是使用另一个名为 /coursesinstructors
的端点,我可以使 /courseinstructor?name=coursename
获得结果。
或者我应该通过以下方式调用 2 次来获取结果:
- 通过/courses?name=coursename
获取id
- 并跟随 courses/{id}/instructors
除了我上面提出的建议和解决方案之外,我对任何其他建议和解决方案持开放态度(不确定我的解决方案是否正确)。
对于第一种情况,这实际上取决于您的用例是什么。 GET /courses/instructors
意味着(只)找回讲师,所以我个人只选择 GET /courses
和 embed 讲师。
至于第二种情况,/courses?name=coursename
应该足够好(再加上 /courses/{courseId}/instructors/{instructorId}
以深入到特定条目)。 2 次调用是另一个有效选项。然而,根据 RFC 3986.
/courses?name=coursename/instructors
这样的 URL 似乎无效
如果您确实需要 (1),所有课程-教师配对的完整转储,那么我认为您最好的选择是支持
GET /course-instructors
GET /course-instructors?courseName=whatever
然后您可以 link 或嵌入课程和讲师。
{
"course": "/courses/12",
"instructor": "/instructors/54"
}
{
"course": {
"name": "Political Science",
...
},
"instructor": {
"name": "Hober Mallow",
...
}
}
您 return 取决于客户的需求。也许您 return 缩写信息加上 link 到完整表示,或者 return 只是 link 是可以的,因为课程和讲师(应该是!)高度可缓存。
顺便说一句,我认为您最好停止考虑数据库如何存储数据,而是考虑客户需要从您的 API.