mongodb 如何设计表

“我有丰富的sql使用经验,但是我是个MongoDB的初学者。我应该如何在MongoDB中针对一对多关系进行建模?”这是我被问及最多的问题之一。

我没法简单的给出答案,因为这有很多方案去实现。接下来我会教导你如何针对一对多进行建模。

这个话题有很多内容需要讨论,我会用三个部分进行说明。在第一部分,我会讨论针对一对多关系建模的三种基础方案。在第二部分我将会覆盖更多高级内容,包括反范式化和双向引用。在最后一部分,我将会回顾各种选择,并给出做决定时需要考虑的因素。

很多初学者认为在MongoDB中针对一对多建模唯一的方案就是在父文档中内嵌一个数组子文档,但是这是不准确的。因为你可以在MongoDB内嵌一个文档不代表你就必须这么做。

当你设计一个MongoDB数据库结构,你需要先问自己一个在使用关系型数据库时不会考虑的问题:这个关系中集合的大小是什么样的规模?你需要意识到一对很少,一对许多,一对非常多,这些细微的区别。不同的情况下你的建模也将不同。

Basics: Modeling One-to-Few

一对很少
针对个人需要保存多个地址进行建模的场景下使用内嵌文档是很合适,可以在person文档中嵌入addresses数组文档:
image.png

这种设计具有内嵌文档设计中所有的优缺点。最主要的优点就是不需要单独执行一条语句去获取内嵌的内容。最主要的缺点是你无法把这些内嵌文档当做单独的实体去访问。

例如,如果你是在对一个任务跟踪系统进行建模,每个用户将会被分配若干个任务。内嵌这些任务到用户文档在遇到“查询昨天所有的任务”这样的问题时将会非常困难。我会在下一篇文章针对这个用例提供一些适当的设计。

Basics: One-to-Many

一对许多
以产品零件订货系统为例。每个商品有数百个可替换的零件,但是不会超过数千个。这个用例很适合使用间接引用—将零件的objectid作为数组存放在商品文档中(在这个例子中的ObjectID我使用更加易读的2字节,现实世界中他们可能是由12个字节组成的)。

每个零件都将有他们自己的文档对象
image.png

每个产品的文档对象中parts数组中将会存放多个零件的ObjectID :

image.png

在获取特定产品中所有零件,需要一个应用层级别的join

为了能快速的执行查询,必须确保products.catalog_number有索引。当然由于零件中parts._id一定是有索引的,所以这也会很高效。

这种引用的方式是对内嵌优缺点的补充。每个零件是个单独的文档,可以很容易的独立去搜索和更新他们。需要一条单独的语句去获取零件的具体内容是使用这种建模方式需要考虑的一个问题(请仔细思考这个问题,在第二章反反范式化中,我们还会讨论这个问题)

这种建模方式中的零件部分可以被多个产品使用,所以在多对多时不需要一张单独的连接表。

Basics: One-to-Squillions

一对非常多
我们用一个收集各种机器日志的例子来讨论一对非常多的问题。由于每个

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: mongodb订单设计应该包含如下内容: 1. 订单号:唯一标识订单的字符串,可以使用 uuid 生成。 2. 用户信息:订单所属的用户的信息,包括用户名、电话、地址等。 3. 商品信息:订单中所购买的商品的信息,包括商品名、数量、单价等。 4. 订单状态:订单的当前状态,可能的值有:已下单、已付款、已发货、已收货、已评价等。 5. 下单时间:订单创建的时间。 6. 付款时间:订单付款的时间。 7. 发货时间:订单发货的时间。 8. 收货时间:订单收货的时间。 9. 评价时间:订单评价的时间。 10. 备注:可以存储其他有关订单的信息,如配送方式、发票信息等。 在设计结构时,应该尽量考虑中信息的可扩展性和灵活性,以便更好地满足业务需求的变化。 ### 回答2: MongoDB是一种非关系型数据库,适用于存储和处理大量的非结构化数据。在设计mongodb订单时,可以考虑以下几个方面: 1. 数据模型设计:在mongodb中,可以使用嵌入式模型或引用模型来示订单。对于嵌入式模型,可以直接在订单集合中嵌入订单项信息,例如订单号、订单日期、产品名称、数量等。而引用模型则可以将订单集合和订单项集合分开,使用引用关系来存储订单项的详细信息,例如订单号、订单日期等作为链接字段。 2. 索引设计:根据查询需求,可以设计合适的索引来优化查询性能。例如,可以为订单号、订单日期等常用于查询的字段创建索引,加快查询速度。 3. 数据一致性和容错性:考虑到数据一致性和容错性,可以使用mongodb的副本集或分片集群来保障数据可靠性。副本集可以提供数据的冗余备份,以防主节点故障。而分片集群可以将数据分布到多个节点上,提高系统的容量和可扩展性。 4. 数据安全性:为了保护数据安全,可以采用mongodb的身份验证和访问控制机制。可以为数据库用户设置不同的角色和权限,限制对订单的操作。 总的来说,mongodb订单设计需要根据具体业务需求和查询性能来选取合适的数据模型、索引设计和数据存储方案,以及考虑数据的一致性、容错性和安全性。 ### 回答3: MongoDB的订单设计需要考虑以下几个方面: 1. 数据结构:订单中可以包含的字段包括订单号、下单用户、订单状态、订单金额、订单详情等。可以使用嵌套文档的方式将订单详情中的商品信息存储在订单中。 2. 唯一索引:订单号可以作为唯一索引,以确保每个订单号都是唯一的。这可以在查询特定订单时提高性能。 3. 存储结构:可以将订单的每个订单作为一个文档进行存储。可以使用ObjectId作为每个订单的唯一标识符,以便能够进行快速的插入和查询。 4. 查询优化:可以根据订单状态和下单用户等字段来建立索引,以便在查询特定状态或特定用户的订单时提高性能。 5. 适当的字段类型:尽量使用适当的字段类型来存储不同的数据,如使用字符串类型存储订单号、用户ID等,使用浮点型存储订单金额,使用布尔型存储订单状态等。 6. 考虑数据量:根据实际情况考虑数据量的预估,如果数据量较大,可以考虑使用分片来分布数据并提高读写性能。 综上所述,MongoDB的订单设计需要考虑数据结构、索引、存储结构、查询优化、字段类型和数据量等因素,以满足订单管理系统中的查询和写入需求,并提高性能和扩展性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值