在无SQL数据库中构建关系的最佳方法?

时间:2014-08-25 04:31:51

标签: mongodb

我使用的是MongoDB。我知道MongoDB不是关系型的,但有时候信息也是如此。那么,引用这些关系以减少数据库负载和最大化查询速度的最有效方法是什么?

示例:

* Tinder-style"匹配" *

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的个人资料页面上并且你想要显示他所有比赛的firstName,那么这是否正常?

任何可以更好地运作的替代结构?

*在线论坛*

我想你可以拥有以下系列:

用户

主题

用户收藏:

{
  _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。

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

但是,每次在客户端上查看此线程时,它都会使系统不会通过作者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"
    }
]
}

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

1 个答案:

答案 0 :(得分:3)

如果数据真的很多,即一个人可以有许多匹配,并且在第一个例子中可以匹配很多,那么通常最好选择关系。

反对关系的主要论据源于mongodb不是关系数据库所以不存在外键约束或连接语句等事情。

在许多情况下(许多情况下,两个以上)需要考虑的权衡要么是自己强制执行关键约束,要么管理多个文档中可能存在的数据不一致(最后一个例子)。在大多数情况下,关系方法比这些情况的嵌入方法更实用。

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

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

但最终这一切都归结为考虑到你可以忍受多少不一致以及你真正需要多快访问数据(如果我有一些话题可以让老头像持续几天节省半秒的页面加载时间?)。


修改

mongodb博客上的架构设计系列可能适合您:part1part2part3