数据库表垂直分区后分区表与原表的关系及join表达式疑问
问题解答
知识点前提:当表
R被垂直分区为R1、R2、R3……Rn时,可以表示为R=R1⋈R2⋈R3……⋈Rn(⋈为join符号)
疑问:若join符号未附带任何特殊条件,运算结果会是笛卡尔积,最终得到的元组数量会远多于原表R的元组数量,为何原表可以用分区表的join运算结果来表示?
这个问题的核心是对垂直分区场景下join符号的约定使用存在误解,具体解释如下:
- 首先这里的
⋈不是无条件的笛卡尔积连接,是数据库领域约定的**自然连接(Natural Join)**简写,且垂直分区的设计规则从根源上避免了笛卡尔积的产生。 - 垂直分区的拆分有强制规则:所有拆分出来的子表
R1~Rn,都会保留原表R的全局唯一行标识列(通常是主键),剩余的非标识列会互斥拆分到不同子表,不会重复出现。
举个简单例子:原表R结构为(user_id, name, age, salary),垂直拆分后R1为(user_id, name, age),R2为(user_id, salary),两张子表都携带唯一标识user_id。 - 自然连接会默认使用两张表中同名、同类型的列作为等值连接条件,上述例子中就是用
user_id做匹配,每个user_id在两张子表中都只有1条对应记录,连接后只会生成1条完整记录,行数和原表完全一致,列合并后也和原表结构完全匹配。 - 多表垂直分区的场景同理,所有子表都共享同一个唯一行标识,逐个连接时只会做一对一的等值匹配,不会出现一对多、多对多的映射关系,自然不会产生冗余的笛卡尔积数据,最终的连接结果和原表
R完全等价。
内容的提问来源于stack exchange,提问作者user9178840
相关产品推荐
相关产品推荐

