发表于: 2020-07-20 23:48:33

1 1324


 

15.什么是实体表,什么是关系表,一对多和多对多应该怎么设计表? 

实体表就是对应实际的对象的表,而关系表不代表一个对象,而是对象间的关系

一对多两张表,多的表加外键;多对多三张表,关系表两外键


16.什么是外键,用处是什么,为什么不建议使用外键做关联?

外键是相对于主bai键说的,是建立表之间的联系的必须的前提。

性能问题

假设一张表名为user_tb。那么这张表里有两个外键字段,指向两张表。那么,每次往user_tb表里插入数据,就必须往两个外键对应的表里查询是否有对应数据。如果交由程序控制,这种查询过程就可以控制在我们手里,可以省略一些不必要的查询过程。但是如果由数据库控制,则是必须要去这两张表里判断。

并发问题

在使用外键的情况下,每次修改数据都需要去另外一个表检查数据,需要获取额外的锁。若是在高并发大流量事务场景,使用外键更容易造成死锁。

扩展性问题

这里主要是分为两点

做平台迁移方便,比如你从Mysql迁移到Oracle,像触发器、外键这种东西,都可以利用框架本身的特性来实现,而不用依赖于数据库本身的特性,做迁移更加方便。

分库分表方便,在水平拆分和分库的情况下,外键是无法生效的。将数据间关系的维护,放入应用程序中,为将来的分库分表省去很多的麻烦。

技术问题

使用外键,其实将应用程序应该执行的判断逻辑转移到了数据库上。那么这意味着一点,数据库的性能开销变大了,那么这就对DBA的要求就更高了。很多中小型公司由于资金问题,并没有聘用专业的DBA,因此他们会选择不用外键,降低数据库的消耗。

相反的,如果该约束逻辑在应用程序中,发现应用服务器性能不够,可以加机器,做水平扩展。如果是在数据库服务器上,数据库服务器会成为性能瓶颈,做水平扩展比较困难。


17.什么是数据库范式,是否应该严格遵守范式,什么情况下应该不遵守范式? 

数据库中三bai大范式的定义如下:

1、第一范式:

当关系模式zhiR的所有属性都不dao能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。

2、第二范式:

如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。

3、第三范式:

设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF。

范式只是为了可以为你理清数据库的关系的,但是有些情况采用范式的代价要比不采用范式的代价大就可以不适用范式。比如增加了程序逻辑,多联接关系表,不常更新或不更新的基础表信息都可以不必须按照范式的规范来设计。

范式主要为了减少数据库的冗余,但是有时也会为了查询速度来换取数据库冗余


找赵鹏师兄拿到前端资源

 

 设计DB


需要学员表

 

需要职业表

service

public interface ProfessionService {
int deleteByPrimaryKey(Long id);

   int insert(Profession record);

   Profession selectByPrimaryKey(Long id);

   List<Profession> selectProfession();

   int updateByPrimaryKeySelective(Profession record);

serviceImpl

@Service
public class ProfessionServiceImpl implements ProfessionService {

@Autowired
   private ProfessionMapper professionMapper;

   @Override
   public int deleteByPrimaryKey(Long id) {
return professionMapper.deleteByPrimaryKey(id);
   }

@Override
   public int insert(Profession record) {
return professionMapper.insert(record);
   }

@Override
   public Profession selectByPrimaryKey(Long id) {
return professionMapper.selectByPrimaryKey(id);
   }

@Override
   public List<Profession> selectProfession() {
return professionMapper.selectProfession();
   }

@Override
   public int updateByPrimaryKeySelective(Profession record) {
return professionMapper.updateByPrimaryKeySelective(record);
   }

编写Controller

@Controller
public class TaskController {

@Autowired
   private StudentService studentService;

   @Autowired
   private ProfessionService professionService;

   @RequestMapping(value "home",method = RequestMethod.GET)
public String getIndex(Model model){
List<Student> studentList = studentService.selectStudent();//查询优秀学员
       Integer count = studentService.selectByLearning();//累计在线学习人数
       Integer number = studentService.selectByWorking();//已找到工作的学员
       model.addAttribute("studentlist",studentList);
       model.addAttribute("count",count);
       model.addAttribute("number",number);
       return "index";
   }

@RequestMapping(value "profession",method = RequestMethod.GET)
public String getProfession(Model model){
List<Profession> professionsList = professionService.selectProfession();
       model.addAttribute("profession",professionsList);
       return "profession";
   }
}

了解Tiles

就是为了把页面拆成一块一块得 方便维护扩展

最近有点浮躁 有点划水 反省了 端正了下态度

明日计划 使用Tiles


返回列表 返回列表
评论

    分享到