MySQL数据库中一种表的设计方式——自关联
自关联:
- 表中的某一列,通过外键引用了本表的另外一列(主键),但是它们的业务逻辑含义又是不一样的,这就是自关联
- 物理上一张表,逻辑上是多张表,必须通过取别名来区分,能够节省表的开销
自关联的应用场景:
我们设计了省(provinces)信息的表结构(id,ptitle)和市(cities)信息的表结构(id,ctitle,pid)这两张表,其中pid对应着provices表的id。通过比较发现,cities表比provinces表多一个列pid,其它列的类型都是一样的,存储的都是地区信息,而且每种信息的数据量有限,因此没必要增加一个新表,或者将来还要存储区、乡镇信息,都增加新表的开销太大。我们可以重新设计一个地区(areas)信息的结构(id,atitle,pid),因为省没有所属的省份,所以pid可以填写null,城市所属的省份pid可以填写省所对应的id。在这个表中,结构不变,还可以添加区县、乡镇街道、村社区等信息。下面以创建areas表为例:
-
创建areas表
create table areas( id int primary key, atitle varchar(20), pid int, foreign key(pid) references areas(id) );
-
从sql文件中导入数据
source areas.sql;
-
查询山西省有哪些市
select city.atitle from areas as province inner join areas as city on province.id = city.pid where province.atitle = '山西省';
-
查询广州市有哪些区县
select district.atitle,country.atitle from areas as city inner join areas as district on city.id = district.pid
left join areas as country on district.id = country.pid where city.atitle = '广州市';
总结:
- 对于省市区、商品分类等这种结构上相同(或相近),并且具有包含关系的多张表,我们可以按照自关联的方式给设计成一张表,能够节省表的开销