00:00
这一个表一个字段。一共有二四六八十十二。十三十四十五十六十七十八十九二十二一二十二十三,这个表里头一共有23个字段,这是一条记录,这是一条记录,那看看这个表。设计的有什么问题吗?有啥问题?有重复的字段,书名书名书名。
01:09
重复的字段。那另一方。如果说有1000个用户买了加外部开发详解。那你的加外部开发详解是不是要在数据库里头存在,就这几个字符?要在数据库中存在1000遍吧?这叫什么?这叫冗余数据。就是你的数据重复了,存在大量的冗余数据,还有其他问题吗?
02:03
谁规定了你的用户必须买三本书啊?那按照这个数据库设计用户。买了三本书。那如果说用户买了四本书呢。你这个数据库是不是就装不下了。如果用户只买,用户买了。四本书。五本书六本买456本,那你这个数据库就装不下了。就无法存放数据了。那如果用户只买一本书呢?你这些字段是不是就设计就这这些字段就得设计成那了。
03:08
如果用户只买。一本书。则数据库中药存在大量的钠,浪费了数据库的空间。这是几个问题。他的问题存在大量的冗余数据。表中的数据首付重复表中订单信息多个字段重复,不可扩展,买了三本书怎么存放?当用户只买了一本书。怎么办出现的问题?那现在看看这个表设计的有什么问题,注意我们数据库中的表。
04:04
从哪来的?现实生活中的实体。我们把这个实体做到数据库里的时候,做成一个。表。然后这个实体里面的属性。成为这个表中的字段。他们是有一的对应关系的,这个十题起立。这个实体大家找这个实体上有什么属性,名字,年龄,性别,身高这些东西,注意这个实体上有名字。名字。名字。名字。
05:07
在实体上,刚才我说了有名字名字名字名字。对吗?一个实体中是不可能有重复的属性的吧?那实体中不可能有重复的属性,我们这个实体做到数据库里成为一个表,实体里面没有重复的属性,那表中哪来的重复的字段呢?所以由此引申出了设计库的第一个。但是。所谓范式是什么呢?在设计库的时候应该遵循的规则。由于实体中没有重复的属性,所以表中不能有重复的数据列。数据库设计的第一范式表里面不能有重复的数据列,那现在遵循第一范式。
06:08
你的这些个书名定价,会员价,数量小低,这些就是什么呢?这些就是重复的数据啊,表里头不能有重复的数据。那。咋办呢?这是一个订单表。那我要把订单表拆成一个订单表一个订单。乔木了。这个订单买了有几个订单条目。把这三个这几个字段。从这个表里拆出来,做成另外一个表。一个订单表。这些字段,然后一个订单条目表。
07:04
比如说第一个,第一个这个用这两个字段可以做联合主键。订单表,这是订单项号、订单项项去别订单序号订单项,然后他们俩做联合组建。他买了第一本书,XML开发详解VC外部开发。把一个表拆成两个表,遵循了第一范式,表中不能有重复的数据列。拆成了两个表,拆成两个表之后,我们看它解决了哪些问题。如果用户买四本书呢?用户买四本书,那我只要加一个订单限号是不就行了?用户只买一本书,那我就记住一个订单限号不就行了吗?
08:06
这两个问题解决了。重复的字段问题。解决了,现在一个表里头没有重复的字段啊。但是这个问题。如果1000个用户买了外部开发详解。那你外部开发详解是不是在数据库里还要存在一些列?这个问题还没有解决呢。那我们再来看这个表,还有什么问题?这是主见,这条数据买了。几本书?
09:02
它的会员价是什么?因为这有一个定价,有个会员价。这两条数据。比如说。还是这数据起立。杨志国,这三个字是不是和这条数据?必须绑死啊,对吧,那我说这个这条数据,我让他叫梁明行吗。行不行这条数,这个学生现在叫梁永明。不行吧?那现在你看这个订单限号,这是主键。这两个字段。就这几个字段。这几个字段是不是和这个主键有必然的联系啊。
10:01
就是你这个组件对应着这三条数据啊,对应着这三项数据啊。这两个呢?它不一定就是说对应着这个。说明定价并不依赖于主线,你这两个这几个字段完全依赖于,完全和这条主线是绑死的,但是另外的这两个字段。其他的组件也可以买这个呀。说明定价并不依赖于空间。由此,我们引出了数据库设计的第二个范式,所有的非主键字段必须要完全依赖于主键字段。
11:01
这个表里头一条数据有,表里头有几个组件。只能有一个主键吧,这个主键所有的非主键字段必须和这个主键字段一反词,比如说。他的月薪是2000,是不是就和史密和7369绑死的,他的部门编号是20,就是和7369绑死的呀,所有的非主键字段必须要完全依赖于主键字段。书名定价。并不依赖于自己。那。所有的非主键字段。在这儿又把它拆出来。我把它拆成什么呢?拆成一个。图书表。
12:01
图书表里头有图书编号。然后书名定价放在这儿。把一个表,把两个表拆成三个表了,这加一个图书编号。这样不就OK了吗?把一个设计成一个订单表,一个订单条目表,一个图书表,你这个订单条目买了哪本书?一这本书一这本书它的书名是什么?定价是什么?那你看这两个字段是不是必须依赖于这个主键啊。所有的非主键字段必须要完全依赖于主键字段,那现在我们给它改成了这样,又把一个表,把两个表拆成了三个表。那你看我们这么拆之后,如果说有1000个用户买了VC,加加详解。
13:03
这是不是只出现1000遍一两。存在大量冗余数据的这个问题。也就解决了吧。拆成了两个表。拆成两个表之后再来看,还有其他问题吗?你这个主这条主线买的哪本书,买的是一号这本书。这个它的会员价他买了几本,是不是也依赖于主件啊?90呢?这个订单条目它对应的主件是不是99,这个90是不是就对应的这个主件啊。
14:05
但是90还。对应着这俩呢,那你如果说这儿变成了。Summer。这是不是就变成135了?也就是说,这个字段除了依赖主键字段之外。它还依赖于。这两个字段吧。小计子段可以由数量和单价计算出来,引申出数据库设计的第三个范式,所有非数。刚才第二段是什么呢?所有非主键字段。必须要完全依赖于主键字段。非主键字段不能依赖于其他的非主键字段。即非主段、非主键字段之间不能存在传递依赖。所谓传递依赖。
15:07
你这两个字段依赖于主线,而你这个字段又依赖于这俩字段,这就是传递依赖啊,所有的非主键字段必须要依赖于主键字段,而不能依赖于其他的非主键字段。数据库设计的方范式,那怎么办呢?把那个小计字段去掉。现在我们把。数据库。把这个表里头这个小记字段去掉,上次有一个同学问我那个单价的问题。在做那订货表的时候,经过这个之后,你应该明白那个单价,就是说那个不是有一个上次做过一个订货系统吗?那总计那个字段是不应该出现在这里。那就是所谓的传递依赖啊。因为你那个字段我可以通过前面两个字段计算得出来吧。
16:03
那数据库设计的三个范式?第一份是表中不能有重复的数据列,因为是一个实体中没有重复的属性。因为我们的表是由现实生活中的实体引申出来的。用数据库设计的范式有好处是什么呢?最大化的减小数据冗余。刚才我们遵没有遵循第二范式之前。那我的VC加加详解,要在数据库1000个用户买了,它要出现1000遍啊,按照第二算式之后,我们就让它只出现了一遍了。减少冗余量。减少完整性的问题。那我们来看按照这个范式来说,这个表设计的有什么问题。
17:01
员工表。员工姓名电话一类型电话二类型。这两个字段。这两个字段是不是重复的,虽然说你叫电话一电话二,但是它的描述的信息是重复的,去掉重复的字段,那怎么办?怎么去掉重复的字段,把这两个字段拆到另一个表里来呀?员工表,员工姓名电话,然后员工别编号,电话类型。用这个可以用这两个字段组成联合主接。把一个表拆成两个表,第二番是所有非主键字段必须要完全依赖于主键字段。一个。借书表。借阅记录从书边这是应该是。借阅编号。
18:02
一学生姓名,张一。借的书名。外部开发出版社。牛变。节约时间。2013年5月12号。看这边儿有啥问题。参考第二范是所有非主键字段必须要完全依赖于主键字段。如果说有1000个学生借了。这本书。那这两个字段是不是要在数据,这两个字段要在数据库中出现1000遍啊,冗余数据,另外来看,这两个字段完全依赖于你的主见吗?
19:06
它不依赖于这主件,那把一个表,把这两个表,这两个字段。从表里拿出来。做成一个图书表,图书编号,书名、出版社。然后这是一个。借月。编号这一个。图书编号,别写书名了。借阅编号,它的主见图书编号,他借了谁?一学生姓名张一借阅时间。当然我们也可以把学生姓名这。从这个表里单独拿出来,做出一个,把学生的信息再细化做成一个学生表。所有非主见字段必须要完全依赖于主键字段,第三段是所有非主见字段不能依赖于其他的非主键字段,即表中不能存在传递依赖。
20:07
姓名工资级别基本工资。基本工资依赖于工资级别。刚才我们那个员工表里头,史密斯是一级工资,一级工资他是从800,从700到一千二啊。二级工资是从一千二到一千三啊。他的级别不一样,他的基本工资也就不一样了。存在着传递依赖,那把基本工资这块,它依赖于它取出来单放到一个表里头,员工表工资级别。然后工资级别对照表,工资级别他的基本工资是多少,你像我们那个员工表和那个赛的薪水级别表。
21:01
不就是按照这个范式来做的吗?然后。姓名、证件号、发证机关。你不同的发证机关。发证机关依赖于证件号,比如说你这是驾照,驾照的号码是什么样,虽然说现在驾照和身份证号是一样的。你的价,这个发证机关依赖于你的证件啊。比如说你的身份证是由政府部门发的,你的驾照是由车辆管理所来发的,你的社会那个保障号是由社保部来发的。存在着传递依赖。把发证机关依赖于这个也是存在着传递依赖,取出来放到一个表里,姓名,身份证号,然后身份证号发证机关。购买商品记录,商品编号、名称、单价、数量。
22:07
合计呀,传递依赖,把合计字段拿掉。三个范式,然后表中一对一。一对一的关系通过主键主外键关联,在外键那设置一个唯一约束。一对多就是简单的主外键关联,多对多借助于关系啊,数据库设计的三大方式,在数据库设计的时候,你要自己仔细去看。会有第四范式、第五范式、第六范式等一系列的范式。我们遵循的范式越多。我们的数据库划分的就越详细,是说我们数据库划分的越详细就一定越好吗?不一定。你数据库表越多,那你在查询信息的时候,你要从一个表里查速度快呢,你还是从十个表里查速度快呢?表越少,它的速度越快啊,这时候你又,但是你又不遵循范式,这个数据库又存在大量的问题,这时候人们就在数据库的详细度和这个速度之间做了一个取舍,我怎么说既遵循范,既遵循数据库设计的规则,我又不影响我的速度呢?
23:32
所以人们最后找到了一个折中方案。在设计数据库的时候。用到前三个范式。数据库设计的时候还有第四、第五、第六方式,但是人们在执使用中经常主要用到的就是前三个方式,这样既能保证数据的详细度。又能够保证数据的查询速度。三个范式在数据库面试的时候,在就是说在找工作面试的过程中,也是经常会遇到的问题。
24:12
有信引起的同学可以去设计一下这个。但是估计是课堂上我没有时间去讲它了。
我来说两句