常见的web系统,一般采用关系型数据库例如mysql,oracle,sqlserver之类的
数据表的设计,尤其是存在关联的若干表的设计对业务功能的实现,特别是业务功能的可拓展性尤为重要
现介绍一种基于中央集成关系数据的中央关系表设计模式
以一个常见的业务场景为例
表A表示的是 扫地,负责的是id为2的同学,dutyId表示学生id,examineId表示监督的老师id
id | dutyId | item | examineId |
---|---|---|---|
1 | 2 | 扫地 | 3 |
表B表示同学表
id | name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
4 | 叮当 |
5 | 汉字 |
表C表示老师表
id | name |
---|---|
1 | 王老师 |
2 | 李老师 |
3 | 张老师 |
按照以上的关系A表和B表是通过A表的dutyId与B表的id关联的
如果是这样设计,那么当需求出现变化,扫地需要2个人完成那么表A就需要修改成这样
id | dutyId1 | dutyId2 | item |
---|---|---|---|
1 | 2 | 1 | 扫地 |
即dutyId1字段和dutyId2字段,表示扫地有最多2个同学负责
那如果需求变成扫地最多需要3个人,4个人,5个人完成呢?显然,不可能无限制的改表结构,也不可能预留一些所谓的空字段来适配
其实以上问题从一开始就是表设计没考虑周全
扫地和学生的关系,显然不一定够是1对1的,同理,监督扫地和监督老师关系也不一定是1对1的
*注:真正的1对1关系比较少,例如从表关系来说例如表和扩展表,从业务上讲例如孩子的父亲,母亲之类的才是真正的1对1关系
这种情况下,就需要设计中间关系表,
传统的做法就是设计以下两表
1.A表和B表的关系表AB
2.A表和C表的关系表AC
实际上,可以设计一张中央关系表center,把两头的关系的id分别作为fromId和toId,加上一个类型字段和ext字段(用于存储一些关系的描述性数据)
id | fromId | toId | relationName | ext |
---|---|---|---|---|
1 | 1 | 2 | AB | |
2 | 1 | 3 | AC |
这样就实现了可以任意扩展关系数量存储任意关系的中央关系表模式,
此处的ext字段很重要,可以用于存储一些额外的数据,例如关联后的顺序