疯狂代码,大型网站架构系列之三,多对多关系的优化设计

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
疯狂代码原创发布,转载请注明出处 http://www.crazycoder.cn/
上篇以用户数据表为例介绍了基本的数据分割方案以及基本的配置方案。但是在2.0时代,这种简单的列表索引已经远远实现起来是问题的,多对多关 系将是最常见的关系。现在我们针对web2.0数据中广泛存在的多对多关系进行阐述和具体行为判断,比如一个很简单的例子,在2.0时代,好友功能是最常 被用到的,每个用户会有很多的好友,同时也会是很多人的好友,那么这个数据量将会是用户数的平方的级别。同样,对于文章标签,每个文章可以有多个标签,而 每个标签又可以有多个文章,这又是一个几何乘积,数据量又会是个天文数字。
 
传统的处理方案有两种,一种是通过SEARCH的方法来实现,一种是通过另建一个索引表,存贮对应的ID以进行存贮。对于第一种方案,因为要涉 及大量的LIKE查询,性能不敢恭维,第二种的情况下,数据库的行的数量也是惊人海量级别的,并且要跨表跨区查询,还要维护数据的唯一性,数据处理过程相 当的复杂性能也就不言而喻了。
 
文入正题,下面对数据多对多关系举出来具体的解决方案,我们这里以标签和文章之间的多对多关系为例来讲解,大家可以举一反三的思考群组和用户之间,相册和被圈用户之间等等复杂的多对多关系。
 
首先滤清一下流程,我们以传统方案的第二种为例,在传统的数据库设计中我们是如下走的:当一篇博文发布的时候并插入标签的时候一般是三步走(也 可以理解为四步,以为还要判断标签是否存在的问题),第一步插入文章数据库并获取文章的ID,第二步插入标签数据库同时查询标签是否存在,如果存在就取出 标签的ID,否则的话插入新标签并取出ID,第三部,将文章的ID和标签的ID插入索引表来建立关联。如果这个时候在索引表上建立了索引的话就是灾难性 的,特别是在数据量大的情况下,尽管它可以有效的提高查询速度,但是发布的速度可能就会让人无法忍受了。
 
我们处理的方法也是三部曲,对多对多关系进行进一步的处理。
用标签的时候,我们用的最多的就是查询标签下的文章和显示文章的标签,所以我们实现这例就成了。
第一步,抛弃索引表。
对文章做冗余字段,加一个TAG列,我们可以讲TAG的标签如下写[TagID,TagName]| [TagID,TagName]| [TagID,TagName] 同样 对于TAG表,我们做如下冗余加个Article字段,如下内容[ArticleID,Title]| [ArticleID, Title]| [ArticleID, Title],在需要增加的时候我们只要APPEND一下就可以了,至于ARTICLE的结构和TAG的结构可以参考我上一篇文章的介绍。其实根据需要还 可以存贮更多。
有人会问,为什么要存贮TagName和ArticleTitle呢,其实是为了避免跨表查询和INNERJOIN查询来做的,In查询和跨表查询会造成全表遍历,所以我们在执行的时候In查询是必须要找到一个有效的替代方法的。
 
第二部:异步加载。
在设计模式下我们常思考的是单件模式,我们采用另类的单件模式来处理,也就是把文章和标签之间的索引作为专门的进程来做,异步的实现。
为了避免文章在发布的时候以为要检查TAG表而造成的线程拥堵,我们需要采取延迟加载的方案来做。服务器应该维护一个进程专业的对标签和文章地段的查询和索引,我们在发布文章的时候应该把标签同步这一块托管给另外的一个程序进行处理,并进行索引。
第三部:标签缓存索引:
对于频繁的判断标签去或者热门的标签我们还可以组织一套有效的索引,比如对于标签“疯狂代码”和”傲博知识库”,我们用树来把它表示出来。对于 疯狂代码我们索引一个疯,其实用程序表达就是疯狂代码[0],同样傲博知识库就是傲博知识库[0]。而在数组”疯”中存贮以疯开头的标签组,以”傲”的数 组中存贮以”傲”开头的标签。如果量更大的话还可以再做二级索引。
 
这涉及另外一个话题了就是分词,上面是一个简单的分词方案,大家在进行GOOGLE搜索的时候应该很输入它的Suggest方法吧,就是这个道理。最终讲标签有效的索引,并提取热门的作为一个全局静态变量,我们就可以绕过数据查询这一关,对第二部的单件模式又是一个进化。
 
以上是对多对多关系的一个简单的架构说明,肯定有人会问,如果这样做的话工作量不是太大了吗,分词处理什么的,对每个多对多关系进行处理。
OK,咱们可以进一步的把它来抽象化,我们用TableA 表示Article表,用TagbleT表示Tag表,我们可以讲字段抽象化出来,也就是一个ID,一个Tag的String 同理对于标签表也是如此。朋友们应该可以理解我的意思了。
 
对,就是做个代码生成器把对应的多对多关系给生成出来,这个很好写的,几个Append就可以搞定。如果想更方便的处理,那么把这个东西做成单件的模式抽象化出来,然后再违反一下原则,做成基类,其他关系继承这个基类。。。。。剩下的应该很简单了,具体实现大家思考吧。
 
请参照 第二篇的文章进行进一步优化设计来实现更高的负载性能
 
下章接着讲述数据分割和散列方面的内容
宝塔面板如何绑定域名与ssl证书达到安全登录 1.给宝塔面板绑定一个A记录的域名,你的域名dns解析绑定一个例如:bt.xxx.com。这时浏览器输入: bt.xxx.com:面板端口/安全入口, 可以看到宝塔面板登入入口了。4.把这个域名bt.xxx.com的ssl证书复制到:面板设置——面板ssl配置里头。5.最后把:绑定的域名填上并保存,日后就不能按IP地址登录了。3.给这个站点申请Let's Encrypt的ssl证书。2. 给宝塔添加一个数据库为空的站点。 阅读详情

相关推荐

通过若依源码分析多对多的实现过程

通过若依源码分析多对多的实现过程一. 引言二. 前端页面展示效果三. 数据库实现思路四. 后端实现思路五. 前端实现思路六. 技术总结 一. 引言 多对多关系是一种很常见的实体间的关系。 除了多对多,还有一对多,多对一,一对一。 常见的有一对多和多对多,本文我就通过开源项目若依系统研究一下前端后端的多对多的实现方式,帮助那些还不太懂的代码如何编写的人,提供一种宝贵的借鉴思路。 代码使用的是若依的前端分离版本。项目地址:https://gitee.com/y_project/RuoYi-Vue 具体代码将展

清宵尚温的博客 2063

html 一对多配置页面,webpack中配置多对多的实现

webpack是一个优秀的打包平台,可以把sass,图片,字体等静态资源全部打包到js中作者最近在改造一个传统的静态网站,为了减少http请求,其中一个策略就是,把单个静态网页对应的多个静态资源(如字体,css,图片,js),打包输出到一个js文件中,然后让每个html与对应独立的js相关联就可以了我在网上找了webpack配置的相关资料,html与js的对应关系都是,"一对一","多对一",但很...

weixin_33328213的博客 456

【前端设计】保持代码手感——多对一的握手合并模块

【芯片前端】保持代码手感——一对多的握手拆分模块_尼德兰的喵的博客-CSDN博客_前端拆分模块有一对多的握手场景,就必然有多对一的握手场景,这篇文章就是探究下握手融合场景应该如何组织rtl。

moon9999的博客 418

django 多对多字段 前端html渲染时

django 多对多字段 前端html渲染时 如何显示多对多内容

u014428514的博客 364

django前端渲染多对多关系(比如一本书的作者有哪些)

自己遇到的问题是,前端渲染不出多对多关系,咨询Yuan后解决,特此记录。 urls.py from django.conf.urls import url from book import views urlpatterns = [ url(r'^index/', views.index), url(r'^add/', views.add), ...

weixin_30402343的博客 460

【转】疯狂代码,大型网站架构系列之三,多对多关系优化设计

http://www.crazycoder.cn/Yuanchuang/Article11087.html 上篇以用户数据表为例介绍了基本的数据分割方案以及基本的配置方案。但是在2.0时代,这种简单的列表索引已经远远实现起来是问题的,多对多关系将是最常见的关系。现在我们针对web2.0数据中广泛存在的多对多关系进行阐述和具体行为判断,比如一个很简单的例子,在2.0时代,好友功能是最常被用到的...

ahuango的专栏 225

大型网站架构系列之三,多对多关系优化设计

上篇以用户数据表为例介绍了基本的数据分割方案以及基本的配置方案。但是在2.0时代,这种简单的列表索引已经远远实现起来是问题的,多对多关系将是最常见的关系。现在我们针对web2.0数据中广泛存在的多对多关系进行阐述和具体行为判断,比如一个很简单的例子,在2.0时代,好友功能是最常被

East271536394 964

[架构] 大型网站架构系列之三 ---------------- 多对多关系优化设计

上篇以用户数据表为例介绍了基本的数据分割方案以及基本的配置方案。但是在2.0时代,这种简单的列表索引已经远远实现起来是问题的,多对多关 系将是最常见的关系。现在我们针对web2.0数据中广泛存在的多对多关系进行阐述和具体行为判断,比如一个很简单的例子,在2.0时代,好友功能是最常 被用到的,每个用户会有很多的好友,同时也会是很多人的好友,那么这个数据量将会是用户数的平方的级别。同样,对于文章标签,

雪后残阳 599

C C++最新【程序人生】毕业入职后,C++转Go语言工作半年感受,2024年最新【大牛疯狂教学】

何地方写,任何地方运行。曾经我尝试过用Vim写Java,结果无奈的放弃了这个想法。对于很多环境下来说,不依赖IDE是很重要的。

2401_84978673的博客 2706

51c大模型~合集111

OpenAI 的某发言人表示:「为了提高清晰度和安全性,我们增加了一个额外的后处理步骤,其中模型会审查原始的思维链,删除任何不安全的内容,然后简化某些复杂的思维。可以看到,虽然 ChatGPT 确实完成了任务并展示了总结版的思维链,但似乎并未如 OpenAI 发言人说的那样给出与提示词语言同样语言的总结版。北大-灵初联合实验室表示,Align-DS-V的多模态强推理能力是VLA模型大脑端的核心,接下来的研究训练计划,是利用多模态推理模型的跨模态穿透能力,实现action穿透,最终实现真正高效的VLA模型。

whaosoft~aiotの开发板商城 2217

Dify基于TiDB的数据架构重构实践:从数十万容器到统一存储的系统性演进

本文完整还原了Dify.AI基于TiDB的数据架构重构实践。从管理近五十万个隔离的数据库容器,到统一存储于单一TiDB Cloud,这场重构带来了基础设施成本降低80%、运维开销减少90%的量化成果。文章深入剖析了GenAI平台面临的多模态数据管理困境:关系型数据、向量嵌入、文档内容和对话历史分散在多个存储系统中,数据同步复杂、跨存储查询困难、运维成本叠加。TiDB凭借关系型与向量的统一支持、分布式架构的弹性扩展和MySQL协议的高度兼容,成为Dify.AI统一存储层的核心选择。

搞定过:百亿级数据、万级QPS、零宕机、AI工业化。 362

Redis数据结构入门:String、Hash、List、Set、SortedSet全面认识

本文系统介绍Redis核心数据结构:String(字符串)、Hash(哈希)、List(列表)、Set(集合)和SortedSet(有序集合),阐述其特点与典型应用场景。String适用于缓存、计数器与验证码;Hash适合存储对象信息,支持字段级操作;List实现队列与栈,支持两端增删;Set用于重与共同好友分析;SortedSet则支撑排行榜等排序需求。掌握这些结构是高效使用Redis解决实际业务问题的基础。

CharlesYuangc的博客 158

12软考备课基础阶段考点理论精讲数据库基础

CB C B

247

FastAPI

FastAPI是基于Python的高性能异步Web框架,专用于快速构建API。其优点包括:异步支持、自动生成交互式文档、开发效率高、类型注解友好。核心知识涵盖路由、路径与查询参数、请求体、响应类型(如JSON、HTML、文件等)、异常处理、中间件、依赖注入、ORM(SQLAlchemy)及数据库操作。需掌握Depends依赖注入、async/await异步编程、Pydantic数据验证、全局异常处理器、JWT认证、缓存(Redis)等。通过model_validate和model_dump实现模型转换

mrjieke6的博客 140

从零理解 Agent Memory 管理:内存记忆、文件持久化与上下文截断

本文从 Memory 的核心循环出发,依次讲解内存记忆、文件持久化、跨会话记忆恢复,以及按消息数和 Token 数进行上下文截断,帮助你建立 Agent Memory 管理的完整知识框架。

2503_93701293的博客 166

服务器运维:mysql 安装笔记

安装并配置MySQL Server:通过yum安装mysql-server,启用并启动mysqld服务,验证版本与状态。本地免密登录后,推荐设置root强密码,可选执行mysql_secure_installation进行安全初始化,确保数据库安全稳定运行。

snow的博客 80
上一篇: 性能优化,浅谈ASP.NET中的经典性能优化方案,并对大家常用的方案进行一下注释和质疑
下一篇: HP大中华区总裁孙振耀撰文谈退休并畅谈人生【全详细】
zfrong
博客等级 码龄19年 7122粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值