gpt4 book ai didi

node.js - MongoDB 架构 : store id as FK or whole document

转载 作者:太空宇宙 更新时间:2023-11-03 22:57:06 26 4
gpt4 key购买 nike

我正在设计 MongoDB 结构(实际上是 NodeJS 应用程序中的模型结构)。我将拥有球员比赛收藏。

是只存储玩家参加的比赛的 ID,在每个玩家的对象中(就像 RDBM 中的 FK),还是将整个比赛对象存储在玩家对象中?

在应用程序中,操作之一是显示比赛的详细信息,在此 View 上,用户将看到参加该特定比赛的玩家(他们的姓名、国家/地区等)。这让我认为将整个 Match 文档存储在 Player 文档中会更好。

有什么建议吗?

最佳答案

我认为将整个 Match 文档存储在 Player 文档中并不是一个好的选择。每次球员参加比赛时,您的球员文档都需要更新。

您有 2 个主要选择:

1-) 使用子引用。 (指比赛中的球员)。

因此,如果我们想使用 Mongoose 模型来实现这一点:

玩家模型:

const mongoose = require("mongoose");

const playerSchema = mongoose.Schema({
name: String,
country: String
});

const Player = mongoose.model("Player", playerSchema);

module.exports = Player;

匹配模型:

const mongoose = require("mongoose");

const matchSchema = mongoose.Schema({
date: {
type: Date,
default: Date.now()
},
players: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Player"
}
]
});

const Match = mongoose.model("Match", matchSchema);

module.exports = Match;

使用这些模型,我们的比赛文档将如下所示(引用playerId):

{
"_id" : ObjectId("5dc419eff6ba790f4404fd07"),
"date" : ISODate("2019-11-07T16:19:39.691+03:00"),
"players" : [
ObjectId("5dc41836985aaa22c0c4d423"),
ObjectId("5dc41847985aaa22c0c4d424"),
ObjectId("5dc4184e985aaa22c0c4d425")
],
"__v" : 0
}

我们可以使用此路由来获取所有玩家信息的比赛信息:

const Match = require("../models/match");


router.get("/match/:id", async (req, res) => {
const match = await Match.findById(req.params.id).populate("players");

res.send(match);
});

结果将是这样的:

[
{
"date": "2019-11-07T13:19:39.691Z",
"players": [
{
"_id": "5dc41836985aaa22c0c4d423",
"name": "player 1",
"country": "country 1",
"__v": 0
},
{
"_id": "5dc41847985aaa22c0c4d424",
"name": "player 2",
"country": "country 1",
"__v": 0
},
{
"_id": "5dc4184e985aaa22c0c4d425",
"name": "player 3",
"country": "country 2",
"__v": 0
}
],
"_id": "5dc419eff6ba790f4404fd07",
"__v": 0
}
]

2-) 将玩家嵌入到比赛中,并且仍然保留独立的玩家集合。但这需要比第一个选项更多的空间。

因此,您的匹配在匹配集合中将如下所示:

    {
"date": "2019-11-07T13:19:39.691Z",
"players": [
{
"_id": "5dc41836985aaa22c0c4d423",
"name": "player 1",
"country": "country 1",
"__v": 0
},
{
"_id": "5dc41847985aaa22c0c4d424",
"name": "player 2",
"country": "country 1",
"__v": 0
},
{
"_id": "5dc4184e985aaa22c0c4d425",
"name": "player 3",
"country": "country 2",
"__v": 0
}
],
"_id": "5dc419eff6ba790f4404fd07",
"__v": 0
}

但是在获取比赛信息时,这可能会更快一些,因为不需要填充玩家信息。

const Match = require("../models/match");

router.get("/match/:id", async (req, res) => {
const match = await Match.findById(req.params.id);

res.send(match);
});

关于node.js - MongoDB 架构 : store id as FK or whole document,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58748173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com