数据库第一范式概念:如果某个关系的属性所定义的域均是标量,那么称该关系是第一范式的。
通说点来说,在数据库设计中,如果某个表的每个字段的值都是不可分的(即标量),那么该表的设计就符合数据库第一范式。该原则可以直白的表述为:一条记录(元组、或一行)的每个属性都仅包含一个单一值。
以上概念看似简单,以至于我在网上看到有人竟然说:
很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
出自:http://dev.yesky.com/424/2220924.shtml
很明显,以上的观点是因为忽略了数据库建模的问题域得出的结论,因此是错误的。为什么错?看一下以下这个数据表:
id company
1 大唐电信, 西安市229号
2 高科集团, 西安市300号
上表中的company字段中保存着公司名称以及地址,很明显如果针对问题域中仅仅查询公司名称,那么该表设计是不符合数据库第一范式的。
同样的问题,在数据库建模的过程中我发现在决定一个属性是否是标量的问题上经常会遇到麻烦,例如日期时间就是一个很麻烦的域。因为它有6个不同的组件:年、月、日、时、分、秒。在数据库设计中我常常困惑的是将其存储为6个属性还是一个组合体呢?通常,答案是依据建模的问题域的语义来决定!!!以下我在数据库第一范式设计上的原则(仅供参考):
如果你的系统大部分时候会将这6个组件作为一个整体数据来使用,那么就将其作为标量。否则根据需要分开存储。
在数据库第一范式中除了以上问题,还应该注意另一种非标量值:重复组。下表给出重复组的一个例子:
id teacher course1 hours1 course2 hours2 course3 hours3
1 yjf 课程1 54 课程2 48 课程3 54
以上给出的重复组的数据库设计是数据库设计初学者经常犯的错误,设计者人为的决定了每位教师最多只能负责三门课程。也许该需求是当前的需求,但谁能保证若干年后每位教师是不是还是只能负责三门课程呢?? 所以说,这样设计的数据库不仅仅不符合第一范式,更重要的是该设计对系统进行了人为约束。
以上是我对数据库设计第一范式的一些理解,写博一篇,分享备查。
作者: 分类:数据库 标签: 时间:2009年9月13日
下一篇:最近有点晕
更多数据库文章>>
家庭会客厅