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 = '广州市';

总结

  • 对于省市区、商品分类等这种结构上相同(或相近),并且具有包含关系的多张表,我们可以按照自关联的方式给设计成一张表,能够节省表的开销
上一篇:delphi将文件资源打包到exe中


下一篇:使用某个视图的bounds.size为UIScrollView 设置偏移量的时候,真实的偏移量是某视图在使用masonry添加约束时候的bounds