在关系数据库中和nosql的设计时,对于schema的设计是不同的.比如MYSQL中,设计如下一个例子:
这个如果要转换为mongodb要如何设计呢,首先一个方法是全部放在一个collection中,如
这样的话,如果要查询people的所有信息,放在同一个collection中是很快的,当然也可以分开两个collection进行嵌套,如:
甚至可以这样:
如果是大部分只查询people的本身信息的话,那么建议分开两个collection存放,避免每次把不需要加载的信息加载进去了.
mysql> select * from people;
+----+------------+
| id | name |
+----+------------+
| 1 | Stephane |
| 2 | John |
| 3 | Michael |
| 4 | Cinderella |
+----+------------+
mysql> select * from passports;
+----+-----------+---------+-------------+
| id | people_id | country | valid_until |
+----+-----------+---------+-------------+
| 4 | 1 | FR | 2020-01-01 |
| 5 | 2 | US | 2020-01-01 |
| 6 | 3 | RU | 2020-01-01 |
+----+-----------+---------+-------------+
这个如果要转换为mongodb要如何设计呢,首先一个方法是全部放在一个collection中,如
> db.people_all.find().pretty()
{
"_id" : ObjectId("51f7be1cd6189a56c399d3bf"),
"name" : "Stephane",
"country" : "FR",
"valid_until" : ISODate("2019-12-31T23:00:00Z")
}
{
"_id" : ObjectId("51f7be3fd6189a56c399d3c0"),
"name" : "John",
"country" : "US",
"valid_until" : ISODate("2019-12-31T23:00:00Z")
}
{
"_id" : ObjectId("51f7be4dd6189a56c399d3c1"),
"name" : "Michael",
"country" : "RU",
"valid_until" : ISODate("2019-12-31T23:00:00Z")
}
{ "_id" : ObjectId("51f7be5cd6189a56c399d3c2"), "name" : "Cinderella" }
这样的话,如果要查询people的所有信息,放在同一个collection中是很快的,当然也可以分开两个collection进行嵌套,如:
> db.people_embed.find().pretty()
{
"_id" : ObjectId("51f7c0048ded44d5ebb83774"),
"name" : "Stephane",
"passport" : {
"country" : "FR",
"valid_until" : ISODate("2019-12-31T23:00:00Z")
}
}
{
"_id" : ObjectId("51f7c70e8ded44d5ebb83775"),
"name" : "John",
"passport" : {
"country" : "US",
"valid_until" : ISODate("2019-12-31T23:00:00Z")
}
}
{
"_id" : ObjectId("51f7c71b8ded44d5ebb83776"),
"name" : "Michael",
"passport" : {
"country" : "RU",
"valid_until" : ISODate("2019-12-31T23:00:00Z")
}
}
{ "_id" : ObjectId("51f7c7258ded44d5ebb83777"), "name" : "Cinderella" }
甚至可以这样:
> db.passports_embed.find().pretty()
{
"_id" : ObjectId("51f7c7e58ded44d5ebb8377b"),
"country" : "FR",
"valid_until" : ISODate("2019-12-31T23:00:00Z"),
"person" : {
"name" : "Stephane"
}
}
{
"_id" : ObjectId("51f7c7ec8ded44d5ebb8377c"),
"country" : "US",
"valid_until" : ISODate("2019-12-31T23:00:00Z"),
"person" : {
"name" : "John"
}
}
{
"_id" : ObjectId("51f7c7fa8ded44d5ebb8377d"),
"country" : "RU",
"valid_until" : ISODate("2019-12-31T23:00:00Z"),
"person" : {
"name" : "Michael"
}
}
{
"_id" : ObjectId("51f7c8058ded44d5ebb8377e"),
"person" : {
"name" : "Cinderella"
}
}
如果是大部分只查询people的本身信息的话,那么建议分开两个collection存放,避免每次把不需要加载的信息加载进去了.