软件开发中,我们经常遇到两个实体数据拥有M:N的关系,在设计表的时候需要体现这种关系。为了方便描述,我举个例子。假设我们需要开发一个幼儿园学生和兴趣班管理系统。学生和兴趣班就是两个实体,两者的关系如下:
- 学生可以发生变化,每个学生选择的兴趣班可以发生变化,每个学生选择的兴趣班个数可以不一样
- 兴趣班可以发生变化,兴趣班中的学生个数可以发生变化,兴趣班中的学生个数可以不一样
实际上这就是一种典型的M:N关系。在设计表的时候可以用三张表来做,除了学生表和兴趣班表之外,加上一个两者的关系表,其中关系表如下所示。
学生编号 | 兴趣班编号 |
---|---|
001 | 001 |
001 | 002 |
002 | 001 |
003 | 002 |
004 | 003 |
在实际工作当中可以简化这种设计,在学生表中使用一个字段来表示该学生选择的兴趣班,这种做法虽然有些上不了台面,但是比较容易理解和维护。
学生编号 | 学生姓名 | 兴趣班编号列表 |
---|---|---|
001 | 张晓明 | 001,002 |
002 | 王大帅 | 001,002 |
003 | 周强 | 001,003 |
004 | 毛江 | 003 |
005 | 刘侃侃 | 001,002,003 |
兴趣班编号 | 兴趣班名称 | 兴趣班老师 |
---|---|---|
001 | 画画班 | 张晓燕 |
002 | 阅读班 | 胡大有 |
003 | 跳舞班 | 李木木 |
仔细想想这种设计可以满足绝大部分情况
- 查询单个或多个学生的兴趣班
- 修改单个或多个学生的兴趣班
- 新增或者删除兴趣班
- 查询某个兴趣班的学生个数
- 汇总某个兴趣班的学生情况
基本上在SQL语句中引入简单的字符串函数就可以将字段兴趣班编号列表玩出很多花样。