http://www.crazycoder.cn/Yuanchuang/Article11087.html
上篇以用户数据表为例介绍了基本的数据分割方案以及基本的配置方案。但是在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就可以搞定。如果想更方便的处理,那么把这个东西做成单件的模式抽象化出来,然后再违反一下原则,做成基类,其他关系继承这个基类。。。。。剩下的应该很简单了,具体实现大家思考吧。
请参照第二篇的文章进行进一步优化设计来实现更高的负载性能
下章接着讲述数据分割和散列方面的内容
分享到:
相关推荐
"疯狂代码,大型网站架构系列之三,多对多关系的优化设计.doc"探讨了一个关键的数据模型问题——多对多关系。在大型网站中,这种关系常见于用户与兴趣、商品与类别等场景。文档可能详细阐述了如何有效地存储和查询多...
### 大型网站架构系列之三:多对多关系的优化设计 #### 一、引言 在构建大型网站架构时,多对多关系是非常常见的一种数据关联方式。随着Web 2.0时代的到来,这类关系变得更加普遍和复杂。例如,用户与好友之间的...
### 大型网站架构设计的关键知识点 #### 一、海量数据处理 在构建大型网站时,数据处理能力是首要考虑的问题。与小型站点相比,大型网站每天可能产生数百万条数据,这要求系统具备高效的数据处理机制。在设计初期...
《疯狂代码大型网站架构系列之二》深入探讨了大型网站架构设计中关键的底层架构问题,特别是在面对不同用户量级时的数据处理策略。从AJAX的安全性挑战到电信ADSL布局方案,再到针对不同用户量级的数据库优化与扩展...
在Web 2.0时代,多对多关系在数据模型中普遍存在。尽管遵循第三范式可以帮助保持数据的完整性,但在高性能场景下,过多的表关联查询会影响性能。 **解决方案:** 1. **数据冗余**:适当引入数据冗余以减少多表查询...
《人力资源三层架构:MVC模式在数据库应用系统中的实践》 在信息技术日益发展的今天,人力资源管理系统已经成为企业管理不可或缺的一部分。本文将深入探讨一个基于MVC(Model-View-Controller)架构的人力资源...
这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet...
【疯狂打群架小游戏源码】是一款基于Cocos游戏引擎开发的轻量级游戏项目,其核心内容包括游戏策划文档、美术设计素材以及完整的源代码。这款游戏以多人对战为主要内容,玩家通过操控角色与其他玩家进行竞技,体验...
4. **模块化代码**:展示了如何组织和架构大型项目的代码,便于理解和维护。 通过《疯狂Android讲义》的学习,开发者可以全面了解并掌握Android开发技能,无论是初学者还是有一定经验的开发者,都能从中受益。同时...
它可能包含一系列的教程、源代码示例、问题解答和最佳实践,帮助开发者从零开始理解整个开发过程。 标签“java微博”进一步确认了这个主题,表明内容与使用Java进行微博应用开发相关。Java是一种广泛使用的编程语言...
例如,订单表可能会关联用户表和商品表,通过外键实现多对一或一对多的关系。同时,事务管理也是必不可少的,尤其是在处理支付、库存更新等关键操作时,需要确保这些操作的原子性、一致性、隔离性和持久性(ACID特性...
《疯狂Android讲义第2版》是知名Android开发者李刚所著的一本深入解析Android开发的经典书籍。这个压缩包文件"Crazy Android 2rd Source Code"包含了书中所讲解的源码,供读者深入理解Android应用开发的内部机制,...
《模拟类游戏1 - Flash原文件》集合包含了一系列基于Flash技术开发的模拟游戏源文件,如保龄球、雷神之椎、中国功夫、管道游戏、魔力彩蛋、打飞碟、肥猫空降队、疯狂扫射、换靓衫和射击游戏。这些源文件是开发者用于...
【标题】:“自己做的毕业设计模板”通常是指个人在完成大学学业时,为满足毕业要求而制作的一个实际项目,这通常涉及到系统开发、数据库设计和业务流程分析等多个方面。这样的项目设计不仅锻炼了学生的实践能力,也...
在企业级应用开发中,数据源管理是至关重要的部分,特别...通过这个项目,你可以学习到如何在Spring、SpringMVC和Mybatis的环境下实现动态多数据源的配置和管理,这对于大型分布式系统的设计和开发具有很高的实践价值。
1. **游戏架构设计**:CrazyAlpha的源码展示了游戏的整体架构,包括主流程控制、模块划分、类与对象的设计等。这有助于我们了解如何构建一个大型复杂的游戏系统,以及如何通过模块化来提高代码的可维护性和可扩展性...
- 强调编写清晰、可维护的代码的重要性,涵盖了命名规则、函数设计、对象设计等多个方面。 - 有助于培养良好的编程习惯,提高代码质量。 ### 框架与工具 1. **精通Struts:基于MVC的Java Web设计与开发**: - ...
1. **游戏架构**:源码中可能会展示出不同的游戏架构模式,例如模型-视图-控制器(MVC)、模型-视图-ViewModel(MVVM)或者更专门的游戏架构如Model-View-Update-Entity(MVUE),这些架构帮助开发者组织代码并保持...
SSH整合是指Spring、Struts和Hibernate这三大开源框架的集成应用。这个项目是基于这三个框架进行的集成,为开发者提供了一种高效、灵活且...尽管如此,了解SSH整合仍然有助于理解Web应用的架构设计和组件间的协同工作。
- 模块化设计: 将系统划分为多个模块,如用户模块、商品模块、订单模块等。 - 分层设计: 包括表示层、业务逻辑层、数据访问层等。 #### 4. 关键技术点 - **RESTful API设计**: RESTful风格的API能够更好地适应Web...