数据建模
逻辑设计
宽表模式
含义:将对象的所有信息属性都存储在一张表中
缺点:
- 数据冗余:相同数据在一张表中出现多次
- 数据插入异常:(主键不能为空)只插入部分数据由缺失主键信息从而无法写入表中
- 数据更新异常:修改一行中的某列数据时,需要同时修改多行冗余的数据,若只修改一行则会出现数据不一致的情况
- 数据删除异常:为了删除某一数据时,不得不删除所有值为该数据的行,导致不想删的数据被删除
优点:查询快,一次查询即可返回所有信息
范式设计
目的:减少数据冗余;但是由于表连接越多执行效率越慢,所以有时可以牺牲冗余增加速度,即反范式设计
- 第一范式:任何一张表都应该有主键,并且每个字段不可在分
- 第二范式:非主键字段完全依赖主键,不能产生部分依赖
- 第三范式:非主键字段直接依赖主键,不能产生传递依赖
- 一对一:主键共享(主键就是外键),外键唯一(外键加唯一约束)
- 一对多:两张表,多表加外键
- 多对多:三张表,关系表俩外键
物理设计
MySQL中的数据类型
- 建议1:优先选择符合存储数据需求的最小数据类型,比如:对于无负数的字段使用无符号数,对于IP地址字符串使用
INET_ATON()
和INET_NTOA()
进行字符串和(无符号)整型之间的转化 - 建议2:尽量少使用
text
字符串类型,因为内存临时表不支持text
类型大数据的,在对这类字段进行排序时只能使用磁盘临时表,并且text
字段只支持前缀索引,也不能有默认值 - 建议3:谨慎使用
enum
字符串类型,虽然该类型是字符串,但是内部是由整数来存储的,似乎很完美,但是一旦需要对枚举类型修改时就必须使用alter语句,会对表加短暂的元数据锁 - 建议4:财务相关数据必须使用
decimal
类型
数值型
- 都有
signed
和unsigned
属性,表示有符号或无符号数 - 限制数据长度并不能改变该数据类型所占的存储空间,但是可以改变
zerofill
属性的补零 - 自增序列只能作用于整型和浮点型的主键上,并且一个表只能有一个自增序列的字段
整型
类型 | 存储空间 |
---|---|
tinyint | 1字节 |
smallint | 2字节 |
mediumint | 3字节 |
int或integer | 4字节 |
bigint | 8字节 |
浮点型
类型 | 存储空间 | 是否精确 |
---|---|---|
float | 4字节 | 否 |
double | 8字节 | 否 |
decimal(length, precision) | 不定,每四个字节存储9个数字,小数点单独占一个字节,最多65个数字 | 是 |
日期
对于含有微秒的时间类型,每两位微秒占一字节,不做限制默认为0,最多6位微秒数,current_timestamp
常量代表系统当前时间
类型 | 存储空间 | 格式 | 范围 |
---|---|---|---|
date | 3字节 | YYYY-MM-DD | 1000-01-01 到 9999-12-31 |
time | 3-6字节 | HH:MM:SS[.微秒] | -838:59:59 到 838:59:59 |
year | 1字节 | YYYY | 1901 到 2155 |
datetime | 5-8字节 | YYYY-MM-DD HH:MM:SS[.微秒] | 1000-01-01 00:00:00 到 9999-12-31 23:59:59 |
timestamp | 4-7字节 | YYYY-MM-DD HHMMSS[.微秒] | 1970-01-01 00:00:00 UTC 到 2038-1-19 03:14:07 UTC |
字符
类型 | 存储空间 |
---|---|
char(length) | 不定,由length决定占多少字符 |
varchar(max_length) | 不定,由max_length决定占多少字符,最大长度65,535字节 |
tinytext | 最大长度255字节 |
text | 最大长度65,535字节(64K) |
mediumtext | 最大长度16,777,215字节(16M) |
longtext | 最大长度4,294,967,295字节(4G) |
enum | 集合最大数目为65,535 |
极大数据
类型 | 存储空间 |
---|---|
blob | 65,535字节 |
clob | 65,535字节 |
约束
一般能使用表级约束形式就不使用列级约束形式,效果是一样的
约束 | 关键字 | 含义 |
---|---|---|
非空约束 | not null | 不能为null,无表级约束 |
默认约束 | default | 未传入值,则采用默认值,无表级约束 |
检查约束 | check(条件) | mysql不支持(写上不报错,但是不起作用),oracle支持 |
唯一约束 | unique unique(本表字段列表) |
不能重复,但是可以为null |
主键约束 | primary key primary key(本表字段列表) |
既不能重复,也不能为null,可指定auto_increment自然增长,Oracle不支持auto_increment |
外键约束 | references 另一个表(另一个表字段列表) foreign key(本表字段列表) references 另一个表(另一个表字段列表) |
mysql不支持列级外键约束(写上不报错,但是不起作用) 参照外键字段数据信息,参考字段必须唯一,外键值可以为null |
命名规范
- 所有数据库对象名称必须使用蛇形命名法,禁止使用MySQL保留关键字,即小写字母,多个单词使用下划线分隔,长度最好不要超过32个字符
- 数据库表名称最好包含数据库名称,临时表以tmp作为前缀,日期作为后缀;备份库、表以bak作为前缀,日期作为后缀
- 所有存储相同数据的列名和列类型必须一致
Comments NOTHING