这是一个普遍的问题,我为了更好地说明我的意思而做了一个例子。
假设我有一个用户模型和一个锦标赛模型,并且锦标赛模型有一个用户ID及其分数的键/值映射。当将它作为GraphQL API公开时,我可以或多或少直接公开它:
Schema {
tournament: {
scores: [{
user: User
score: Number
}]
}
user($id: ID) {
id: ID
name: String
}
}
这样可以访问所有数据。但是,在许多情况下,在特定锦标赛中获得用户的分数或从锦标赛中获得某个用户的分数可能是有用的。换句话说,有许多边缘看起来很方便,我可以添加:
Schema {
tournament: {
scores: [{
user: User
score: Number
}]
userScore($userID: ID): Number # New edge!
}
user($id: ID) {
id: ID
name: String
tournamentScore($tournamentID: ID): Number # New edge!
}
}
这对于客户端来说可能更实用,可以方便地覆盖更多用例。另一方面,我暴露的越多,我就越需要维护。
我的问题是:一般情况下,慷慨大方是不是更好?"并在适当的位置暴露节点之间的许多边缘(因为它使客户端更容易),或者是否更好地编写代码并且只显示获取数据所需的数量(因为维护起来较少)?
当然,在这个微不足道的例子中,无论如何都不会产生太大的影响,但我觉得在设计更大的API时这些可能是重要的问题。
答案 0 :(得分:1)
我可以把它写成评论,但我不禁强调以下几点作为答案:
始终关注YAGNI principle。维护越少越好。一个好的API设计不是关于它有多大,它关乎它满足需求有多好,它是多么容易使用。
您可以随时在需要时添加新字段(在您的示例中称为edge)。 KISS很好。
答案 1 :(得分:1)
或者你可以这样做
Schema {
tournament: {
scores(user_ids: [ID]): [{
user: User
score: Number
}]
}
user($id: ID) {
id: ID
name: String
tournaments(tournament_ids: [ID]): [{
tournament: Tournament
score: Number
}]
}
}
由于user_ids
和tournament_ids
不是强制性的,因此用户可以决定获取所有边缘,一些或一个。