数据库设计 范式
数据库设计有五个范式,
而我们设计的时候一般都会遵循前三个范式,
例如一个站内信系统,
这样貌似没有什么问题,但是如果支持群发,怎么办?
我的两个思路是
1.将收件人的用户名以字符串拼接的方法存储
这样就违反了第一范式 ,一个列 的值要有原子性。
2.可以符合第一范式
id 是主键
但是这样会造成数据的大量冗余,
如果一个人对整个班级或者群里面的人群发的话,一次要添加 太多的数据,而且 MsgTitle,MsgContent字段的信息都相同,
如果MsgContent相同的话,插入时候会很损失性能的。
询问一番后,
要再建一张表 dbo.Message
MailID(pk) MsgTitle MsgContent
dbo.Relation
ID SenderName ReciverName MailID(FK)
这两张表 可以减少数据存储量来优化存储结构
所以再建立数据库的时候要 考虑
1.数据冗余
2.插入,删除,修改 异常。
遵守范式可以减少数据存储量,
但是代价可能是 性能上的损失,因为 会涉及到联表查询,而且使 查询语句更复杂。
例如 群发一条站内信的时候,会在dbo.Message 中插入一条站内信信息,同时要在dbo.Relation表中插入多条数据。
删除的时候也要对两个表进行操作,如果联表多的话,会增加复杂性,和 性能损失。
遇到上面情况,我更喜欢违反范式,
以提高 性能 和 逻辑的清晰度 以及 sql语句的简单性。
注:范式 ,一个指南,而不是准则。
所以设计数据库的时候要综合考虑 (数据存储量,数据结构)和(性能,逻辑)。
设计出 更符合实际的 数据库 ,毕竟 事实 和 理论 是有 矛盾的。
范式的对象都是 对列的,
范式一:每个列和记录包含一个而且只包含一个值
范式二:一张第一范式的表,对于非主键字段的值完全依赖主键(用于符合主键) 完全依赖主键---不是仅依赖主键的一个字段
范式三:一张第二范式的表,所有非主键字段的值仅依赖主键。
<a href="http://www.douban.com/subject/1869705/"><img src="http://t.douban.com/mpic/s1888787.jpg" style="float:right;padding:0 0 20px 20px;border:0"/></a>