数据库设计
设计原则:在数据冗余和处理速度之间找到合适的平衡点。
数据库表个数越少越好。
表中组合主键的字段个数越少越好。主键的作用,一是建主键索引,二是做为子表的外键,所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间。
3)一个表中的字段个数越少越好。
设计模式
逻辑设计:根据数据实体之间的逻辑关系对表进行设计。
物理设计:根据所使用的数据库特点进行表结构设计。
范式设计
- 第一范式:是对属性的原子性约束,要求属性具有原子性,不可再分解。
- 第二范式:是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性。
- 第三范式:是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
基本表及其字段之间的关系,应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准,适当增加冗余,达到以空间换时间的目的。
逻辑设计
E-R 模型图:结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余
物理设计
数据库类型
数据库类型 | 成本 | 开发语言 | 支持系统 | 业务场景 |
---|---|---|---|---|
Oracle | 商业型 | php,java,python等 | windows/liunx系统 | 企业级 |
SQLServer | 商业型 | .NET,C#等 | 只支持windows系统 | 企业级 |
MySQL | 开源型 | php,java,python等 | windows/liunx系统 | 中小型 |
PgSQL | 开源型 | php,java,python等 | windows/liunx系统 | 中小型 |
存储引擎
存储引擎 | 索引 | 事务 | 锁粒度 | 主要应用 | 忌用 |
---|---|---|---|---|---|
MyISAM | 支持 | 不支持 | 支持并发插入的表级锁 | select,insert高负载 | 读写并用 |
InnoDB | 支持 | 支持 | 支持MVCC的行级锁 | 事务处理 | 无 |
MEMORY | 支持 | 不支持 | 表锁 | 中间计算,静态数据 | 大型数据集,持久性存储 |
Archive | 不支持 | 不支持 | 行级锁 | 日志记录,聚合分析,只支持select,insert操作 | 随机读取,删除 |
字段选择
char vs varchar
char:适用于数据长度差不多一致,波动较小,最大数据长度小于50字节。
varchar:适用于数据长度变化较大,不能预知其具体长度的数据。
decimal vs float
decimal:用于存储精确数据,精度最高,但是占用空间很大。
float:用于存储非精确数据,会丢失数据精度,占用空间比 decimal 小。
int vs timestamp vs datetime
字段类型 | 存储空间 |
---|---|
TINYINT | 1 字节 |
SMALLINT | 2 字节 |
MEDIUMINY | 3 字节 |
INT | 4 字节 |
BINGINT | 8 字节 |
DATE | 3 字节 |
DATETIME | 8 字节 |
TIMESTAMP | 4 字节 |
CHAR(M) | M 字节,1 <= M <= 255 |
VARCHAR(M) | L+1 字节,在此 L <= M 和 1 <=M <= 255 |
FLOAT | 4 字节 |
DOUBLE | 8 字节 |
DECIMAL | 对 DECIMAL(M,D) ,如果 M>D,为 M+2 否则为 D+2 |
查询速度从快到慢如下:bigint > date > timestamp > time > datetime
主键与外键
主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接