数据库有时会遇到重构的需求。但是,基于当前数据库大量数据无法大刀阔斧地重新洗盘。比如,需要在当前数据库表添加一个字段(Field)。这样每次产生新的字段需求时,均在单一数据表末尾添加。久而久之,数据表变得结构臃肿,数据冗杂,难以理解。另一种做法就是,对数据表包含已有和添加的字段重新规划,将原表拆分成两个或多个新表重新设计。分表后,数据结构条理清晰,目标明确。这种方法缺点也很明显,添加单个字段,就必须拆除整个数据表,并对原有数据进行完整的迁移。数据迁移工作耗时耗力,颇为麻烦。
增量式和解构式的数据库重构方法优缺点都非常明显。有没有什么办法很好解决这个问题?既然两者的优点鲜明,有没有可能使用两者的组合?有没有什么途径同时兼顾两者?
关于数据库分表,有一种理论:“水平分表”和“垂直分表”。水平分表,是将单个大的数据表分成多个结构相同小的数据表,通过集群的方式进行管理操作。垂直分表,以纵向切割的方式切分数据表,把一个冗长的数据表分割成多个结构关联的数据表。两者行为方式不同,目的均是为了方便数据的管理,提高数据库操作效率,从而提升信息系统的运行表现性能。很显然,这里提到的问题是属于垂直分表的范畴。
理解垂直分表的工作方式,对于如何组合兼顾增量式和解构式重构方法有很好的帮助。垂直分表的一个重点在于纵向切分数据表,也就是如何划分数据表的字段,区分实体的强关联和弱关联属性。