项目实战(二)—你的数据库灵活吗?
2013-12-05 21:35
260 查看
最近做项目的时候遇到一个这样的问题,一个表中由四个字段都是一对多的关系。如果把四个字段放入到一张表中,肯定存在很多冗余数据。想想那怎么办呢?分成四张表,用主外键关联起来,但太不灵活了。想到考试系统中用到的中间表,想这里也可以用到。现在比较一下三种建表方式的不同之处吧!
2、关系:
(1)一个粮仓容纳多个前置机
(2)一个前置机对应多个端口
(3)一个端口对应多个组
3、假设:
(1) 1号仓中有前置机1和2;
(2)前置机1、2各有2个端口;
(3)每个端口对应的组不同;
大家可以看到,把所有字段放在一张表中,产生很多冗余字段。这仅仅一个仓有9组的情况下,仓和前置机、端口就产生了很多冗余数据,那如果说一个仓有10个前置机、20组呢?
优点:代码简单
缺点:产生很多冗余数据
2、方法二:建立四张表(仓表、前置机表、端口表、组和数据表)
(1)粮仓表
(2)前置机表
(3)端口号表
(4)组表
优点:减少冗余,查找方便(建立主外键)
缺点:不灵活(如果某个前置机坏了,进行更换,我必须更改前置机表和端口表)
通过主外键联系,操作时会涉及到多张表,耦合性太强。
方法三、建立中间表,解耦和
(1)粮仓表
(2)前置基表
(3)端口表
(4)组表
(5)仓与前置机的中间表
(7)前置机与端口中间表
(8)端口表与组表的中间表
优点:减少冗余、增加灵活性
通过中间表建立联系,操作时 无论是前置机、端口、组,还是具体的某个数据出现问题,我们更改时不需要更改两张基本表。
一、实例
1、 表:字段包括粮仓、前置机地址、端口、组、数据,其中粮仓、前置机地址可以唯一标识2、关系:
(1)一个粮仓容纳多个前置机
(2)一个前置机对应多个端口
(3)一个端口对应多个组
3、假设:
(1) 1号仓中有前置机1和2;
(2)前置机1、2各有2个端口;
(3)每个端口对应的组不同;
二、建表方法
1、方法一:将所有字段放到一张表中仓 | 前置机 | 端口 | 组 | 数据 |
1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 2 | 2 |
1 | 1 | 2 | 3 | 3 |
1 | 1 | 2 | 4 | 4 |
1 | 2 | 1 | 5 | 5 |
1 | 2 | 1 | 6 | 6 |
1 | 2 | 2 | 7 | 7 |
1 | 2 | 2 | 8 | 8 |
1 | 2 | 2 | 9 | 9 |
优点:代码简单
缺点:产生很多冗余数据
2、方法二:建立四张表(仓表、前置机表、端口表、组和数据表)
(1)粮仓表
仓表(主键) |
1 |
前置机(主键) | 仓表(外键) |
1 | 1 |
2 | 1 |
端口 | 前置基表(外键) |
1 | 1 |
2 | 1 |
1 | 2 |
2 | 2 |
组(主键) | 数据 | 端口号(外键) |
1 | 1 | 1 |
2 | 2 | 1 |
3 | 3 | 1 |
4 | 4 | 1 |
5 | 5 | 2 |
6 | 6 | 2 |
7 | 7 | 2 |
8 | 8 | 2 |
9 | 9 | 2 |
缺点:不灵活(如果某个前置机坏了,进行更换,我必须更改前置机表和端口表)
通过主外键联系,操作时会涉及到多张表,耦合性太强。
方法三、建立中间表,解耦和
(1)粮仓表
仓序号 | 仓表 |
1 | 1 |
前置机序号 | 前置机 |
1 | 1 |
2 | 2 |
端口序号 | 端口 |
1 | 1 |
2 | 2 |
3 | 1 |
4 | 2 |
组序号 | 组号 | 数据 |
1 | 1 | 1 |
2 | 2 | 2 |
3 | 3 | 3 |
4 | 4 | 4 |
5 | 5 | 5 |
6 | 6 | 6 |
7 | 7 | 7 |
8 | 8 | 8 |
9 | 9 | 9 |
序号 | 仓序号 | 前置机序号 |
1 | 1 | 1 |
2 | 1 | 2 |
序号 | 前置机序号 | 端口序号 |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 1 |
4 | 2 | 2 |
序号 | 端口序号 | 组序号 |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 3 |
4 | 2 | 4 |
5 | 1 | 5 |
6 | 1 | 6 |
7 | 2 | 7 |
8 | 2 | 8 |
9 | 2 | 9 |
通过中间表建立联系,操作时 无论是前置机、端口、组,还是具体的某个数据出现问题,我们更改时不需要更改两张基本表。
相关文章推荐
- libmemcached 与 libmemcache
- [转载] Windows平台下配置Mysql
- java 调用 Oracle 存储过程
- [转载] Windows平台下安装MySQL
- Oracle view 小结片段
- 关于NoSQL
- Oracle plsql 打包
- remote_listener 设置问题导致数据库不能打开
- hibernate中lazy的使用
- 数据库操作语句
- Oracle 建立序列以及触发器的建立
- sql server 2005 错误 18452
- Oracle 的 char number varchar2 效率测试
- 解决mysql 中文乱码问题
- 数据库还原
- LINK : fatal error LNK1104: cannot open file "libmysql.lib"
- Windows平台下安装与配置SQL
- vc6.0 ADO访问数据库
- SQLServer函数 left()、charindex()、stuff()的使用
- oracle 12c 访问数据库