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) | name | |
---|---|---|
1 | Tom | tom@example.com |
2 | Jerry | jerry@example.com |
orders
表
id (PK) | user_id (FK) | product |
---|---|---|
101 | 1 | Laptop |
102 | 2 | Smartphone |
在查询某个用户的订单时,我们通常使用 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 的 嵌套文档 让读取速度更快,但 引用方式 更适合大规模数据。