2012-02-23 64 views
19

在MongoDB中使用DBREF datatype,文档可能如下所示。但是,每行中的$ref字段感觉是多余的,因为每行都明显指向users集合。MongoDB - 是DBREF必需的吗?

有没有办法引用其他文件,而没有多少有点多余$ref -field?

{ 
    $id: {$oid : "4f4603820e25f4c515000001"}, 
    title: "User group", 
    users: [ 
     {_id: {$ref: "users", $id: { $oid: "4f44af6a024342300e000002"}}, isAdmin: true } 
    ] 
], 
+4

是否有任何特定的原因,你为什么不使用简单的直接/手动链接(只是把ObjectId如下建议)? – 2012-02-23 11:51:27

回答

31

Dbref在我看来应该避免使用mongodb时,至少如果您需要可扩展性的大系统。

据我所知,所有的驱动程序都提出了额外的请求来加载DBRef,所以它不是'加入'在数据库中,它是非常昂贵的。

有没有一种方法可以引用其他文件,而不需要多余的$ ref-field? ?

是,保留引用在脑海中,创建“外键”(类似RefUserId或只是用户ID)命名约定和存储只是引用文件的ID。在需要时自行加载参考文件。对于任何非规范化,嵌入你也可以这样做,因为它通常会大大提高性能。

+3

这不是使用DBRef或者仅仅是_id的真正问题,而是如何使用链接语义来解决它们。如果你有不同的引用(多个集合),那么你将需要集合和_id == DBRef。 – 2012-02-23 15:30:34

+1

只需重复Scott一点:如果您在同一个集合中引用对象,则可以使用ObjectId字段 – 2012-02-23 18:22:10

+0

,以便将来更新的代价更高?因为更新没有引用需要更新整个收藏嗯? – 2015-11-15 13:02:26

6

除非您使用驱动程序特定的方法访问dbref,否则应该没有必要。

在手动管理连接的情况下(即您知道要“连接”到的其他集合),仅存储ObjectId就足够了。

2

docs

Manual references是一种替代,和the docs say手册参考文献是优选DBREFS(though I'm not sure why)。 当引用的对象位于另一个数据库中或集合名称不会很明显时,DBREF很有用。

非规范化/嵌入比任何类型的链接更可取,因为这样你就可以获得原子更新并且不需要重新查询相关数据。