目录
MongoDB 关系概述
在关系型数据库中,数据通过表格中的列和行的结构关联在一起。而在 MongoDB 这样的 NoSQL 数据库中,数据通常是以文档(JSON 或 BSON 格式)存储的。由于 MongoDB 是一个面向文档的数据库,它的“关系”模型与传统关系数据库有所不同。
MongoDB 中并没有类似于关系型数据库的外键或连接操作。取而代之的是,MongoDB 提供了两种主要的方式来实现“关系”或数据之间的连接:
- 数据嵌套(Embedding):将相关的数据嵌套在同一个文档中。
- 数据引用(Referencing):在不同的文档中存储数据的引用(类似于关系数据库中的外键)。
这两种方式可以单独使用,也可以组合使用,具体选择哪种方式取决于业务需求和数据访问模式。
MongoDB 数据库引用
数据库引用通常使用文档中的字段保存另一个文档的 _id
来表示两个文档之间的关系。与关系型数据库中的外键相似,引用关系允许文档之间的关联。
示例:引用关系
假设有两个集合:users
(用户)和 orders
(订单)。每个订单都与一个用户关联。
- 插入用户文档
<?php
$collection = $database->users;
$user = [
'_id' => new MongoDB\BSON\ObjectId(),
'name' => 'John Doe',
'email' => 'johndoe@example.com'
];
$result = $collection->insertOne($user);
echo "Inserted user with ID: " . $result->getInsertedId() . "\n";
?>
- 插入订单文档,引用用户
<?php
$collection = $database->orders;
$order = [
'order_id' => 'A123',
'user_id' => $user['_id'], // 引用用户的 _id
'total' => 100.50,
'status' => 'Pending'
];
$result = $collection->insertOne($order);
echo "Inserted order with ID: " . $result->getInsertedId() . "\n";
?>
通过在订单文档中存储用户的 _id
,我们建立了 orders
集合和 users
集合之间的引用关系。为了查询某个用户的所有订单,可以通过查询订单集合中的 user_id
字段来实现。
MongoDB 数据嵌套
数据嵌套是指将相关的数据嵌入到同一个文档中,这样可以避免通过引用关系进行多次查询。数据嵌套特别适用于“关系紧密”的数据,或当数据不会频繁更新时。
示例:数据嵌套
假设我们将订单和订单项嵌套在同一个用户文档中,而不是在订单集合中进行引用。
- 插入带嵌套订单文档
<?php
$collection = $database->users;
$user = [
'_id' => new MongoDB\BSON\ObjectId(),
'name' => 'John Doe',
'email' => 'johndoe@example.com',
'orders' => [
[
'order_id' => 'A123',
'total' => 100.50,
'status' => 'Pending',
'items' => [
['item_id' => 'P001', 'quantity' => 2, 'price' => 50.25],
['item_id' => 'P002', 'quantity' => 1, 'price' => 25.00]
]
]
]
];
$result = $collection->insertOne($user);
echo "Inserted user with ID: " . $result->getInsertedId() . "\n";
?>
在这个例子中,订单数据完全嵌套在用户文档中的 orders
字段下。这种方式避免了连接查询,也提升了读取效率,尤其是在数据关系简单并且不会频繁更新的情况下。
参考资料
如需更多帮助或信息,请访问 www.52kanjuqing.com。
发表回复