数据库表设计其二,中央关系表设计模式

常见的web系统,一般采用关系型数据库例如mysql,oracle,sqlserver之类的
数据表的设计,尤其是存在关联的若干表的设计对业务功能的实现,特别是业务功能的可拓展性尤为重要
现介绍一种基于中央集成关系数据的中央关系表设计模式
以一个常见的业务场景为例
表A表示的是 扫地,负责的是id为2的同学,dutyId表示学生id,examineId表示监督的老师id

iddutyIditemexamineId
12扫地3

表B表示同学表

idname
1张三
2李四
3王五
4叮当
5汉字

表C表示老师表

idname
1王老师
2李老师
3张老师

按照以上的关系A表和B表是通过A表的dutyId与B表的id关联的
如果是这样设计,那么当需求出现变化,扫地需要2个人完成那么表A就需要修改成这样

iddutyId1dutyId2item
121扫地

即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字段(用于存储一些关系的描述性数据)

idfromIdtoIdrelationNameext
112AB
213AC

这样就实现了可以任意扩展关系数量存储任意关系的中央关系表模式,
此处的ext字段很重要,可以用于存储一些额外的数据,例如关联后的顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值