node.js - 有关MongoDB数据库设计的问题

 mobiledu2502882543 发布于 2022-11-08 07:21

问题一:是否collection越少越好,尽量把关系数据库中分表表示的关系嵌套进文档里?
问题二:如果这样的话,一句SQL能搞定的复杂查询,mongodb也许要查询多次。mongodb的查询速度是否还比sql数据库快?
问题三:那mongodb的优势体现在哪?超大规模数据的mapreduce?方便拓展?

我来举个栗子吧:

假设mysql中是这样的(意思意思):

authors (
    int id,
    char name,
    int age,
    char email
)

articles (
    int id,
    char title,
    char content,
    long viewCount,
    int author_id
)

那么MongoDB中就可能是这个样子:

  • 只有一个authors collection
    author {
        _id: new ObectID("blublublu"),
        name: 'portwatcher',
        age: '19',
        email: 'root@pwhack.me',
        articles: [{
            title: 'you guess',
            content: 'I am content',
            viewCount: 52345
        }, ...]
    }

问题来了,如果我要单独查出所有作者的文章,并按浏览量来排序,要如何做?

  • 于是有了第二种设计方法,这也是nosql = not only sql的体现。有authors和articles两个collection
    author {
        _id: new ObectID("blublublu"),
        name: 'portwatcher',
        age: '19',
        email: 'root@pwhack.me'
    }

    article {
        _id: new ObjectID("lalalala"),
        title: 'you guess',
        content: 'I am content',
        viewCount: 52345,
        author_id: 'blublublu'
    }

现在的问题是,如果我要把文章和作者的名字一起返回要怎么办?
1. 是不是要查两次,连两次?如果连一次的话,有一些paas是不支持的(比如说bae,亲测不支持)。这样是否有失优雅?
2. 如果在article里存一份author.name的话,当某个作者改了名字,文章显示的作者名将无法更新,如果硬要一起更新,开销是否太大?
3. DBRef何时用比较合适?在这里,要怎么用?

在这里栗子中,总结一下我们需要的东西:

  • 所有作者旗下的文章可以全部聚合返回,并按某种方式排序
  • 文章可以和与之匹配的作者名一起返回
  • 作者可以编辑自己的资料
  • 文章和作者都可以单独插入

可能比较啰嗦,大家谅解。

要是有人能总结一下mongodb数据库设计的一些原则就更好了~

3 个回答
    • 在做 web 开发的时候,表设计方面,NoSql 和 Mysql 应该没什么区别。主要是 MongoDB 支持的数据类型多,比如:Array。所以说并不是 collection 越少越好,而是根据易维护和易拓展进行设计。

    • 既然采用分成多表存的话,肯定就就需要多查几次。性能问题可以忽略不计。

    • 这样的问题网上讨论很多,搜搜看。

    2022-11-12 01:45 回答
  • MongoDB 有个叫 DBRef 的功能, 可以引用另一个集合甚至另一个数据库里的记录,但目前这个功能在某些语言的驱动中支持还不是很好,不是很推荐,至于教程,应该可以搜到不少吧。

    至于数据库结构的设计,我认为应该从查询的角度来设计,你希望以后做什么样的查询,就怎样设计数据库。
    比如如果你每次获取作者的时候都需要他的所有文章,就可以考虑第一种设计。

    就作者和文章这个例子而言,我觉得采用第二种好一些。确实需要查两次数据库,但是你可以通过更高速的缓存,比如 Memcache 来减少查询作者的那一次查询,因为毕竟作者的更新频率要低一些。

    2022-11-12 01:45 回答
  • mongodb不是rdbms。你尽可以随意发起任何select类型查询。比如

    for ($i=0,$j<100000000;$i<$j;$i++)
        $author = $mongo->getCollection('db','table')->findOne(array('author_id'=>id),array('author_name'=>1));
        echo $author['author_name'];
    

    mysql,这样你就是疯了。mongodb,这样,很好。

    你要根本的观念上认为:mongodb是绝对有别于MySQL的。

    当然,不可否认的是,查询越少越好- -#

    2022-11-12 01:45 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有