学校里教Sqlserver,这道题无法理解。原题认为数据库关系模型不允许有多值属性,老师的解释是 举例 一个学生(实体)的学号只能有一个。
但是我的考虑是,数据库中总会有需要在一个属性中存放多个值的情况。
学校里教Sqlserver,这道题无法理解。原题认为数据库关系模型不允许有多值属性,老师的解释是 举例 一个学生(实体)的学号只能有一个。
但是我的考虑是,数据库中总会有需要在一个属性中存放多个值的情况。
5 回答3.3k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
1 回答2.4k 阅读✓ 已解决
1 回答2.4k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
1 回答2k 阅读✓ 已解决
3 回答2.3k 阅读
嗯,这个问题是这样理解的:
1: 关系数据库(SqlServer,Oracle,Mysql,postgreSQL)并不会阻止你在一个列中放入多值. 例如:你在开发一个车辆管理系统中,你设计了一个列叫"型号",而填入的行内容是"宝马X1","奥迪A8","奥迪Q7". 这里"型号"这列隐含了品牌这个信息,实际表达的是品牌+型号, 在随后的应用中如果你有提取品牌的需求,就需要取出"型号"列进行字符串拆解, 这不仅仅费事还会影响以后的按品牌统计. 但是, 关系数据库不会阻止你这样做.
2: 第一条例子中,显然不是一个好的做法. 在人们设计数据库的过程中,慢慢总结了一些好的做法, 叫做关系模型范式(可以自己去查). 第一条例子恰好违反了第一范式, 所以不是好的设计(这个不绝对,实际工作中有时为了特定需求会可以违反某些范式)
3: 那既然这个例子违反了第一范式,如何改正它呢? 通常有两种方法: 一是增加一列,对上面的例子就是增加"品牌"列, 将品牌和型号分列存储; 二是将一条记录拆成两条记录(这个对上面的列子不适用),适用于多值是平行多值(没有父子关系, 包含关系,上下关系的);
建议学习一下关系模型三范式,思考一下为什么范式这样规定. 另外,凡事无绝对,实际中要以实际需要考量,不可刻板的应用范式. 羡慕学生时代的你们, 加油!!!