02-数据建模

nobility 发布于 2022-08-19 2764 次阅读


数据建模

逻辑设计

宽表模式

含义:将对象的所有信息属性都存储在一张表中

缺点:

  • 数据冗余:相同数据在一张表中出现多次
  • 数据插入异常:(主键不能为空)只插入部分数据由缺失主键信息从而无法写入表中
  • 数据更新异常:修改一行中的某列数据时,需要同时修改多行冗余的数据,若只修改一行则会出现数据不一致的情况
  • 数据删除异常:为了删除某一数据时,不得不删除所有值为该数据的行,导致不想删的数据被删除

优点:查询快,一次查询即可返回所有信息

范式设计

目的:减少数据冗余;但是由于表连接越多执行效率越慢,所以有时可以牺牲冗余增加速度,即反范式设计

  1. 第一范式:任何一张表都应该有主键,并且每个字段不可在分
  2. 第二范式:非主键字段完全依赖主键,不能产生部分依赖
  3. 第三范式:非主键字段直接依赖主键,不能产生传递依赖
  • 一对一:主键共享(主键就是外键),外键唯一(外键加唯一约束)
  • 一对多:两张表,多表加外键
  • 多对多:三张表,关系表俩外键

物理设计

MySQL中的数据类型

  1. 建议1:优先选择符合存储数据需求的最小数据类型,比如:对于无负数的字段使用无符号数,对于IP地址字符串使用INET_ATON()INET_NTOA()进行字符串和(无符号)整型之间的转化
  2. 建议2:尽量少使用text字符串类型,因为内存临时表不支持text类型大数据的,在对这类字段进行排序时只能使用磁盘临时表,并且text字段只支持前缀索引,也不能有默认值
  3. 建议3:谨慎使用enum字符串类型,虽然该类型是字符串,但是内部是由整数来存储的,似乎很完美,但是一旦需要对枚举类型修改时就必须使用alter语句,会对表加短暂的元数据锁
  4. 建议4:财务相关数据必须使用decimal类型
数值型
  • 都有signedunsigned属性,表示有符号或无符号数
  • 限制数据长度并不能改变该数据类型所占的存储空间,但是可以改变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作为前缀,日期作为后缀
  • 所有存储相同数据的列名和列类型必须一致
此作者没有提供个人介绍
最后更新于 2022-08-19