【发布时间】:2020-10-15 03:45:51
【问题描述】:
我正在编写一个应用程序,其中包含具有一些明显关系的整体数据模型。我开始使用 MongoDB 编写应用程序,但决定尝试过渡到 Postgres,因为我的数据有大量“外键”。为简单起见,让我们考虑以下模型:
class GameBase {
id: string
entryIds: string[]
submissionIds: string[]
}
class EntryBase {
id: string
description: string
gameId: string
userId: string // id of user who supplied entry
submissionIds: string[] // submissions where entry is covered
}
class SubmissionBase {
id: string
url: string
gameId: string
userId: string // id of user who submitted
entryIds: string[] // entries covered by submission
}
现在我明白了,如果我使用 TypeOrm 之类的工具,我可以通过以下方式检索这些关系:
const games = await gameRepository.find({ relations: ["entryIds", "submissionIds"] });
但我不确定这与 GraphQL 有什么关系。到目前为止,我一直在做的是在我的解析器中添加 @ResolveField 并编写类似
// game.resolver.ts
@ResolveField(() => [SubmissionBase], { nullable: true })
submissions(@Parent() game: GameBase) {
return this.submissionService.getManySubmissions(game.submissionIds)
}
在服务中
// game.service.ts
async getManySubmissions(submissionIds: string[]): Promise<SubmissionBase[]> {
if (!submissionIds) return []
return await this.submissionRepository.find({
where: {
id: { $in: submissionIds },
},
})
}
所以这对我来说很有意义并且一直工作得很好,我只是好奇如果我切换到关系数据库是否会看到切实的速度/性能改进。例如,如果您在我的服务中看到的相同 .find 方法由 Postgres 而不是 MongoDB 支持,并且建立了适当的外键关系,我可以合理地期望速度提高吗? 我想我不会,因为它只是一个没有连接的简单获取。此外,虽然 submitIds 是一个伪外键(因为 MongoDB),但在此设置中它仍然充当一个伪外键。如果您可以使用 GraphQL 和 @ResolveField 之类的东西来获取您需要的任何内容,我想我无法理解为什么 MongoDB 本质上是关系数据的错误选择。在这种情况下,由 GraphQL 支持的 RDS 的成功实施会是什么样子?
【问题讨论】:
标签: database orm graphql nestjs typeorm