数据库设计一定要满足第一范式吗?满足第一范式的好处是什么?

2016-06-28 10:02:38 +08:00
 kindjeff

不满足第一范式的例子:

比如我的课程设计“学生成绩管理系统”里,学生的成绩没有单独作为一张表,而是作为一个字段储存在学生表里,这个字段是一个 json 字符串(保存所有的 科目( key ):成绩( value ),是多个值,不满足第一范式)。

我认为这样查询很方便,学生只需要一次性取到自己的所有成绩,管理员也只需要一次性查到一个班级所有人的所有成绩作为一张列表;修改和录入成绩相对于查询来说是很少量的操作,做一些 json 的 decode 和 encode 也不是很费功夫。

那么这个时候满足第一范式的好处是什么呢?

8324 次点击
所在节点    MySQL
34 条回复
helloSwift
2016-06-28 10:38:35 +08:00
满足第一范式是基本要求,
gyteng
2016-06-28 10:40:40 +08:00
按楼主的说法,出成绩前如何查询学生人数?
yueyoum
2016-06-28 10:44:20 +08:00
@mcone LZ 不是 书读的少,想的太多, 而是 想的也太少。

随便举个几个例子, LZ 就知道 为啥要 分开存储了。

1 , 查询所有 选修了 A 课程,并且成绩在 80 分以上的
2 , 查询 高数,大物,英语总分在 300 以上的
3 , 查询 所有科目全部 挂科的
... ...

例子太多, 不再举例了


按照范式设计, 才能利用 数据库给你提供的各种功能。

还有, 上面还有人说要 NOSQL , NOSQL 也不是这么用的。


比如 客户端程序员看了下 mysql 和 mongodb 后,说 mongodb 真好, 符合 OO 思想, 把所有东西全部放在一起。

像 LZ 这样的数据库新手 一般都有 这样的想法。



做到后面 你才发现, 范式 只是一个指导
具体情况具体分析, 到底哪里要范式, 哪里要 抛弃范式。

LZ 多做几个大项目就明白了。
wdrsam
2016-06-28 10:52:36 +08:00
感觉开发做多了,建数据库的时候直接写出来就自带第一范式的 buff 。。。
felixglow
2016-06-28 10:54:53 +08:00
没听过反范式吗,过于范式是不行的,根据场景,适时的结合起来用。
slixurd
2016-06-28 11:09:51 +08:00
同楼上,真的做业务开发没见过多少遵守范式的。
大量冗余都是为了提高性能
不然是不是该把外键也加上,还有 view , procedure
wsxyeah
2016-06-28 11:54:52 +08:00
正巧课设也是做成绩管理,不过不用考虑课程多次开课等问题。

要求是 一个学生在一门课下的成绩 分为多个部分,且不同部分的成绩按一定权重决定总成绩,
主要分了四张表:学生,课程,选课,成绩
为方便查询,为「选课」表增加了一个「总成绩」字段,更新成绩时计算并更新该字段
WhoMercy
2016-06-28 12:24:03 +08:00
第一范式只是最基本要求
hantsy
2016-06-28 12:34:27 +08:00
过于在于范式会导致数据库的设计与程序设计上的矛盾,比如, Hibernate 中的继承支持,必须打破范式。
cjyang1128
2016-06-28 13:11:28 +08:00
一直觉得数据库设计是哲学问题
changwei
2016-06-28 16:03:01 +08:00
首先,不满足第一范式,连目前的关系数据库都无法存储你这种格式的数据,其次,用了第一范式,查询就会很灵活,而不是每次几个数据捆绑在一起查
HypoChen
2016-06-28 22:43:20 +08:00
@kindjeff 能让数据库实现的逻辑就别自己写,比如取总成绩前 n 名的学生,比你自己把表全跑出来再排序不知性能好多少,还有更强的鲁棒性。类似的情况还很多。
sundev
2016-06-28 22:52:56 +08:00
你可以 google 一下:反范式设计
darasion
2016-06-29 09:01:25 +08:00
范式是用来解决一般的通用的问题的。一开始可以先按照范式来做,这样能解决大多数问题;
当出现比较特殊的问题时,再考虑用特殊的办法解决,而特殊办法很可能就是反范式的,因为有问题驱动,反什么都无所谓了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/288760

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX