麻辣堂|资源主站|开发论坛|在线手册
首页 Apache Linux Java MySQL 注册帮助 
PHP项目开发组是PHP开发资源网于2007组年建成立的项目开发团队,目前核心开发成员有27人, 项目协作成员8名.下设7个开发组,主要承接大/中型网站项目开发任务。

    由于开发任务较多,人员比较紧张,现面向社会招聘全职或者兼职开发人员,不管你是在校大学生,还是全职开发人员,以及SOHO都可以联系本站,我们可以长期合作,并为您带来丰厚的报酬。
  您现在的位置:PHP开发资源网 > 麻辣堂 > 详细资料
待解决
[原创]关系型数据库设计 -- 续
悬赏分:20 - 2007年08月13日

这是接几天前的一篇东西
http://www.phpx.com/happy/thr75019.html

步骤三
3NF - Third Normal Form
在这一步中,我们要做的是把在一个表里的所有不是由主键决定、但是又是由其中一个非主键的决定的所有字段分离。
我这么说可能会令大家有点糊涂,让我们看看例子就清楚了。
其实在我上述的例子中并不存在 3NF,这是我的失误,先say sorry. 为了补救,作了如下修改。另外就是上次在编写时不够仔细,在2NF中没有把货物表也分离,在此我把它也分开为“定购货物表“和“库存表“两个。因此在 2NF 后应有如下表
总表:字段如下
(order_id*), 日期,总金额(计算)
定购货物表:字段如下
定购数量,此货物总价(计算)
库存表:字段如下
(product_id*), 货物名,库存数量,单价
客户表:字段如下
(customer_id*),客户名,客户地址,客户电话

在这里只对客户表的客户地址做出如下的改动
客户表:字段如下,括号中的字段是新加的,代替了客户地址
customer_id*,客户名,(省名,城市,邮编,门牌号+街名),客户电话

对于修改后的表,省名和城市好像还是属于客户的,但是我们再仔细的想想,其实他们不是由customer_id 决定的,而是由另外一个非主键邮编决定的。当我们输入一个邮编时,省名和城市已经是确定了,因此我们要把它们从表中分离。

然后,我们就要进行表与表之间关系的分析了,目标是要所有的表是一对多的关系,不能存在多对多的关系。对于一对多关系的表,在多方中加入一方的主键,并作为Foreign Key(外键,用#号表示)。
分离后共有 5 个表,
总表:字段如下
(order_id*),(customer_id#),日期,总金额(计算)
定购货物表:字段如下
(order_id#), (product_id#), 定购数量,此货物总价(计算)
库存表:字段如下
(product_id*), 货物名,库存数量,单价
客户表:字段如下
(customer_id*),客户名,(邮编#),门牌号+街名,客户电话
分离出的表 - 邮编表:字段如下
(邮编*),省名,城市

简单的解析一下,对于“总表“和“客户表“,他们的关系是“多<-->壹“的关系,就是说一个客户可以有多个订单,而一个订单只能是只有一个客户,所以要把“一“中的主键(customer_id)增加到“多”方中,即总表中,并指定为外键。其他的一对多表如此类推就行了。

对于“多对多“的表,处理的方法是把他们变成“一对多对一”的方式。如上面“总表”和“库存表“的联系一样,是通过“定购货物表“作为一个中间表来联系起来的。

现在这个数据库的结构就符合了 3NF 的规定。也就是说,他基本上是完整的了。

由于 4NF,也称为 BCNF (Boyce-Codd Normal Form) 和 5NF 并不是常用到,而在上面的例子中也没有必要再往下继续分解,还有就是本人水平有限不敢在此误人子弟。只是简单的说一下,作抛砖引玉作用。
实际上,大多数的3NF 都是BCNF,只有在以下的情况不是
- 候选键是复合键(即不是单一键)
- 在关系中超过一个候选键
- 在某个表中的键不是独立的(即有些非键字段是公共的)


编者按:此文章只作经验谈,希望对数据库设计有兴趣的朋友有点帮助。要是大家觉得分开两篇看不方便,我可以合并重贴。也欢迎你们能指出我不妥(不对)的地方。

提问者:kev   08-13 19:07
答复
路过。。。顺便帮顶:)
回答者:玉米づ冰冻可乐 - 瓦岗村民 8-22 09:10
我也来回答:
不管你有没有帮助我们,瓦岗寨8万村民将感谢你。。。。。

为防止灌水,您需要计算一道数学题: 答案:
5 + 14 = ? 请将计算结果填在上面

 
[]
©2007 PhpRes.COM