数据库设计:关于数据库范式一些理解

1NF:数据表中的每一列信息都能够确切表述,但凡关系型数据库(mysql/oracle/sysbase/db2/sql server)都自动满足1N

表student1
id name age
1 张三 12
2 李四 20

2NF:每个表的记录是唯一的,通常使用自增长主键实现

3NF:表中不存在冗余数据
表student2
id name age 系别 专业
1 张三 12 计算机 软件工程
2 李四 20 计算机 软件工程
见表student2中红色部分,两条记录中系别和专业的数据有冗余
要改进设计则将系别和专业部分保存在另外一张(比如class),student2使用一个字段(classid)来关联class表

表student2
id name age classid
1 张三 12 1
2 李四 20 1
表class
id 系别 专业
1 计算机 软件工程
2 英语系 商务英语

以上两张表通过表class的id和表student2的classid建立链接,在SQL语句中通过join关联:
select a.*,b.* from student2 a left join class b on a.classid=b.id

并不是所有情况下都需要符合3NF,为了提高效率,允许存在一些冗余数据,见下

分类表:category
id name(分类名称)
1 计算机
2 英语
分类表:books
id catid name(书名称) count(书籍数量)
1 1 php开发 30
2 1 java开发 32

按照以上设计,如要统计每个分类下书籍的总数量,则程序需要遍历每个分类且根据分类ID来统计书籍总数,在数据量较大的情况下,可能会影响性能。

可以这样优化,在category表中添加一个字段来保存该分类下所有书籍的总数
分类表:category
id name(分类名称) count(书籍数量)
1 计算机 62
2 英语 0
分类表:books
id catid name(书名称) count(书籍数量)
1 1 php开发 30
2 1 java开发 32

如需查询某个分类下的书籍总数,只需要查category表即可,不需要统计books表中的数据

在此情况下,允许出现适当的数据冗余

PS: 本人才疏学浅,写得比较简单,如有不对的地方,请指点迷津。

转载于:https://my.oschina.net/haigou20/blog/159156

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值