数据表设计经验
数据库设计涉及的知识点远不指这些, 我只是在此处总结下 经常遇到的以及要特别注意的.(*≧ω≦)
# 字段类型
字段类型需特别注意的:
字段类型 | 经验 |
---|---|
CharFiled | CharFiled对应的是varchar,但超过了255个字符我们就会使用TextField |
TextField | 最多65535个字符. 若需要的比这个还多,就需要放到文件中去,写入文件的路径. |
IntegerField | 范围在-2147483648 to 2147483647. 一般不用它来存手机号(位数也不够),手机号会直接用字符串存. |
BooleanField | True/False,其实数据库是不支持真假的,实际在表中存的是0和1 |
DecimalField | 跟金额相关会用到它,金额会有小数 |
# 字段类型参数
字段类型参数需特别注意的:
- 在mysql里,默认可以为空.
在Django的ORM里默认不为空, 即Django中,默认blank=False、null=False- null是针对数据库而言,如果null=True,表示数据库的该字段可以为空, 那么在新建一个model对象的时候是不会报错的;
- blank是针对表单的,如果 blank=True,表示你的表单填写该字段的时候可以不填.
比如admin后台界面下增加 model 一条记录的时候. <即用户在页面操作时,该字段值可以为空.>
- 针对可能列举完的数据都适用于choices参数!!
# 数据表设计
# 一些常识
- 建立外键关系的ForeignKey和OneToOneField所在的字段,会在数据表中为该字段后面自动加上 _id
- ManyToManyField所在的字段是一个虚拟字段!!通过ManyToManyField创建的第三张表不能扩展字段.
- 不在ORM的Meta中设置db_table值,那么在数据库中创建的默认表名是 app名_表名小写
- 可以通过在ORM表中写方法__str__,改变 一条表记录对象 的展示格式!!
即print打印对象,会触发了对象的__str__方法! 不设置,就类似这样 Role object (1)
- 在创建数据时,有四种是不用传值的,会默认给值:
DateField(auto_now=True,auto_now_add=True) / DateTimeField(auto_now=True,auto_now_add=True)
字段对象设置了字段类型参数default
自增的字段id
字段对象设置了字段类型参数null=True,blank=True,允许为空.
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 一对一关系场景感
>> 一对一的关系可以用用户注册和用户注册成功后完善自己的信息对应的用户表和用户详情表来构建场景感.
Author表有name字段; 用户详情表有外键字段author
因为用户注册时是没有额外信息的.
- 若没有详情表,将额外的用户信息字段加到Author表里,那么这些额外的字段都得设置成blank=True,null=True.
- 若有详情表,但将外键字段设置在Author表中,那么该外键字段得设置blank=True,null=True.
- 若有详情表,将外键字段设置在详情表中,那么该外键字段是无需设置blank=True,null=True的!!
author = models.ForeignKey(to='Author', on_delete=models.CASCADE, unique=True)
author = models.OneToOneField(to='Author', on_delete=models.CASCADE)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
一对多,外键放到多的一方
多对多,外键放到经常查询的那一方
1
2
2