【问题标题】:MongoDB ObjectId foreign key implementation recommendationMongoDB ObjectId外键实现推荐
【发布时间】:2012-01-16 06:57:20
【问题描述】:

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

看看下面的 fkUid 字段。

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

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

任何建议将不胜感激。

【问题讨论】:

    标签: mongodb foreign-keys pymongo database nosql


    【解决方案1】:

    我很难想出在其中放置额外字段“层”的任何可能优势,因此我个人会将ObjectId 直接存储在fkUid 中。

    【讨论】:

    • 完全同意。添加子文档会使查询更难、更难更新、占用更多空间并且可能更慢。我也会删除“fk”前缀。如果你的Message 有一个SenderId,那是很明显的。
    • 是的,同意删除该前缀。
    【解决方案2】:

    如果您的问题是关于字段的命名(您在标题中的内容),通常约定是在它所引用的对象之后对其进行命名。

    【讨论】:

      【解决方案3】:

      我建议使用默认的 dbref 实现,此处描述为 http://www.mongodb.org/display/DOCS/Database+References,并且与大多数特定语言驱动程序兼容。

      【讨论】:

      • 我不同意。来自 docs 的这句话很好地总结了它:“除非您有使用 DBrefs 的令人信服的理由,否则请使用手动引用”。当然,这取决于使用案例,但这不是一个好的通用实践建议。
      • “许多驱动程序会自动解析 DBRefs”——这对我来说已经足够引人注目了。此外,在大型数据库结构中支持此类引用也更容易。我同意,对于您完全确定自己在做什么的小任务,使用直接引用就可以了。
      【解决方案4】:

      你提到的这两种方式是同一个意思。但它们有不同的用途。

      'fkUid':{'_id':ObjectId('4ee12488f047051590000001')} 一样存储fkUid 对象有它自己的优点。让我举个例子,假设有一个网站,用户可以在其中发布图像并查看其他用户发布的图像。但是在显示图像时,网站还会显示用户的姓名/用户名。通过使用这种方式,您还可以存储'fkUid':{'_id':ObjectId('4ee12488f047051590000001'), username: 'SOME_X'} 等详细信息。当您从数据库获取详细信息时,您不必再次发送请求来获取特定 _id 的用户名。

      在第二种方式'fkUid':ObjectId('4ee12488f047051590000001')} } 中,您必须向服务器发送另一个请求,仅用于获取名称/用户名,并且从同一个对象中没有其他用处。

      【讨论】:

        猜你喜欢
        • 2019-03-15
        • 2012-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-05
        • 2021-04-24
        相关资源
        最近更新 更多