MongoDB ObjectId外键实现建议

MongoDB ObjectId外键实现建议,mongodb,foreign-keys,pymongo,database,nosql,Mongodb,Foreign Keys,Pymongo,Database,Nosql,我正在寻找关于如何最好地实现MongoDB外键ObjectId字段的建议。似乎有两个可能的选项,要么包含嵌套的\u id字段,要么不包含 查看下面的fkUid字段 {'_id':ObjectId('4ee12488f047051590000000'), 'fkUid':{'_id':ObjectId('4ee12488f047051590000001')} } 或 任何建议都将不胜感激。我很难想出在其中添加一个额外字段“层”的任何可能优势,因此我个人只需将ObjectId直接存储在fkUid

我正在寻找关于如何最好地实现MongoDB外键
ObjectId
字段的建议。似乎有两个可能的选项,要么包含嵌套的
\u id
字段,要么不包含

查看下面的fkUid字段

{'_id':ObjectId('4ee12488f047051590000000'), 'fkUid':{'_id':ObjectId('4ee12488f047051590000001')} } 


任何建议都将不胜感激。

我很难想出在其中添加一个额外字段“层”的任何可能优势,因此我个人只需将
ObjectId
直接存储在
fkUid

中,我很难想出添加额外字段的任何可能优势“layer”在那里,所以我个人会直接将
ObjectId
存储在
fkUid

中。如果你的问题是关于字段的命名(标题中的内容),通常惯例是以它所指的对象命名。

如果你的问题是关于字段的命名(标题中的内容),通常惯例是以它所引用的对象命名。

我建议使用默认的dbref实现,如下所述,它与大多数特定的语言驱动程序兼容。

我建议使用默认的dbref实现,如下所述,它与大多数特定的语言驱动程序兼容

你提到的两种方法都有相同的含义,但它们有不同的用法

像存储fkUid一样存储fkUid
'fkUid':{u id':ObjectId('4ee12488f04070519000001')}
一个对象有它自己的优点。让我举一个例子,假设有一个网站,用户可以发布图像,也可以查看其他用户发布的图像。但是,当显示图像时,该网站还显示用户的名称/用户名。通过这种方式,您还可以存储详细信息,如
'fkUid':{u id':ObjectId('4ee12488f047051590000001'),用户名:'SOME_X'}
。从数据库获取详细信息时,无需再次发送请求即可获取特定
\u id的用户名


其中,与第二种方法一样,ObjectId('4ee12488f047051590000001')}
您必须向服务器发送另一个请求,仅用于获取名称/用户名,而没有其他有用的内容来自同一对象。

您提到的两种方法具有相同的含义。但它们有不同的用法

像存储fkUid一样存储fkUid
'fkUid':{u id':ObjectId('4ee12488f04070519000001')}
一个对象有它自己的优点。让我举一个例子,假设有一个网站,用户可以发布图像,也可以查看其他用户发布的图像。但是,当显示图像时,该网站还显示用户的名称/用户名。通过这种方式,您还可以存储详细信息,如
'fkUid':{u id':ObjectId('4ee12488f047051590000001'),用户名:'SOME_X'}
。从数据库获取详细信息时,无需再次发送请求即可获取特定
\u id的用户名


其中,与第二种方式“FQUID”相同:ObjectId('4ee12488f047051590000001')}}
您必须向服务器发送另一个请求,仅用于获取名称/用户名,而从同一对象中没有其他有用的内容。

完全同意。添加子文档会使查询更困难,更新更困难,占用更多空间,可能更慢。我也会删除“fk”前缀。如果您的
消息
具有
SenderId
这很明显。是的,同意删除前缀。完全同意。添加子文档会使查询更难,更新更难,占用更多空间,可能会更慢。我也会删除“fk”前缀。如果你的
邮件
SenderId
,这很明显。是的,同意删除前缀。我不同意。这docs中的引用很好地概括了这一点:“除非您有令人信服的理由使用DBrefs,否则请使用手动引用”。当然这取决于使用情况,但这不是一个好的一般做法建议。许多驱动程序会自动解析DBrefs“-这对我来说已经足够有说服力了。同时,在大型数据库结构中支持此类引用也更容易。我同意,对于完全确定自己在做什么的小型任务,使用直接引用就可以了。我不同意。docs的这段引文很好地总结了这一点:“除非您有令人信服的理由使用DBREF,否则请使用手动引用”。当然这取决于使用情况,但这不是一个好的一般做法建议。许多驱动程序会自动解析DBREF“-这对我来说已经足够有说服力了。而且,在大型数据库结构中支持此类引用更容易。我同意,对于完全确定自己在做什么的小型任务,使用直接引用是很好的。
{'_id':ObjectId('4ee12488f047051590000000'), 'fkUid':ObjectId('4ee12488f047051590000001')} }