这样做的好处是什么?

str345 2006-12-29 09:23:57
假设在数据库中有产品表A

-----------------------------------
| 字段名 | 类型 | 说明 |
-----------------------------------
| pro_1 |varchar2| 产品名 |
-----------------------------------
| pro_2 |number |车间编码 |
------------------------------------
| pro_3 |number |产量 |
------------------------------------

车间表 B
-----------------------------------
| 字段名 | 类型 | 说明 |
-----------------------------------
| pro_2 |number |车间编码 |
------------------------------------
| room_t |varchar2| 车间名 |
------------------------------------
现在页面上要显示的是:
产品名称 生产车间名 产量
它使用的是下面的语法得出数据:
select pro_1,room_t,pro_3 from a,b where a.pro_2=b.pro_2
这是我们一贯的做法,现在有以下疑问,请高手解惑!!!!
1、在B中,车间编码pro_2是主键,在A表中,车间编码是外键,
如果我们取消这种主键,外键关联,将B表设计为:
车间表 B
-----------------------------------
| 字段名 | 类型 | 说明 |
-----------------------------------
| xxxxx |number |车间编码 |
------------------------------------
| room_t |varchar2| 车间名 |
------------------------------------
之后使用以下语法:
select pro_1,room_t,pro_3 from a,b where a.pro_2=b.xxxxx
不是可以一样得到结果吗??????!!!!!!
为什么要有这样的外键关联啊!!!!!!

2、既然我们要显示的字段中有“车间名称”段,那么,为何要将A表
中的车间字段设置为:车间编码,之后采用2表关联来得到车间名?????
我们可以在A表中直接设置车间名字段就行啊
产品表A

-----------------------------------
| 字段名 | 类型 | 说明 |
-----------------------------------
| pro_1 |varchar2| 产品名 |
-----------------------------------
| ttttt |varchar |车间名 |
------------------------------------
| pro_3 |number |产量 |
------------------------------------
在录入数据时直接将车间名写入A表,之后
用简单语法就能得到结果集:
select * from a;
如果需要将C表中字段加入到A中,也不必加入索引号,直接加入需要的字段值就行啊

传统做法的好处是什么?














...全文
134 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
str345 2006-12-29
  • 打赏
  • 举报
回复
to :
jacobsan(梅)
可能有一个车间对应多个产品的情况,采用你的方法就会使数据大量冗余
如:
车间1 产品1
车间1 产品2
.....
车间1出现n次,如果车间名很长就会使数据大量冗余

当然具体采用何种设计要看具体的业务需求
------------------------------------------------------------------
假如车间名100字符,代码2字符,那么,写入2字符就不会冗余???????
你的查询语句和对数据库的多表查询压力带来的数据结果集缓慢值得???对于一条记录多了几十到几百字符的硬盘空间占用,对于现在200G的硬盘有影响??????
ElderBrother 2006-12-29
  • 打赏
  • 举报
回复
1)外键关联对于数据保持完整一致性有很大益处。
在A表中的车间编码记录数据必须存在于B表中,如果A表中出现的车间编码如果B表中没有的话,将会出错。这样就保持了数据的完整一致性。如果不设定外键关联的话,这种错误sql是不会自动触发的,需要程序员自己控制。
同时外键关联后可以级联删除,也就是说如果设定级联删除后,我们只要删除B表中记录,那么A表相同的部门编码记录可以自动删除。当然很多时候不采用级联删除这种方法。
也不是说一定要求指定主外键关系,如果我们程序代码能够控制数据的完整有效性的话,这个关系不设定也没有关系,设定后反而限制了删除数据的先后循序。

2)直接把车间名称放在A表也未尝不可,但是考虑到车间名称列表应该不会只有A表用到吧,可能还有其他很多表都会用到,如果在用到的表中都把名称写进去的话。今后维护车间名称将会非常麻烦,比如今天车间名称叫“AAAA”,一段时间以后公司决定把“AAAA”改为“BBBB”,这时候你就发现在那么多表中,同时涉及大量数据记录需要同时更改,是非常困难的。反过来我们在A表(或者其他表)只是记录车间编码(系统内部使用的流水编号),改动的话只要把B表改过来后其他表不用做任何改动,非常容易实现。 这也就是关系数据库最大的一个特征。....
jacobsan 2006-12-29
  • 打赏
  • 举报
回复
所谓的方便是业务扩展的灵活性,你这个例子看不出来
str345 2006-12-29
  • 打赏
  • 举报
回复
如何方便?如果我要修改A表中W产品的生产车间名,由T车间修改为E车间,分2种情况,1、在B中有车间名E,那么,要将E的编码写入A中,与直接将E名称写入A中有何部一样,都是写一次A中的字段?????2、假设B中没用车间名E,那么先要在B中加入E,之后将E写入A中,还是写一次A,要么写E的编码,要么直接写E名,看不出方便来!!!!
jacobsan 2006-12-29
  • 打赏
  • 举报
回复
可能有一个车间对应多个产品的情况,采用你的方法就会使数据大量冗余
如:
车间1 产品1
车间1 产品2
.....
车间1出现n次,如果车间名很长就会使数据大量冗余

当然具体采用何种设计要看具体的业务需求
caixia615 2006-12-29
  • 打赏
  • 举报
回复
方便插入修改等操作...

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧