当前位置: 首页 > article >正文

MongoD和关系型数据库相关概念的对应

MongoDB(NoSQL)中,文档(Document)、集合(Collection)等概念与 关系型数据库(RDBMS) 的表、行等概念有一定的对应关系。可以用下面的表格来对比它们的概念:

MongoDB(NoSQL)关系型数据库(RDBMS)解释
数据库(Database)数据库(Database)一个存储数据的整体,包含多个集合(表)
集合(Collection)表(Table)由多个文档组成的集合,类似于表,但无固定模式(Schema-less)
文档(Document)行(Row)单条数据,存储为 BSON(类似 JSON),在 RDBMS 中是行
字段(Field)列(Column)文档中的键值对(Key-Value),类似于关系数据库中的列
索引(Index)索引(Index)提高查询速度,类似于 RDBMS 的索引
嵌套文档(Embedded Document)表关联(Join)在文档中嵌套子文档,相当于 RDBMS 中的外键表,但不需要 Join
主键 _id(ObjectId)主键(Primary Key)_id 字段是默认的唯一标识,类似于关系型数据库中的主键
引用(Reference)外键(Foreign Key)在一个文档中存储另一个文档的 _id,类似于外键关系

举例说明

关系型数据库(MySQL)

假设有两个表:users(用户表) 和 orders(订单表),它们通过 user_id 关联:

users
id (PK)nameemail
1Tomtom@example.com
2Jerryjerry@example.com
orders
id (PK)user_id (FK)product
1011Laptop
1022Smartphone

在查询某个用户的订单时,我们通常使用 JOIN

SELECT users.name, orders.product 
FROM users
JOIN orders ON users.id = orders.user_id;

在 MongoDB 中

MongoDB 使用 文档 代替行,嵌套文档 代替外键关系:

嵌套文档方式
{
    "_id": ObjectId("6501a23b1a2b3c4d5e6f7890"),
    "name": "Tom",
    "email": "tom@example.com",
    "orders": [
        { "order_id": 101, "product": "Laptop" },
        { "order_id": 102, "product": "Smartphone" }
    ]
}

查询某个用户的订单非常方便:

db.users.find({ name: "Tom" });

优点:

  • 查询时不需要 JOIN,速度更快。
  • 数据读取方便,直接获取用户及其订单信息。

缺点:

  • 适用于数据更新较少的情况,如果订单信息需要频繁修改,嵌套文档可能会导致冗余数据。

引用(Reference)方式

如果订单较多,可以存储 user_id 进行引用:

{
    "_id": ObjectId("6501a23b1a2b3c4d5e6f7890"),
    "name": "Tom",
    "email": "tom@example.com"
}
{
    "_id": ObjectId("7601b45c2d3e4f5g6h7i8901"),
    "user_id": ObjectId("6501a23b1a2b3c4d5e6f7890"),
    "product": "Laptop"
}

查询时类似 SQL 需要 $lookup

db.users.aggregate([
    {
        $lookup: {
            from: "orders",
            localField: "_id",
            foreignField: "user_id",
            as: "orders"
        }
    }
]);

适用场景:

  • 适用于 订单数据量很大,但用户信息不会频繁更新的情况。

总结

场景MongoDB 方案关系型数据库 方案
小型数据、少量关系嵌套文档一张表或简单关联
数据较大、查询性能重要嵌套文档或索引引用索引优化的 JOIN
数据分布广泛、需要灵活查询引用 + $lookup标准外键表设计

MongoDB 的 嵌套文档 让读取速度更快,但 引用方式 更适合大规模数据。


http://www.kler.cn/a/579864.html

相关文章:

  • PyTorch 张量数据类型定义和转换
  • 【Linux内核系列】:深入理解缓冲区
  • 在ubuntu 24 命令行 下,制作无人值守ubuntu-24.04.2-desktop 桌面版安装U盘
  • 《深入理解Linux:高效崩溃分析与实时栈回溯技巧》
  • 操作系统知识点25
  • OCR图片识别原理
  • C++:面向对象之多态(运算符重载)
  • AF3 squeeze_features函数解读
  • Vue3 Pinia 符合直觉的Vue.js状态管理库
  • 超越经典:量子通信技术的发展与未来
  • MySQL8.0窗口函数
  • HTML 表格详解(简单易懂较详细)
  • 云服务运维智能时代:阿里云操作系统控制台
  • 利用paddleocr解决图片旋转问题
  • 死锁的产生以及如何避免
  • PAT乙级(1091 N-自守数)C语言解析
  • 日期类、Date、Calendar、IO 流、File
  • Windows简易操作(二)
  • Science Advances 多功能粘性皮肤增强了机器人与环境的交互
  • JavaScript网页设计案例:打造动态与交互性并存的用户体验