`
ansn001
  • 浏览: 93773 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

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

阅读更多


上篇以用户数据表为例介绍了基本的数据分割方案以及基本的配置方案。但是在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就可以搞定。如果想更方便的处理,那么把这个东西做成单件的模式抽象化出来,然后再违反一下原则,做成基类,其他关系继承这个基类。。。。。剩下的应该很简单了,具体实现大家思考吧。
 
请参照第二篇的文章进行进一步优化设计来实现更高的负载性能
 
下章接着讲述数据分割和散列方面的内容
分享到:
评论

相关推荐

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

    ### 大型网站架构系列之三:多对多关系的优化设计 #### 一、引言 在构建大型网站架构时,多对多关系是非常常见的一种数据关联方式。随着Web 2.0时代的到来,这类关系变得更加普遍和复杂。例如,用户与好友之间的...

    疯狂代码,大型网站架构系列

    "疯狂代码,大型网站架构系列之三,多对多关系的优化设计.doc"探讨了一个关键的数据模型问题——多对多关系。在大型网站中,这种关系常见于用户与兴趣、商品与类别等场景。文档可能详细阐述了如何有效地存储和查询多...

    疯狂代码,大型网站架构系列之一

    ### 大型网站架构设计的关键知识点 #### 一、海量数据处理 在构建大型网站时,数据处理能力是首要考虑的问题。与小型站点相比,大型网站每天可能产生数百万条数据,这要求系统具备高效的数据处理机制。在设计初期...

    大型网站架构系列之一 不得不考虑的问题

    在构建大型网站架构时,需要面对一系列复杂的问题,这些问题直接影响到网站的性能、稳定性和安全性。以下是关于这些关键问题的详细分析: A. 海量数据的处理:随着用户数量和数据量的增长,传统的数据库查询方式...

    大型网站架构系列文档

    ### 大型网站架构系列文档 #### 一、海量数据的处理 对于小型网站而言,其数据量通常较小,简单的 `SELECT` 和 `UPDATE` 操作足以满足需求,加之合理地添加索引,就能有效应对大部分场景。然而,对于大型网站而言...

    大型门户网站架构设计

    ### 大型门户网站架构设计 #### 一、三层架构简介及其局限性 ##### 1.1 三层架构原理 三层架构是一种常见的软件架构模式,它将应用程序分为三个逻辑层:应用表现层、业务逻辑层和数据访问层。这种分层方式有助于...

    疯狂代码,大型网站架构系列(全)

    在Web 2.0时代,多对多关系在数据模型中普遍存在。尽管遵循第三范式可以帮助保持数据的完整性,但在高性能场景下,过多的表关联查询会影响性能。 **解决方案:** 1. **数据冗余**:适当引入数据冗余以减少多表查询...

    大型网站架构系列一 (1)1

    【大型网站架构系列一 (1)1】 在构建大型网站时,我们需要面对一系列复杂的问题,以确保系统的稳定性和高效性。本文将探讨大型网站架构中的一些核心知识点,特别是针对高互动性和高数据交换性的Web 2.0类型的网站。...

    大型网站架构演变和知识体系.pdf

    在大型网站架构演变的过程中,需要逐步构建并掌握一系列关键技术与概念: 1. **Web服务器与数据库的物理分离**:理解不同组件之间的依赖关系及其对性能的影响。 2. **页面缓存技术**:包括Squid等工具的使用方法...

    中大型网站架构演变之路.pdf

    本文将从初期、中期到现在的架构演变,详细介绍中大型网站架构的演变之路。 初期阶段: 1. 单台服务器部署:在最初阶段,网站通常部署在单台服务器上,运行所有服务,包括WEB服务器和数据库服务器。这种方式成本...

    中大型网站架构演变之路

    ### 中大型网站架构演变之路 #### 一、初期架构阶段 在中大型网站的初始发展阶段,网站架构的设计主要关注于简单高效地满足基本需求。这一阶段主要包括以下几个方面: 1. **单台服务器部署**:在项目的初期阶段,...

    多位前端架构设计

    张云龙作为前百度前端技术总监,利用其在前端领域的深厚功底,提出了一系列与软件架构相关的抽象模式,这些模式被用来指导大型软件系统,特别是web前端系统的各个方面的设计。在当今的IT行业,软件架构被看作是构建...

    大型互联网架构设计实例分析.docx

    大型互联网网站往往依赖于一系列分布式技术,如分布式文件系统、分布式计算框架、分布式关系数据库、分布式服务框架、分布式消息系统和分布式一致性服务框架,这些工具和架构共同支撑着大规模用户访问和高并发场景。...

    软件架构与设计《架构师入门经典系列》

    《软件架构与设计》是架构师入门的经典系列书籍,它以简洁明了的方式阐述了软件架构的核心概念,为初学者提供了宝贵的入门知识。在本文中,我们将深入探讨软件架构的重要性和设计原则,以及如何通过有效的架构设计...

    大型分布式网站架构

    综上所述,《大型分布式网站架构设计与实践》涵盖了分布式系统的基础理论、关键技术以及实际应用,为构建高效、可靠的大型网站提供了宝贵指导。通过深入理解并运用这些知识点,开发者可以更好地应对互联网时代的挑战...

    架构设计参考 高可用架构

    2. **微服务架构**:将大型应用拆分为一系列小型、独立的服务,每个服务都有自己的数据库和业务逻辑,通过API进行通信,实现松耦合和高可扩展性。 3. **事件驱动架构**:系统通过发布和订阅事件来通信,而非直接...

    层次式架构设计

    层次式架构设计是一种常见的软件或系统架构模式,它将复杂系统分解为一系列有序的、相互依赖的模块或层,每个层都负责特定的功能,并只与相邻的层进行通信。这种设计方法的主要目标是提高系统的可读性、可维护性和可...

    大型网站技术架构:核心原理与案例分析

    《大型网站技术架构:核心原理与案例分析》是一本深入探讨构建和优化大规模网站技术架构的专业书籍。本书针对Java技术栈,提供了丰富的实践经验和理论知识,旨在帮助读者理解和掌握大型网站背后的技术体系。 在现代...

    ARM系列单片机软件架构工具

    ARM系列单片机在现代电子系统设计中扮演着至关重要的角色,因其高效能、低功耗的特点,广泛应用于各种嵌入式系统。本主题将详细探讨“ARM系列单片机软件架构工具”,包括其概念、功能、应用以及如何有效地利用这些...

    系统架构设计师教程(第4版)pdf.zip

    2. **数据管理与数据库设计**:在这一部分,作者讨论了数据在系统架构中的重要性,涵盖了关系型数据库、非关系型数据库(NoSQL)以及数据存储的最佳实践。同时,还介绍了数据一致性、事务处理和数据安全等相关概念。...

Global site tag (gtag.js) - Google Analytics