数据库设计——分表重构
数据库有时会遇到重构的需求。但是,基于当前数据库大量数据无法大刀阔斧地重新洗盘。比如,需要在当前数据库表添加一个字段(Field)。这样每次产生新的字段需求时,均在单一数据表末尾添加。久而久之,数据表变得结构臃肿,数据冗杂,难以理解。另一种做法就是,对数据表包含已有和添加的字段重新规划,将原表拆分成两个或多个新表重新设计。分表后,数据结构条理清晰,目标明确。这种方法缺点也很明显,添加单个字段,就必
数据库有时会遇到重构的需求。但是,基于当前数据库大量数据无法大刀阔斧地重新洗盘。比如,需要在当前数据库表添加一个字段(Field)。这样每次产生新的字段需求时,均在单一数据表末尾添加。久而久之,数据表变得结构臃肿,数据冗杂,难以理解。另一种做法就是,对数据表包含已有和添加的字段重新规划,将原表拆分成两个或多个新表重新设计。分表后,数据结构条理清晰,目标明确。这种方法缺点也很明显,添加单个字段,就必须拆除整个数据表,并对原有数据进行完整的迁移。数据迁移工作耗时耗力,颇为麻烦。
增量式和解构式的数据库重构方法优缺点都非常明显。有没有什么办法很好解决这个问题?既然两者的优点鲜明,有没有可能使用两者的组合?有没有什么途径同时兼顾两者?
关于数据库分表,有一种理论:“水平分表”和“垂直分表”。水平分表,是将单个大的数据表分成多个结构相同小的数据表,通过集群的方式进行管理操作。垂直分表,以纵向切割的方式切分数据表,把一个冗长的数据表分割成多个结构关联的数据表。两者行为方式不同,目的均是为了方便数据的管理,提高数据库操作效率,从而提升信息系统的运行表现性能。很显然,这里提到的问题是属于垂直分表的范畴。
理解垂直分表的工作方式,对于如何组合兼顾增量式和解构式重构方法有很好的帮助。垂直分表的一个重点在于纵向切分数据表,也就是如何划分数据表的字段,区分实体的强关联和弱关联属性。《数据库怎么分库分表,垂直?水平?》一文中提到一点:
“ 垂直分表的拆分原则是将热点数据(可能会冗余经常一起查询的数据)放在一起作为主表,非热点数据放在一起作为扩展表。”
可以这样理解,频繁操作的“热点属性”视为强关联属性,非“热点属性”为弱关联属性。关联性强弱是通过属性与实体的联系紧密来判断的。与实体联系紧密的是强关联属性,与实体联系疏松的是弱关联属性。在普通的用户表中,一般以为,用户名和密码是与用户实体关系密切的,属于强关联属性。作为注册用途的邮箱,也算是强关联属性。实名制前,联系电话在某些应用场景中既可属强关联也可划分为弱关联。实名制实行后,联系电话作为实名制用户实体的必要属性,就不可再轻易划分为弱关联了。所以,强关联和弱关联不是绝对的,是相对于应用场景而定的。
在数学公式中,常常会出现“变量”和“常量”的概念。变量是指那些可迁移函数随之产生密切变化的数据,常量则是对函数结果变化不产生影响的数据。实体的强关联和弱关联属性也可以从变量和常量的角度来理解和思考。假设,实体是一个数学公式,它的属性是构成映射的变量和常量集合。那么,时刻影响着实体的变量属性是强关联属性,而不使实体产生本质变化的常量属性是弱关联属性。
更多推荐



所有评论(0)