浅谈数据库设计

数据库设计

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

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

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

  • 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

主键与外键

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