orm数据库查询优化和数据库三大设计范式

数据库查询优化

only与defer	
select_related与prefetch_related

orm语句的特点:惰性查询
不使用查询结果,就不执行语句

# only与defer
    res = models.Book.objects.only('title')
    for i in res:
        print(i.title)  # 点击only括号内的字段 不会走数据库
        print(i.price)  # 点击only括号内没有的字段 会重新走数据库查询

    res = models.Book.objects.defer('title')  # 对象除了没有title属性之外其他的都有
    for i in res:
        print(i.price)

# select_related与prefetch_related  跟跨表操作有关
    
    res = models.Book.objects.select_related('authors')  # INNER JOIN
    
    select_related内部直接先将book与publish连起来 然后一次性将大表里面的所有数据
    全部封装给查询出来的对象
        这个时候对象无论是点击book表的数据还是publish的数据都无需再走数据库查询了
    
    select_related括号内只能放外键字段    一对多 一对一 多对多不行
    
    res = models.Book.objects.prefetch_related('publish')  # 子查询

    prefetch_related该方法内部其实就是子查询
        将子查询查询出来的所有结果也封装到对象中
        感觉好像一次性搞定的

数据库三大设计范式

数据库三大设计范式:
对数据在数据库中的存储进行规范,减少数据之间的冗余,耦合。
什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。

第一范式:1nf,每个字段都不可再分割为多个字段,原子性
第二范式:2nf,满足第一范式,所有 非主键字段,都依赖 主键字段;数据列中出现数据重复,就要把表拆分
第三范式,3nf,满足第二范式,所有 非主键字段,都直接依赖 主键字段,而没有间接依赖

三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。

参考博客:
https://www.cnblogs.com/knowledgesea/p/3667395.html
https://blog.csdn.net/dosthing/article/details/87954213
    
posted @ 2020-06-02 16:48  pythoner_wl  阅读(176)  评论(0编辑  收藏  举报