下面来分析一下:
一、时间结构
如果业务系统对时效性较高,比如新闻发布系统的文章表,可以把数据库设计成时间结构,按时间分有几种结构:
1) 平板式
表类似:
article_200901
article_200902
article_200903
用年来分还是用月可自定,但用日期的话表就太多了,也没这必要。一般建议是按月分就可以。
这种分法,其难处在于,假设我要列20条数据,结果这三张表里都有2条,那么业务上很有可能要求读三次表。如果时间长了,有几十张表,而每张表是0条,那不就是要读完整个系统的表才行么?另外这个结构,要作分页是比较难实现的。
主键:在这个系统中,主键是13位带毫秒的时间戳,不要用自动编号,否则难以通过主键定位到表,也可以在查询时带上时间,但比较烦琐。
2) 归档式
表类似:
article_old
article_new
为了解决平板式的缺点,可以采用时间归档式设计,可以看到这个系统只有两张表。一张是旧文章表,一张是新文章表,新文章表放2个月的信息,每天定期把2个月中的最早一天的文章归入旧表中。这样一方面可以解决性能问题,因为一般新闻发布系统读取的都是新的内容,旧的内容读取少;第二可以委婉地解决功能问题,比如平板式所说的问题,在归档式中最多也只需要读2张表就完成了。
归档式的缺点在于旧表容量还是相对比较大,如果业务允许,可对旧表中的超旧内容进行再归档或直接清理掉。
二、版块结构
如果按照文章的所属版块进行拆表,比如新闻、体育版块拆表,一方面可以使每个表数据量分离,另一方面是各版块之间相互影响可降到最低。假如新闻版块的数据表损坏或需要维护,并不会影响到体育版块的正常工作,从而降低了风险。版块结构同时常用于bbs这样的系统。
板块结构也有几种分法:
1) 对应式
对于版块数量不多,而且较为固定的形式,就直接对应就好。比如新闻版块,可以分出新闻的目录表,新闻的文章表等。
news_category
news_article
sports_category
sports_article
可看到每一个版块都对应着一组相同的表结构,好处就是一目了然。在功能上,因为版块之间还是有一些隔阂,所以需要联合查询的需求不多,开发上比时间结构的方式要轻松。
主键:依旧要考虑的,在这个系统中,主键是版块+时间戳,单纯的时间戳或自动编号也能用,查询时要记得带上版块用于定位表。
2) 冷热式
对应式的缺点是,如果版块数量很大而且不确定,那要分出的表数量就太多了。举个例子:百度贴吧,如果按一个词条一个表设计,那得有多少张表呢?
用这样的方式吧。
tieba_汽车
tieba_飞机
tieba_火箭
tieba__unite
这个表汽车、火箭表是属于热门表,定义为新建的版块放在unite表里面,待到其超过一万张主贴的时候才开对应表结构。因为在贴吧这种系统中,冷门版块肯定比热门版块多得多,这些冷门版块通常只有几张帖子,为它们开表也太浪费了;同时热门版块数量和访问量等,又比冷门版块多得多,非常有特点。
unite表还可以扩展成哈希表,利用词条的md5编码,可以分成n张表,我算了一下,md5前一位可分36张表,两位即是1296张表,足够了。
tieba_unite_ab
tieba_unite_ac
…
三、哈希结构
哈希结构通常用于博客之类的基于用户的场合,在博客这样的系统里有几个特点,1是用户数量非常多,2是每个用户发的文章数量都较少,3是用户发文章不定期,4是每个用户发得不多,但总量仍非常之大。基于这些特点,用以上所说的任何一种分表方式都不合适,一没有固定的时效不宜用时间拆,二用户很多,而且还偏偏都是冷门,所以也不宜用版块(用户)拆。
哈希结构在上面有所提及,既然按每个用户不好直接拆,那就把一群用户归进一个表好了。
blog_aa
blog_ab
blog_ac
…
如上所说,md5取前两位哈希可以达到1296张表,如果觉得不够,那就再加一位,总数可达46656张表,还不够?
表的数量太多,要创建这些表也是挺麻烦的,可以考虑在程序里往数据库insert之前,多执行一句判断表存在与否并创建表的语句,很实用,消耗也并不很大。
主键:依旧要考虑的,在这个系统中,主键是用户ID+时间戳,单纯的时间戳或自动编号也能用,但查询时要记得带上用户名用于定位表。
四、总分结构
以上的这些结构,根据每个业务系统,能想出的估计还有很多。不过现在互联网业务越来越复杂了,有些时候,单一的拆分法还不能实现需求,需要几种拆分方案一起实施,多管齐下,这时候其中的逻辑会让人绕晕。我就开发过一个系统,仅仅是将哈希结构和时间结构混着一用,觉得逻辑就相当复杂。
所以,除了拆表之外,按最原始的单库单表,再建一个总表,是非常有利的架构。在这个架构中,每次往数据库会写入两倍数据,读取主要依赖拆表提升性能,总表用于实现拆表后难以实现的功能并且用于每天的定时备份;另外总表和分表还相互是一个完整的备份,任何一个分表损坏或数据不正常,都可以从总表中读到正确的数据并恢复,反之亦然。
在总分结构中,让人感到质疑的是总表的性能和可维护性。我的方案是总表可采用相对能保证稳定的一些服务软件和架构,例如oracle,或lvs+ pgpool+PostgreSQL,重点保证数据稳定;相对的,分表就用轻量级的mysql,重点在于速度。能够对总分表各采用不同的软件和方案,也是总分结构的一大特点。
相关推荐
数据库表拆分是指将大型数据库拆分成多个小型数据库,以便提高数据库的性能和可扩展性。根据分库分表方案中实施切片逻辑的层次不同,我们可以将数据库分库分表的实现方案分为三大类:客户端分片、代理分片和支持事务...
为了解决这个问题,又拍网采用了数据库拆分策略。数据库拆分分为垂直拆分和水平拆分。垂直拆分是根据功能模块将表分布到不同数据库,例如将群组相关表与照片相关表分开,这种方式简单但可能无法完全解决问题。相比之...
SQL数据库分割拆分工具,体积小,非常好用,可以把大SQL文件自动分割成不同大小文件,方便导入数据库,文件大小可以自己设定,一般虚拟主机数据库导入限制2-8MB, 几百MB数据库没法一次导入,可以用这个分割成NN个,...
其中,数据库拆分是常用的一种手段,它能够有效减轻单一数据库的压力。本文将详细介绍“一分钟掌握数据库垂直拆分”的相关内容,帮助读者快速了解垂直拆分的基本概念、应用场景及其实现原理。 #### 二、水平拆分与...
在分解单体应用程序到微服务体系架构时,重点考虑独立数据库拆分是很重要的。您需要想出一个可靠的策略,将您的数据库分割为多个与应用程序对齐的小型数据库。简而言之,您需要将您的应用程序/服务从使用单一的共享...
这一阶段是将信息拆分为独立的主题,每个主题对应一个表,避免冗余和不必要的复杂性。同时要注意,同一信息只存储一次,以减少错误的可能性,并提高数据一致性。 确定所需字段是设计中的重要一步。每个字段都应直接...
垂直拆分是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程中是很常见的。当一个网站还在很小的时候,只有小量的人来开发和维护,各模块和表都在一起,当网站...
然而,当单个数据库服务器无法承载更多数据或查询请求时,就需要进一步进行多库多表的拆分。 数据库分库分表的规则至关重要,通常依据某个字段(如`user_id`)进行哈希计算(如`user_id mod 4`),确定数据应存储在...
数据库拆分是指将一个大型数据库拆分成多个小型数据库,每个小型数据库保存特定的数据集。这样可以减少数据库的大小,提高数据的存储和检索效率。在 Access 中,我们可以通过将数据库拆分成多个文件,每个文件保存...
总结来说,基于MyBatis的数据库拆分和读写分离实现,涉及到对MyBatis框架的深入理解和扩展,包括对SqlSessionTemplate的改造、数据库拆分策略的设计(如垂直拆分和水平拆分的一致性哈希)、以及读写分离的路由机制。...
垂直分离是根据业务功能将数据库表拆分成多个独立的数据库,每个数据库只负责一部分业务;水平分离则是根据数据量,将一个大表的数据分散到多个数据库中。这样做可以降低单个数据库的压力,提高系统性能。 附加工具...
4. **更新数据库**:最后,通过数据访问层,将拆分后的新数据插入或更新到对应的数据库表列中。这可能涉及多条SQL语句,比如`UPDATE 表名 SET 姓名 = 新姓名, 年龄 = 新年龄, 性别 = 新性别 WHERE 条件`。 5. **...
- **数据库表拆分**:根据业务需求,设置分片规则,对数据库表进行水平拆分。 - **数据迁移**:将原有数据库的数据迁移到DRDS中,确保业务的平滑过渡。 - **配置读写分离**:设置主库和只读副本,分配合适的读写...
【MySQL架构设计之数据库拆分技术方法】 在数据库架构设计中,数据库拆分是一种常见的解决高并发、大数据量问题的策略。本篇笔记主要探讨了MySQL数据库的拆分技术,包括CAP原则、可扩展性原则以及垂直拆分和水平...
Sharding-JDBC的出现,为开发者提供了一种新的思路来解决传统数据库在高并发、大数据量场景下的性能和可扩展性问题,它不仅降低了数据库拆分的复杂度,还减少了系统整体架构的复杂性,极大地提升了开发和运维的效率...
5. **数据库垂直拆分**:按业务领域将数据库表拆分为多个独立的数据库,减少跨表操作,优化数据访问。 6. **数据库水平拆分**:基于特定规则(如哈希、范围等)将单一表的数据分散到多个数据库,进一步扩大处理能力...
"表拆分"就是一种常见的数据库优化策略,旨在提高数据处理效率、降低存储开销,并改善整体系统性能。标题“4_表拆分(1).zip”表明这个压缩包可能包含了关于表拆分的详细教程或案例分析。 表拆分主要有两种方法:...
例如,在人力资源信息系统中,一份员工履历资料可以包含员工基本情况、社会关系以及工作经历等信息,这就需要将其拆分为三个不同的实体(即基本表),分别是员工基本情况表、社会关系表和工作简历表。通过这种方式,...
DB2数据库表分区是指将大型表拆分为多个小的、独立的部分,每个部分称为一个分区。分区的目的是为了提高表的可管理性、可扩展性和查询性能。DB2数据库提供了 RANGE Partitioning、LIST Partitioning、HASH ...
负载均衡通过分散流量、处理故障和选择合适的架构来保证服务的稳定性和效率,而数据库优化则通过表拆分、索引优化等方式提升数据处理的并发性能。这两者结合,能有效应对大规模用户访问带来的挑战,确保系统的健壮性...