【问题标题】:Best way to structure relationships in a no-SQL database?在非 SQL 数据库中构建关系的最佳方式?
【发布时间】:2015-03-29 12:06:35
【问题描述】:

我正在使用 MongoDB。我知道 MongoDB 不是关系型的,但信息有时是关系型的。那么,引用这些类型的关系以减轻数据库负载并最大化查询速度的最有效方法是什么?

例子:

* Tinder 风格的“匹配”*

Users 集合中有许多用户。它们相互匹配。

所以我在想:

Document 1:

{
    _id: "d3fg45wr4f343",
    firstName: "Bob",
    lastName: "Lee",
    matches: [
      "ferh823u9WURF",
      "8Y283DUFH3FI2",
      "KJSDH298U2F8",
      "shdfy2988U2Ywf"
    ]
}

文档 2:

{
    _id: "d3fg45wr4f343",
    firstName: "Cindy",
    lastName: "Doe",
    matches: [
      "d3fg45wr4f343"
    ]
}

如果有 10,000 名用户,并且您在 Bob 的个人资料页面上并且您想显示他所有匹配项的名字,这是否可行?

有没有更好的替代结构?

* 在线论坛 *

我想你可以有以下收藏:

用户

主题

用户收藏:

{
  _id: "d3fg45wr4f343",
  userName: "aircon",
  avatar: "234232.jpg"
}

{
  _id: "23qdf3a3fq3fq3",
  userName: "spider",
  avatar: "986754.jpg"
}

主题集合版本 1

主题集合中的一个示例文档:

{
title: "A spider just popped out of the AC",
dateTimeSubmitted: 201408201200,
category: 5,
posts: [
    {
        message: "I'm going to use a gun.",
        dateTimeSubmitted: 201408201200,
        author: "d3fg45wr4f343"
    },
    {
        message: "I don't think this would work.",
        dateTimeSubmitted: 201408201201,
        author: "23qdf3a3fq3fq3"
    },
    {
        message: "It will totally work.",
        dateTimeSubmitted: 201408201202,
        author: "d3fg45wr4f343"
    },
    {
        message: "ur dumb",
        dateTimeSubmitted: 201408201203,
        author: "23qdf3a3fq3fq3"
    }
]
}

主题集合第 2 版

主题集合中的一个示例文档。作者的头像和用户名现在嵌入到文档中。我知道:

这不是 DRY。

如果作者更改了他们的头像和用户名,则需要在主题集合和其中的所有帖子文档中更新这些更改。

但是,每次在客户端上查看此线程时,它都会使系统免于通过作者 ID 查询所有头像和用户名。

{
title: "A spider just popped out of the AC",
dateTimeSubmitted: 201408201200,
category: 5,
posts: [
    {
        message: "I'm going to use a gun.",
        dateTimeSubmitted: 201408201200,
        author: "d3fg45wr4f343",
        userName: "aircon",
        avatar: "234232.jpg"
    },
    {
        message: "I don't think this would work.",
        dateTimeSubmitted: 201408201201,
        author: "23qdf3a3fq3fq3",
        userName: "spider",
        avatar: "986754.jpg"
    },
    {
        message: "It will totally work.",
        dateTimeSubmitted: 201408201202,
        author: "d3fg45wr4f343",
        userName: "aircon",
        avatar: "234232.jpg"
    },
    {
        message: "ur dumb",
        dateTimeSubmitted: 201408201203,
        author: "23qdf3a3fq3fq3",
        userName: "spider",
        avatar: "986754.jpg"
    }
]
}

所以是的,我不确定哪个最好......

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    如果数据确实是多对多的,即一个可以有多个匹配项,并且在您的第一个示例中可以被多个匹配项匹配,通常最好使用关系。

    反对关系的主要论据源于 mongodb 不是关系数据库,因此没有外键约束或连接语句之类的东西。

    在多对多的情况下(许多比两个多),您必须考虑的权衡是自己强制执行关键约束,或者管理多个文档中可能存在的数据不一致(您的最后一个示例)。在大多数情况下,关系方法比嵌入方法更实用。

    异常可以读常写很少的例子。对于(一个非常构造的)示例,当在您的第一个示例中,将通过擦除所有先前的匹配并计算新匹配列表每天重新计算一次左右。在这种情况下,您将引入的数据不一致是可以接受的,并且通过嵌入匹配的名字节省的读取时间可能是一个优势。

    但通常对于多对多关系,最好使用关系方法并利用数组查询功能,例如{_id :{$in:[matches]}}。

    但归根结底,这一切都归结为考虑您可以忍受多少不一致以及您真正需要多快访问数据(如果我让某些主题使用旧头像几天可以吗?节省半秒的页面加载时间?)。


    编辑

    mongodb 博客上的架构设计系列可能适合您阅读:part1、part2 和 part3

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多