数据库设计原则

简介:

   昨天有人问我数据库的设计原则,一年多没做服务端这块也基本忘干净了,就记得什么二级、三级什么的(别误会这不是黄片看多的结果),大学的时候也学过数据库,大学时也从需求到数据库设计再到实现独立完成了一个项目,对这数据库这块我还是有把握的,像什么存储过程触发器事务锁等,这些理论的知识也忘差不多了,可能藏在脑中的深处。今天网上查了下,原来三级是范式(学霸的我还是可以从脑海中想起的)。下面就回顾一下3级范式。

1.第一范式(确保每列保持原子性)

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

比如用户的地址,系统设计时可以只用一个字段表示例如:深圳市南山区国人通信A座XXX号。但系统会经常访问地址的城市,例如在快递单上,填写快递单时会有发出的城市这样方便快递流转,这样快递查找这些也是很方便的。那样就有必要将地址查分以下:省、市、区、详细地址。我们在一些购物网站填写收货地址也是一样。

2.第二范式(确保表中的每列都和主键相关)

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

这个还举个购物的例子。比如用户下单会生成一个订单。订单表可能会包括:订单ID,商品ID,用户ID,数量,收货地址ID,单价,快递单号等。一个订单下会有多个商品,是一对多的关系,订单ID和商品ID属于联合主键,但收货地址,快递单号与订单ID是一对一的关系. 所以应该将上面的分出两个表:一个订单发货表,一个订单明细表。发货表主要是包括 订单ID,收货地址ID,快递单号等这些信息,而明细表主要包括订单ID,商品ID,用户ID数量,单价等信息。

3.第三范式(确保每列都和主键列直接相关,而不是间接相关)

经常遇到字段Type类型,比如商品类型:日用品、家电等类别。在商品表中直接将商品类型加到属性里:商品ID,商品名称,商品类型ID,商品类型名称等。这样的设计我也有见过可能觉得是为了省事,其实这样一点都不省事,会出现冗余。理想的设计是将商品类型另分出一个表:商品类型ID,商品类型名称。

4.简单理解三级范式

第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解; 
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性; 
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。 没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理 数据模型设计时考虑。降低范式就是增加字段,允许冗余

5.数据库设计注意的几点

1.注意原始单据与实体间的关系以及实体与实体间的关系

原始单据与实体间的关系:例如一个订单,可能会有订单发货信息表、订单商品明细表。一个单体用两个实体组成。

实体与实体的关系:和上面原始数据与实体间的关系一样,都是有一对多、一对一、多对多的关系,一对多联合主键,多对多的话分成一对多,用两个表实现。

2.主键

主键分业务主键和逻辑主键。有时候正确设置主键可能减少数据库冗余。还是用上面订单举例。我们生成订单时可以用商品ID,用户ID设置加上时间算上联合主键。但这样每个关于订单的表总不能都要加上上面的几个字段才能获得吧,这样会更麻烦。订单ID算是逻辑主键(自增类型、uuid或guid)也可算是业务主键(比如ID是用一定规则拼接的有一定业务规则的),有了它找订单就会更方便。

3.约束

约束主要是为了防止数据出错。

域的完整性:年龄是要在一定范围的等。

参照完整性:用PK、FK、表级触发器来实现。数据要有一个参照物,在参照物内的才是正确的数据。

用户定义完整性:它是一些业务规则,用存储过程和触发器来实现。比如插入数据时有时候数据要符合一定的规则。

6.总结

说到最后其实这些都是理论知识,最重要的还是要自己实现自己体会感悟总结。我这也是属于瞎逼逼,毕竟自己独立完成的项目很少也就一两个,欢迎大家来吐槽交流。

相关文章
|
4月前
|
存储 程序员 数据库
数据库建表原则
【8月更文挑战第24天】数据库设计中的关键概念和技术,包括原始单据与实体间的关系、主键与外键的作用、基本表的特点、范式标准的应用等。详细解释了一对一、一对多及多对多关系,并通过实例说明如何处理多对多关系。讨论了主键与外键的设计原则,以及如何根据第三范式优化表结构。介绍了基本表的四大特征,并强调了理解这些特征的重要性。阐述了范式标准在设计中的作用,并提出了通过增加冗余提高运行效率的方法。
78 9
|
4月前
|
存储 程序员 数据库
数据库建表原则
【8月更文挑战第30天】原始单据与实体间存在一对一、一对多或多对多的关系,明确这点有助于设计录入界面。实体需具备主键或外键,在E-R图中,叶子节点实体可无主键但必有外键。基本表具原子性、原始性、演绎性和稳定性,区别于中间表和临时表。范式标准方面,基本表应尽量满足第三范式,但在实际设计中,适度冗余可提升效率。此外,处理多对多关系需引入第三个实体,主键设计建议采用无物理意义的数字串。视图技术用于数据综合处理和保密,而中间表和临时表则分别用于统计数据和临时记录。数据库设计中,完整性约束涉及域、参照及用户定义完整性,遵循“三少原则”可避免打补丁式设计,提高系统性能。
38 4
|
4月前
|
存储 程序员 数据库
数据库建表原则
【8月更文挑战第29天】数据库建表原则
35 1
|
7月前
|
数据库 数据库管理
理解数据库的ACID原则:确保数据完整性与一致性的基石
【5月更文挑战第20天】ACID原则是数据库事务处理的核心,包括原子性、一致性、隔离性和持久性。原子性保证事务操作全完成或全不完成,保持数据完整;一致性确保事务前后数据库保持一致性状态,不破坏完整性约束;隔离性防止并发事务相互影响,通过锁等技术实现;持久性则保证事务提交后的修改永久保存,即使系统故障也能恢复。这些原则确保了数据的可靠性和安全性。
|
7月前
|
存储 SQL 关系型数据库
数据库设计的基本原则和主要步骤以及应注意什么?
数据库设计的基本原则和主要步骤以及应注意什么?
430 0
|
数据库 索引
数据库 - 索引 设计与使用 原则
数据库 - 索引 设计与使用 原则
79 0
|
存储 缓存 关系型数据库
MySQL数据库管理的基本原则和技巧
MySQL数据库管理的基本原则和技巧
|
7月前
|
关系型数据库 MySQL 程序员
MYSQL数据库设计规范与原则
MYSQL数据库设计规范与原则
363 0
|
SQL 关系型数据库 MySQL
【数据库】MySQL 解读事务的意义及原则
【数据库】MySQL 解读事务的意义及原则
|
SQL 数据库 数据库管理
数据库和数据表 建立索引的原则
索引查询是数据库中重要的记录查询方法,要不要进入索引以及在那些字段上建立索引都要和实际数据库系统的查询要求结合来考虑,下面给出实际中的一些通用的原则: