[ mongoDB ] - 文档型数据库设计模式-如何存储树形数据

MongoDB树状数据存储技巧:第2部分 在讨论单一文档表示法(Single Document Schema)之前,我们需要了解其底层的数据模型。单一文档表示法是将相关联的数据存储在单一的MongoDB文档中。这种模型借鉴了文档数据库的灵活性,允许开发者将对象的所有相关数据一起存储,减少或避免了传统数据库中的外键和连接操作。这意味着开发者可以实现快速的读取操作,并且数据结构的变更相对简单,因为它不要求变更表结构或者进行复杂的迁移。引用关系存储是一种在文档之间建立关联的数据存储策略,它可以用来模拟实体之间的关系。 阅读详情

在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系。在传统的关系型数据库中,就已经产生了各种解决方案。

此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型数据库作为存储的几种设计模式。

A.关系型数据库设计模式1

id name parent_id
1 A NULL
2 B 1
3 C 1
4 D 2

上图表示了传统的设计方法之一,就是将树形结构的每一个结点作为关系型数据库中的一行进行存储,每一个结点保存一个其父结点的指针。

  • 优点:结构简单易懂,插入修改操作都很简单
  • 缺点:如果要获取某个结点的所有子结点,将是一件很恶心的事

B.关系型数据库设计模式2

id name parent_id left right
1 A NULL 1 8
2 B 1 2 5
3 C 1 6 7
4 D 2 3 4

上图在模式1的基础上多了两列,left和right,相当于btree中的左右分支,分别存储了左右分支结点的最大值和最小值。

  • 优点:要查找一个结点的子结点很容易,只需要做一个范围查询就行了(比如B节点的子结点,只需要查询 id >=2 && id<=5)
  • 缺点:由于树结构存在在这里面了,所以添加或修改已存在结点将可能产生连锁反应,操作过于复杂

C.文档型数据库设计模式1

{
  "name": "A",
  "children": [
    {"name": "B", "children": [{"name": "D"}]},
    {"name": "C"}
  ]
}

将整个树结构存成一个文档,文档结构既树型结构,简明易懂。

  • 优点:简明易懂
  • 缺点:文档会越来越大,对所有结点的修改都集中到这一个文档中,并发操作受限

D.文档型数据库设计模式2

{"_id": "A", "children": ["B", "C"]}
{"_id": "B", "children": ["D"]}
{"_id": "C"}
{"_id": "D"}

将每个结点的所有子结点存起来

  • 优点:结构简单,查找子结点方便
  • 缺点:查找父结点会比较麻烦

E.文档型数据库设计模式3

{
  "leaf": "A",
  "children": [
    {"leaf": "B", "children": [{"leaf": "D"}] },
    {"leaf": "C"}
  ]
}
{"_id": "A", ...}
{"_id": "B", ...}
{"_id": "C", ...}
{"_id": "D", ...}

充分利用文档型存储schema-less的优点,先利用上面C方案存存储一个大的树形文档,再将每一个结点的其他信息单独存储。

  • 优点:操作方便,结构上的操作可以直接操作大的树形文档,数据上的操作也只需要操作单条数据
  • 缺点:对所有结点的修改都集中到这一个文档中,并发操作受限

英文原文链接:Modeling a Tree in a Document Database

使用MongoDB存储类似层次结构的树 在MongoDB中使用NoSQL数据库存储树状结构的三种方法 立即下载

相关推荐

LTE 中设置voice/data centric的差异

1. 什么是voice centric和data centric Voice centric和data centric的差别在于以语音为中心还是以数据为中心。这里的以某某为中心可不是说说而已。举个栗子,UE一般搜网注册都会按照LUG(LTE->UMTS->GSM)或者LC(LTE->CDMA)的顺序进行,如果UE(未开通VOLTE)注册到LTE时,网络提示不支持语音,比如CSFB。UE就必须disable LTE后回到GU或者CDMA,否则留在不能语音的网络下,UE就会...

alimingh的博客 5234

MongoDB树形数据存储

MongoDB树形数据存储

u012632105的博客 969

CTP-API开发系列之三:柜台系统简介

综合交易平台(Comprehensive Transaction Platform,CTP)是专门为期货公司开发的一套期货经纪业务管理系统,由交易、风险控制和结算三大系统组成。接下来分享的内容,对于期货公司的负责交易、运维同事会比较熟悉,针对CTP-API接口对接的朋友可以了解一下,在接口之上的系统是怎样的。

码上助君的专栏 6202

[ mongoDB ] - 文档型数据库设计模式-如何存储树形数据 [转]

在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系。在传统的关系型数据库中,就已经产生了各种解决方案。 此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型数据库作为存储的几种设计模式。 A.关系型数据库设计模式1 id name parent_id 1 A NULL 2 B 1 3 C 1...

weixin_34258782的博客 798

matlab内读取文件目录时斜杠和反斜杠的使用

@matlab内读取文件目录时斜杠和反斜杠的使用TOC matlab内读取文件目录时,斜杠和反斜杠的使用 最近被斜杠和反斜杠弄晕了,于是总结了一下,在此和大家分享一下。 代码 clear; clc; close all; I1= imread('..\zs1.jpg'); %和代码文件夹同目录的图片 (纯反斜杠) I2= imread('../zs2/zs2.j...

weixin_44456694的博客 6575

上线之前多一道闸:业务审核系统的接入定义、双轨状态机与可靠生效闭环

运营后台“保存即生效”,让价格、库存、人群等配置每次修改都相当于一次无评审的上线。本文以至尊会员降价活动为例,系统拆解业务审核系统:用带业务语义的操作编码、规则化审核人与候选人快照、完整的生效回调契约做好接入定义;把业务改造为提交待生效,以不可变快照、字段级差异和唯一约束加幂等号防误配防重复;用审批轨与执行轨双轨状态机、链路式重新提交和以事件为准的审核链路理清状态;最后以发件箱、幂等键、超时先查后试、乐观锁与对账闭合生效环节,并结合两个可运行的Java程序,给出五种生效策略的事故率实测对比。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 6万+

MongoDB五种树形结构表示法

MongoDB五种树形结构表示法 MongoDB五种树形结构表示法 第一种:父链接结构 db.categories.insert( { _id: "MongoDB", parent: "Databases" } ) db.categories.insert( { _id: "dbm", parent: "Databases" } ) db.categori...

diaowojian9497的博客 1009

R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表

R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表示的是阳性样本的比例

data+scenario+science+insight 1226

什么是结构化数据?非结构化数据?半结构化数据?

结构化数据 结构化的数据是指可以使用关系型数据库表示和存储,表现为二维形式的数据。 一般特点是:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。 如mysql数据库中的数据、csv文件 非结构化数据 非结构化数据是指信息没有一个预先定义好的数据模型或者没有以一个预先定义的方式来组织。非结构化数据一般指大家文字型数据,但是数据中有很多诸如时间,数字等的信息。相对于传统的在数据库中或者标记好的文件,由于他们的非特征性和歧义性,会更难理解。 包括所有格式的办公文档、文本、图片、XML、HTM

Nickkun的博客 4万+

Python 陌生代码库阅读之道:从零起步到一周掌控 5 万行老项目的实战策略

文中特别强调"自顶向下+画图+注释"的基础阅读心法,并提供了具体的代码示例和命令行技巧。对于大型项目,建议先建立核心流程的骨架认知,再逐步填充细节,同时注重文档化和测试覆盖率的提升。 掌握这套方法后,开发者可以将陌生代码库的阅读效率提升3倍以上,在一周内建立起对5万行级别项目的整体掌控力。

铭渊老黄 507

告别手动读摘要!爬虫+大模型做学术助手:爬知网论文,10秒生成摘要+关键词(附完整代码)

知网的官方摘要往往冗长(200-300字),关键词可能不够精准,用大模型提炼“100字精简摘要”和“3-5个核心关键词”,更适合快速筛选文献。这套学术助手的核心价值,是把“找论文、读摘要、提关键词”这些重复劳动,交给爬虫和大模型自动化完成,让科研人从繁琐的文献整理中解放出来,把时间花在实验设计、数据分析等核心工作上。需要注意的是:爬取知网论文仅用于个人科研和学习,不得用于商业用途,遵守知网的用户协议和版权规定;大模型生成的摘要和关键词需后续核对原文,确保准确性。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1942

高效档案管理案例介绍:文档内容批量结构化解决方案解析

这种模块化处理不仅保留了档案的原始版式,还便于精细化的信息检索和批量分析,尤其适用于复杂排版的档案文件(如年鉴、杂志、报告等),显著提升了档案的可读性和易用性。档案馆中的文档在解析成数字化档案之前,首先要分析文件的布局,即识别文件的主要组成部分,例如标题、正文、表格、图像等。通过结构化的文档,档案可以实现更快速的信息检索和关联分析,为档案馆提供信息化、智能化、自动化的技术支撑,助力从被动管理向智能档案服务和数据价值挖掘的转型。平台首先识别文档的标题、正文、表格和图片区域,确保排版的完整性。

Luli2024的博客 1856

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数据库存储树形结构的数据

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近接触树形结构数据非

hffyyff的博客 1234

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

MONDODB如何存储树形数据

[ mongoDB ] - 文档型数据库设计模式-如何存储树形数据 [转] 在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系。在传统的关系型数据库中,就已经产生了各种解决方案。 此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型数据库作为存储的几种设计模式。 A.关系型数据库设计模式1 id name par...

diaowojian9497的博客 128

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MongoDB数据库学习

MongoDB作为分布式文档数据库,采用BSON格式存储键值对数据,集合相当于关系型数据库的表。初级学习需掌握基本概念、使用Compass图形工具/Python(PyMongo)连接数据库,创建数据库时需注意集合和文档的创建机制。中级内容涵盖模式设计(如分桶模式、树形模式)、副本集搭建(主从节点切换与数据同步)以及分片技术(数据拆分与集群管理)。分片适用于扩展RAM/磁盘空间、降低单机负载等场景。推荐结合MongoDB Atlas或Ops Manager简化运维。

Logintern09的博客 1348

MongoDB系列一:MongoDB文档型数据库特点介绍

一、MongoDB数据库的存储特点: 1、MongoDB是文档型数据库,存储的是文档(将json二进制化为Bson存储); 2、存储的每篇文档都可以有自己独特的存储结构,颠覆了传统数据库必须按照表和列字段规律存储的范式; 3、存储的每篇文档是以树形结构无限分支延伸(每个节点都可以数组形势追加),存储十分随意方便; 4、传统数据库的多张表关联才能实现的存储结构,文档型数据库可以以一篇文档存储...

weixin_30550081的博客 683

重新认识 键值型数据库、文档型数据库、搜索引擎数据库、列式数据库(二)

键值型数据库通过 Key-Value 键值的方式来存储数据,其中 Key 和 Value 可以是简单的对象,也可以是复杂的对象。Key 作为唯一的标识符,优点是查找速度快,在这方面明显优于关系型数据库,缺点是无法像关系型数据库一样使用条件过滤(比如 WHERE),如果你不知道去哪里找数据,就要遍历所有的键,这就会消耗大量的计算。键值型数据库典型的使用场景是作为内存缓存。Redis 是最流行的键值型数据库。此类数据库可存放并获取文档,可以是XML、JSON等格式。

AlbenXie的博客 309

MongoDB五种树形结构

MongoDB五种树形结构表示法 第一种:父链接结构 db.categories.insert( { _id: "MongoDB", parent: "Databases" } )db.categories.insert( { _id: "dbm", parent: "Databases" } )db.categories.insert( { _id: "Databases", paren

softdevelopment的博客 5841

express和mongodb初步使用,以及在express项目中获取JSON数据并存储到数据库中

关于express和mongodb初步使用这里就不多说什么了,直接写步骤 一、安装mongodb 二、配置环境变量 三、安装完成后创建数据目录data/db,数据目录放在根目录下(C:\或者D:)等. 四、打开命令行输入mongod --dbpath c:\data\db 五、重新打开一个命令行窗口mongo.exe,在这个命令行里可以 列出所有数据库:show dbs 使用某个数据库:use 数...

小楠子的博客 1281

初识MongoDB(一) mongodb基本操作

使用背景: 项目中需要存储一些下游的需求,需求的的格式是个树形的格式,例如某个需求里面包含n个城市某个品牌某个车系,可以简化成下图。(只是作为使用场景来分析,可以跳过) 按照关系型数据库来说的话,有两种方案: 1 需要3张表来实现下面的机构需要需求表存储需求的基本信息,需求和城市的关联表(一个需求对多个城市),需求、城市、车系的关联关系表(一个城市的某个需求下面有多个车系)。 2 一张表存储:一个需求对应多行记录,每行记录中的最小粒度是城市,城市中的车系用逗号拼接。如下图: 需求id 城

qq_38008721的博客 1311

Storing_TreeView_Structures_WithMongoDB:存储树形结构数据的 MongoDB 实践方案

Storing_TreeView_Structures_WithMongoDB:存储树形结构数据的 MongoDB 实践方案 在当今的开发实践中,树形结构数据的应用极为广泛,无论是各类分类体系还是网站结构,都离不开对层次关系的建模。本文将介绍一个开源项目 Storing_TreeView_Structures_WithMongoDB,该项目展示了如何在 NoSQL 数据库 MongoDB 中操作树...

gitblog_00465的博客 393

java处理数据,输出树形结构

java处理数据,输出树形结构 mongo数据库表数据结构,如下 java类处理方法 package com.necibook.resource.model.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.apache.commons.lang.StringUtils; import java.util.*; /** * @author lbx * @date 2020-08-2

lbx 2689

四种树形结构存储方案对比与实战优化

树形数据结构是计算机科学中的基础概念,广泛应用于文件系统、组织架构等场景。其核心原理是通过父子节点关系构建层次化数据模型,在数据库存储时需要特殊处理以保证查询效率。常见实现方案包括邻接表、路径枚举、嵌套集等关系型方案,以及文档数据库等NoSQL方案。从技术价值看,不同方案在查询性能、写入速度、事务支持等方面各有优劣,例如路径枚举法以空间换时间显著提升查询效率,而MongoDB的文档模型则天然适合分布式环境。在实际工程应用中,需要根据业务特点进行选型,如电商分类系统可能侧重查询性能,而实时协作工具更关注写入速

weixin_30550081的博客 486
上一篇: Redis键值设计
下一篇: 使用Redis之前5个必须了解的事情
codepython
博客等级 码龄20年 125粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值