浅谈数据库设计

数据库设计

设计原则:在数据冗余和处理速度之间找到合适的平衡点。

  • 数据库表个数越少越好。

  • 表中组合主键的字段个数越少越好。主键的作用,一是建主键索引,二是做为子表的外键,所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间。

  • 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

主键与外键

主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接