我有很多球员和球队。球队是由很多球员组成的。玩家可以属于多个团队。我需要找到给定球队的哪些球员或给定球员在哪些球队。
最好使用 DBRefs,一个带有嵌入式团队的玩家集合,一个带有嵌入式玩家的团队集合,两个集合,或者其他什么,或者 MongoDB 在这里根本不是一个好的选择?
我有很多球员和球队。球队是由很多球员组成的。玩家可以属于多个团队。我需要找到给定球队的哪些球员或给定球员在哪些球队。
最好使用 DBRefs,一个带有嵌入式团队的玩家集合,一个带有嵌入式玩家的团队集合,两个集合,或者其他什么,或者 MongoDB 在这里根本不是一个好的选择?
我希望您已阅读此页面以及有关 MongoDB 模式设计的多个其他讨论 - 查看类似示例以及其他人正在考虑的内容会非常有帮助。
话虽如此,听起来您的数据集不会很大 - 是吗?如果是这种情况,它对性能的影响可能并不大,您可能应该首先努力设计,以使您的应用程序更清晰和易于访问。
我认为拥有一组球队和一组球员是合理的,然后决定是否要在每个球队中嵌入一组球员来代表该球队中的谁,或者在每个球员文档中嵌入一组球队指示他们所在的团队。该数组可以是 ID 或 ID 和名称等的数组。
无论您选择上述哪个,查询都很容易 - 如果您在球员中嵌入了球队数组,要找出特定球队中的所有球员,您只需查询数组中包含该球队的所有球员。查询可能类似于:
db.players.find({"teams.name":"TeamRocky"})
这将返回在其“团队”数组中具有该团队名称的玩家的所有玩家文档(这只是一个示例,您的实际实现可能完全不同)。如果您在每个团队文档中嵌入播放器数组,那将同样简单。
在决定这一点时要考虑的事情可能不仅包括您将如何查询数据,还包括您希望更新数据的方式和频率——球员是否会从一个团队转移到另一个团队?团队会解散吗?如果是,您是否必须跟踪他们的历史信息等?
我鼓励您尝试一些架构并构建一个小型原型,然后查看看起来有问题的地方并随着您对应用程序需求的熟悉而更改/改进架构。