数据库开发技术 课堂笔记2
本文主要来源是课堂笔记
有两种情况是比较头疼的:
- 数据库重构
- 数据库迁移(不同的数据库差异巨大)
空 == 空
这个判断的返回值,每个数据库的设计都不一样
返回值 | 数据库类型 |
---|---|
false | MySQL Oracle |
空 | |
true | SQL Server |
由于空值可能导致无法预料的错误,因此尽量要避免空值的使用
Boolean类型
数据中没有boolean类型,是因为不希望使用标识信息,而是使用具体信息
就比如,某个教室被预定,这时候不希望出现的是教室是否被占用这个标识信息,而是在什么时候、被什么人占用这类的具体信息
单继承、多继承
在单继承的情况下,存表比较简单
老师上课举了这么一个例子
刘老师,是人,那么,在“人”这张表,存刘老师的“人”的信息,在“教师”这张表,存刘老师的教师信息。另外,在“人”这张表,存刘老师的身份信息,是教师,这样可以把“人”和“教师”两张表联合起来查询,得到刘老师的完整信息。
现在,刘老师为了给他儿子买乐高玩具,需要给曾老板(教我们Linux基础的老师)打工,这时候,他就多了一个扫地僧的身份,也就是他的信息这时候需要三张表来存储。
这时候要关联有困难,一种不是很好的做法是把“人”表里面加列,每多出现一个身份就多用一个标识位
当然,稍微好一点的做法是,在“人”表里面,存多条同一个人的记录,记录不同的身份
表的效率
from的表越少,效率越高,因为笛卡尔积的存在。
假设有一张
取
在Oracle中,最多from16张表
为了减少表关联,有时需要去掉代码表与主表的关联,因为这样可能会有过多的表连接,影响效率
所谓的代码表是这样的:
id | 值 |
---|---|
1 | 大风 |
2 | 暴雨 |
3 | 晴朗 |
主表是这样的:
主表id | 代码id |
---|---|
aaa | 1 |
bbb | 3 |
如果代码表比较多,就可能导致查询比较慢,一种改变的做法是这样的:
主表id | 代码值 |
---|---|
aaa | 大风 |
bbb | 晴朗 |
这样存储的时候有冗余,但是查询的时候速度较快,从工程学的角度看,为了时间做出空间上的牺牲
共同的连续存储过程,如果只被一个app使用,那么存在数据库与存在app都可以,如果被多个app使用,那么应该放在数据库中。
数据的定义应该放在db中,例如人的年龄不应该是负数,即使app中有判断,也要在数据库中定义
Oracle中有一个关键字是check,可以检查数据的定义
在数据库中不能做过于灵活的设计
优化是一定要付出代价的,一定会带来恶果
处理历史数据或者相似的情况,就比如历史价格,可以在主表中存一个price作为当前的price,在history表中存储所有的历史数据,这样的话,虽然主表中有冗余的price,但是查询的时候方便了。
在可以不使用数据库的情况下,就不使用数据库,文件系统很好用。