尽量少使用外键,如果有外键完整性约束,需要应用程序控制---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关系。

 

你可能感兴趣的:(Mysql,Django)