WXL's blog

Talk is cheap, show me your work.

0%

推免

专业课

DB

如何理解关系型数据库的常见设计范式?

参考:https://www.zhihu.com/question/24696366

范式:一张数据表的表结构所符合的某种设计标准的级别

关系和关系模式:“关系模式”和“关系”的区别,类似于面向对象程序设计中“类”与“对象”的区别。“关系”是“关系模式”的一个实例,可以把“关系”理解为一张带数据的表,而“关系模式”是这张数据表的表结构。

第一范式:1NF。符合1NF的关系的每一个属性都不可再分。仅仅符合1NF,会存在数据的大量冗余、插入异常、删除异常、修改异常等问题。比如下图1所示的表:

表1

数据冗余:每一名同学的学号、姓名、系名、系主任重复多次。

插入异常:加入学校新建了一个系,但是还没有学生,无法将系和系主任的信息录入系统。因为关系模式要有一个,用于唯一标识每一个元组,仅仅使用学号或者姓名或者系名都无法唯一标识一个元组,所以需要使用多个属性联合标识,这里使用学号+课名来标识。新建一个系之后,还没有学生,此时学号不存在,课名不存在,根据三种关系完整性约束中实体完整性的要求,关系中的码所包含的任意一个属性都不能为空,所有属性的组合也不能重复,故无法将数据录入系统。

删除异常:如果将某个系中的所有学生信息删除了,那么这个系和系主任信息也不存在了,但是学生没有了并不能代表系也没有了。

修改异常:假如李小明转到法律系,为了保证数据库中的数据一致性,需要修改3条记录中系和系主任的数据。

第二范式:在1NF的基础上,消除了非主属性对码的部分函数依赖。就插入异常而言,由于新建的系还没有学生,关系模式中的码的属性还不完全,但是仅仅用码的部分属性如学号,即可确定系和系主任,这就是系和系主任两个属性部分函数依赖于码,而消除了非主属性部分函数依赖于码,即升级到了2NF,消除的方式是模式分解。经过模式分解之后就得到了图2所示的表:

表2

修改之后,检查一下数据冗余、插入、删除、修改异常是否有解决:

  • 李小明转系到法律系:只需要修改一次系和系主任,修改异常有改进。
  • 学生的各个属性的冗余减少,数据冗余有改进。
  • 删除某个系的全部学生信息,系和系主任的信息也消失,删除异常无改进。
  • 插入一个尚无学生的系的信息,无法完成,插入异常无改进。

所以注意,升级到了2NF不代表可以完全解决1NF遇到的那几个问题:数据冗余、插入、删除、修改异常。

第三范式:在2NF的基础上,消除了非主属性对码的传递函数依赖。2NF仍然有问题,主要是非主属性系主任对于码到学号的传递函数依赖(学号->系,系->系主任),为了解决问题就需要消除非主属性对码的传递函数依赖。经过模式分解之后得到图3所示的表:

表3

现在看看之前的问题:

  • 删除某个系中所有的学生信息:系和系主任的信息还在,有改进。
  • 插入一个尚无学生的新系:可以插入,有改进。
  • 数据冗余更少:有改进。

结论:由此可见,符合3NF要求的数据库设计,基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题。当然,在实际中,往往为了性能上或者应对扩展的需要,经常 做到2NF或者1NF

BC范式:在3NF的基础上,解决主属性对于码的部分函数依赖和传递函数依赖。

OS

实时系统和分时系统的区别

参考:https://blog.csdn.net/qq_38315190/article/details/80613771

实时系统:保证在一定的时间限制内完成特定功能的操作系统。小的嵌入式操作系统经常需要实时操作系统,内核要满足实时操作系统的要求。例如,可以为确保生产线上的机器人能获取某个物体而设计一个操作系统。

分时系统:使一台计算机同时为几个、几十个甚至几百个用户服务的一种操作系统。

同步和互斥的区别

参考:https://blog.csdn.net/goodluckwhh/article/details/8535775

互斥:互斥是两个任务之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行。

同步:同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)。

互斥具有唯一性和排它性,但互斥并不限制任务的运行顺序,即任务是无序的。而同步的任务之间则有顺序关系。

进程和线程之间的区别

进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;其它进程就是用户进程。线程是OS调度的基本单位,在基于线程的多任务的环境中,所有进程有至少一个线程,但是它们可以具有多个任务。这意味着单个程序可以并发执行两个或者多个任务。多进程与多线程相比,每个进程都有一个完整的地址空间操作环境状态。每个进程用于创建和维护大量状态信息的成本,与一个线程相比,无论是在时间上还是空间上代价都更高。此外,进程间所固有的独立性使得程序员需要花费很多精力来处理不同进程间的通信。

进程的资源主要包括:

  • 地址空间(涉及到同步互斥的地址段主要是数据段和堆栈段);
  • 打开的文件句柄。

线程中的资源:一个进程中的所有线程共享进程的地址空间(数据段/堆)、打开的文件句柄。由线程独享的资源包括:

  • 栈;
  • 线程专有数据区。

Network

英语

  1. Please introduce yourself briefly.
  2. Why do you choose our school?
  3. Could you tell us something about your university?
  4. What is your strengths?
  5. What are the differences between C and C plus plus?
  6. What are the differences between stack and array?
  7. Can you tell me what is link list?
  8. Plans in the postgraduate study?
  9. Please introduce your project.
  10. What social responsibilities should a post-graduate take?
  11. Please Introduce your hometown.
  12. What impressed you most when you were at university?
  13. If you failed this time, what will you do in the near future?
  14. What kinds of opportunities are you looking for?
  15. What is deep learning?
  16. Could you say something about your family?
  17. What do you usually do in your leisure time?
  18. Who is the most important person in your family?
行行好,赏一杯咖啡吧~