zoukankan      html  css  js  c++  java
  • 09 ORM表关系

    ORM表关系

    数据库关系分析

    1、之间有关系的两个表,增删改操作会相互影响(当一个表被修改,另外关联的其他表也要随着改变,当表之间的关系太多,会导致效率低),查询操作就是正常的连表操作

    2、之间有关系的两个表,断开关联,但所有的数据保持与原来一致

    • 每个表都可以单独操作,增删查改操作效率极高,但是容易出现脏数据(可以通过代码避免)
    • 由于数据没有任何变化,所以查询的连表操作不会受到任何影响

    3、Django的ORM支持断关联操作关系表,且所有的操作方式和没有断关联操作一致

    通过Django的ORM操作,当业务量超大的时候,不如原生sql语句的效率高

    ORM操作关系

    外键位置:

    1)一对多:ForeignKey必须放在多的一方,例如:书与出版社,外键应该放在书表

    2)多对多:ManyToManyField放在任何一方都可以,因为会创建关系表,在关系表中用两个外键分别关联两个表

    3)一对一:OneToOneField放在依赖的表中,例如:作者与作者详情表,详情表依赖于作者表,因此放在作者详情表,OneToOneField会被转换为 外键 + 唯一约束 关系。

    ORM外键字段关系:

    ForeignKey可以设置related_name, db_constraint, on_delete

    OneToOneField可以设置related_name, db_constraint, on_delete

    ManyToManyField只能设置related_name, db_constraint,不能设置on_delete的原因:不管是关联的A表,还是B表,数据修改,都会影响到关系表(默认级联);如果想控制,只能自定义关系表,在关系表的两个外键分别设置on_delete。

    参数含义
    related_name:表之间反向访问的名字,默认是 表名小写|表名小写_set
    db_constraint:表之间的关联关系,默认为True,代表关联,设置False,可以提高增删改的效率,且不影响查等其他操作
    on_delete:在django 1.x下默认是CASCADE,在django 2.x下必须手动明确
    

    on_delete对应的关系:
    作者没,作者详情一定没:models.CASCADE
    作者没,书还是该作者出的:models.DO_NOTHING
    部门们,部门内的员工全部进入未分组部门:models.SET_DEFAULT (需要配合default属性使用)
    部门们,部门内的员工部门外键字段设置为空:models.SET_NULL (需要配合null=True属性使用)

    class Author(models.Model):
        name = models.CharField(max_length=64)
     
     
    class AuthorDetail(models.Model):
        phone = models.CharField(max_length=11)
        author = models.OneToOneField(
            to=Author,
            related_name='detail',
            db_constraint=False,
            on_delete=models.SET_NULL,
            null=True
        )
    
  • 相关阅读:
    「UOJ#117」 欧拉回路
    「LuoguP1341」 无序字母对(欧拉回路
    「NOIP2002」「Codevs1099」 字串变换(BFS
    「IOI1998」「LuoguP4342」Polygon(区间dp
    「LuoguP2420」 让我们异或吧(树上前缀和
    「USACO13MAR」「LuoguP3080」 牛跑The Cow Run (区间dp
    「LuoguP1220」 关路灯(区间dp
    「CQOI2007」「BZOJ1260」涂色paint (区间dp
    「LuoguP1430」 序列取数(区间dp
    「USACO16OPEN」「LuoguP3147」262144(区间dp
  • 原文地址:https://www.cnblogs.com/cnhyk/p/12459053.html
Copyright © 2011-2022 走看看