关系数据库和nosql设计schema时的差别的例子

在关系数据库中和nosql的设计时,对于schema的设计是不同的.比如MYSQL中,设计如下一个例子:


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存放,避免每次把不需要加载的信息加载进去了.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值