一对一关系:

一对多模型:

商城中的 商品表shop_product   和   商品物品表 shop_product_item  是 一对多关系 。 关联字段是shop_product_item的product_id字段

多对多模型:

合能项目中   角色表manager_role   和   菜单表manager_menu  是多对多关系。中间表为manager_role_menu   

三大范式:

1NF:

数据库表的每一列都是不可分割的基本数据项;

2列的属性相近或者相似,尽量合并成一样的列

2NF:

首先满足1NF,要求表的每条记录可以唯一区分(主关键字),要求实体(记录)的非主属性完全依赖于主关键词。

数据库 -- 表设计1

3NF:

必须先满足2NF  ; 要求表中的每一列只与主键直接相关而不是间接相关。

数据库 -- 表设计1

3大范式总结:

  • 2列的属性相近或者相似,尽量合并成一样的列
  • 第二范式是说一张表中包含了所种不同的实体属性,那么要必须分成多张表,
  • 第三范式是要求已经分成了多张表,那么一张表中只能有另一张表中的id(主键),而不能有其他的任何信息(其他的信息一律用主键在另一表查询)。

 

数据库命名:

  • 字段和表名称 应该是  a_b , 用下划线隔开

 

navicat查看mysql表的关系:

数据库 -- 表设计1

数据库设计:

概念:

  • 根据业务系统需要,结合选用的DBMS,为业务系统构造出最优的数据存储模型,建立好数据库中表结构及表与表之间的管理关系

为什么要进行数据库设计??

数据库 -- 表设计1

物理设计:

目的:建立表结构

1、选择数据库系统:应用特点、成本
2、定义库、表、字段的命名规范(数据库系统对此有限制)
3、根据系统选择合适的字段类型
4、反范式化设计:增加冗余,提高效率

备注:反范式,不满足范式的模型,就是反范式模型。反范式跟范式所要求的正好相反,在反范式的设计模式,我们可以允许适当的数据的冗余,用这个冗余去取操作数据时间的缩短。本质上就是用空间来换取时间,把数据冗余在多个表中,当查询时可以减少或者是避免表之间的关联。(如果关联查询效率很低,可以考虑使用反范式设计)

 

选择哪种数据库??

  • 成本 方面
  • 事务成本 (大的事务操作)

备注:事务的大小通常是指一个事务中所处理的数据的多少和所包括的SQL语句的数量,比如说,我们在一个事务中既包括了UPDATE,INSERT,DELETE语句同时以有大量的SELECT语句那边这个事务就可以认为是一个大事务。

  1. 开发使用的语言

Java,php  --  mysql ,oracle

  1. 应用场景

开源数据库 --- 适用于互联网项目

商业数据库 ---  更适合企业级项目

mysql常用的存储引擎:

数据库 -- 表设计1

表及字段的命名规则:

1、可读性原则

表名使用大写和小写来格式化库对象名字以获得良好的可读性。

字段使用下划线来连接

2、表意性原则

对象的名字应该可以描述他所标识的对象

3、长名原则

尽可能少使用或者不使用缩写,适用于数据库名之外的对象

数据库字段类型选择原则:

数据库 -- 表设计1

举例:

数据库 -- 表设计1

字段类型原则原则:当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或者二进制类型,

最后才是字符类型。队友相同级别的数据类型,应该有限选择占用空间小的数据类型。

数据库 -- 表设计1

char和varchar如何选择??

  • char列的长度固定为声明的长度  ; varchar列的值为可变长字符串,长度为  L+1 字节 ;varchar需要额外的字节存储大小
  • 如果列中的最大长度小于50byte,一般考虑用char (一般不宜定义大于50byte的char类型列) 
  • 如果列中要存储的数据长度差不多一致,应该考虑用char,否则用varchar
  • 举例:身份证号、手机号使用char  ; 

decimal 和 float如何选择??

  • decimal用于存储精确数据
  • 由于float的存储空间开销比decimal,故非精确数据优先选择float类型

时间类型如何选择??

使用int来存储时间字段的优缺点:

  • 优点:字段长度比datetime小
  • 缺点:使用不方便,需要进行函数转换
  • 限制:之恶能存储到2038-01-19  

如何选择主键??

https://blog.csdn.net/ruicanshuei/article/details/50850644

避免使用外键约束??

  • 降低数据导入的效率
  • 增加维护成本

避免使用触发器??

  • 降低数据导入的效率
  • 可能会出现意想不到的数据异常
  • 使业务逻辑变的复杂

关于预留字段

  • 无法准确的知道预留字段的类型
  • 无法准确的知道预留字段中所存储的内容
  • 后期维护预留字段所要的成本,同增加一个字段所需要的成本相同的
  • 严谨使用预留字段
  • 需要根据实际情况考虑

 

为什么要反范式化??

举例:

数据库 -- 表设计1

数据库 -- 表设计1

数据库 -- 表设计1

数据库 -- 表设计1

sql中select占比更多,所以可以增加读取效率,但是插入效率较低

反范式化优缺点:

  • 减少表的关联数量
  • 增加数据的读取效率
  • 反范式化一定要适度(如果大量使用反范式化,会导致大量操作异常)
 

相关文章: