数据表实体之间的关系总结:
特点:表与表的三张关系都是通过设置关键得到解决。
关系:
1.存在的关系:
一对多
一对一(例如:常见还是较少,因为可以放在一张表中)
多对多(本质仍然是一对多,多表是中间表,在中间表中有其他表的多条记录)
2.一对多关系:
存在的问题:如何将两张表关联起来?
解决方案:在多表中添加一个外键,参考一表的主键。(为什么不在一表中添加外键引用多表:如何这样这个字段需要存储多个信息,不符合数据库的设计规范)
3.一对一关系:
存在的问题:如何将两张表关联起来?
解决方案:在一张表中添加一个外键,引用另一张表的主键,并将该外键设置成唯一约束
4.多对多关系:
存在的问题:如何将两张表关联起来?
解决方案:创建第三张表,设置两个外键,分别参考两张表。
特点:多对多的表本质上仍然是一对多,多表是中间表,一表是另外的两张表
在Flask中的体现(ORM模型)
ORM模型本质上仍然遵循上述原则和解决方案,但是提出了反向引用:
反向引用:在不添加外键的表中添加反向引用:
db.relationship('',backref='',lazy='dynamic')
ORM模型一对多的解决方案:
1.在多表中添加外键,在一表中添加反向引用。
外键:cid = db.ForenKey('teacher.id')
ORM模型一对一的解决方案:
特点关键字:uselist=Flase
1.在任意一张表中添加外键,并设置外键唯一约束,在另一张表中添加反向引用属性
2.在反向引用属性中将lazy='dynamic'换成uselist=Flase
ORM模型多对多的解决方案:
特点关键字:secondary,db.backref()
1.创建第三张表来维护另外两张表的关系
2.在创建的第三张表中添加外键参考另外两张表,
3.在任意一张表中添加另一张表的反向引用属性
注意点:
1.设置外键的时候是db.ForenKey('表名.主键名称')
2.设置关联属性的时候是db.relationship('类名',backref='当前表名',lazy='dynamic')
例如在Course中添加以下字段:
teachers = db.relationship('Teacher', backref='course', lazy='dynamic')
3.处理多对多的关系的时候:
因为需要关联到中间表,所以需要指明第三张表的表名,需要增加一个参数:secondary='中间表表名'
因为反向引用属性也是多个数据,所以得说明这个多数据的延迟加载模式
courses = db.relationship("Course", backref=db.backref("students",lazy='dynamic'), secondary="table_stu_cur")
4.在一对多,多对多的反向引用属性中都是复数,但是一对一是单数,所以需要uselist=Flase属性