前言
在学习Django
时,我对于mtv
中的m
始终有一丝疑惑,也就是model。因为作者是第一次学习orm,一对一
和一对多
我是可以理解的,但是多对多我不知道该怎么写,查阅了一些文章后才得以解决。
正文
1. 一对一
一对一
映射关系,原则上是可以将两张表合并的,不过是因为考虑到数据的安全性而单独放在一起,比如创建两张表,学生表
和学生信息表
,学生表
有学生的姓名,性别,学号一些可以公开的信息,而学生信息表里则包括学生电话,身份证号,等一些私密的信息,如果这些信息放在一张表里,有两个缺点
1.当学生很多时,如果要获取所有学生的部分数据,一张表消耗资源会多一些,而分为两张表可以消耗更少的资源。
2.如果只有一张表,学生的私密信息将很容易就可以查询到,而分为两张表可以起到对私密信息的保护作用。
一对一
中,两表之间的主副关系可以互换,但一般会根据客观常识来确定主副关系
学生表:
学生信息表:
学号 | 电话号码 | 身份证号 |
---|
101 | 136****0001 | 1000****0001 |
102 | 136****0002 | 1000****0002 |
103 | 136****0003 | 1000****0003 |
2. 一对多
一对多
和多对一
是相对而来的,在我看来其实是一个东西,但有的文章把它分为两类,感觉有点不太理解。
一对多中,“多”属于主表,“一”属于副表,所以ForeiKey
写在主表中的,例如一个班级表
和一个学生表
,一个班级有多个学生,但是一个学生只属于一个班级。
一对多
中,两表之间的主副关系是确定的,“多”是主表,“一”是副表。
班级表(副表):
学生表(主表):
学生姓名 | 所属班级(外键) |
---|
张三 | 一班 |
李四 | 一班 |
王五 | 二班 |
赵六 | 三班 |
3.多对多
在Django
的mtv
中,我对model
中的多对多
总是有些不太理解,多对多
它的主副关系是否为确定的,它在数据库中的映射关系又是如何。在查阅了一些资料之后,也总算理解了。
多对多的主副关系是可以互换的,一般而言根据客观常识来确定,就和一对一
差不多。
举个例子,有一张教师表
和一张班级表
,一个老师可能会教多个班级,而一个班级也有多个老师教课,在这里,教师和班级就是多对多的关系,可以将班级表
作为主表,此时,需要在班级表
里定义ManyToManyField
字段;如果将教师表
作为主表,需要在教师表
里定义ManyToManyField
字段。
而在数据库中的表现为,教师表
与班级表
之间有一张映射表
,教师表和班级表分别与映射表之间形成一对多的关系。
教师表:
班级表:
映射表:
教师姓名 | 班级名 |
---|
张三 | 一班 |
张三 | 二班 |
李四 | 一班 |
李四 | 三班 |
王五 | 一班 |
王五 | 二班 |
王五 | 三班 |
在这三张表里就定义了多对多的关系。张三教一班和二班,而一班也有张三李四王五三位老师。
归根结底,多对多
也就是一对一对多
组合而成,而在Django
的orm
中,简化了这一操作,使得我们我用创建中间表便可创建多对多的关系。
总结
由于之前在学校只学过一些简单的数据库知识,对于表与表之间的关系学得并不好,而且真正的sql语句
和orm操作
是有一些区别的,orm简化了我们对于数据库的操作,也在一定程度上增加了安全性(比如sql注入
),但也因此减慢了运行速度,orm操作
的底层还是对sql语句
的实现,要想更好的理解orm
,还是要学习一下sql
方面的知识。