尽量少使用外键,如果有外键完整性约束,需要应用程序控制---ContentTypes

尽量少使用外键,如果有外键完整性约束,需要应用程序控制

解读:外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql 的性能,甚至会造成死锁。高并发情况下容易造成数据库性能,大数据高并发业务场景数据库使用以性能优先

最好的方式是,只有当你需要对某个对象或模型进行关联时,使用应用程序来创建与那个模型的关系

django开发中可以使用django内置组件——ContentTypes来处理这一问题

 

# 基于ContentTypes创建表结构
class Coupon(models.Model):
    title = models.CharField(max_length=32)   # 优惠券名称
    # 第一步:与ContentType表绑定外键关系
    content_type = models.ForeignKey(to=ContentType, on_delete=None)
    # 第二步:建立对象id
    object_id = models.IntegerField()
    # 第三步:content_type和object_id绑定外键关系
    content_object = GenericForeignKey("content_type", "object_id")
  • GenericForeignKey不会在数据库生成列,只用于帮助你进行添加和查询。
  • GenericRelation不会在数据库生成列,只用于帮助你进行查询。

总结ContentType

  如果一张表与N张表动态地要创建Foreign Key关系,如果创建 Foreign key 将生成很多列,这样很多都是空的,造成严重浪费空间。只要是一张表要和多张表建立外键关系的情况,都可以考虑使用django的ContentType组件来帮助实现,以简化表结构的设计。

  ContentType组件的作用:可以通过两个字段(GenericForeignKey, GenericRelation),在保证列数不变的情况下,让一张表和N张表做Foreign Key关系。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值