简述数据库的三大范式和五大约束

第一范式:字段不可拆分,直接存储最小单元。

例如,订单中的订单号和产品名称不能分开。

第二范式:必须有一个主键,并且所有字段都直接依赖于主键。

例如,用户表中,用户ID为主键,手机号码、地址与用户ID直接相关。

第三范式:字段只能直接依赖于主键。

例如,在订单表中,订单号是主键,产品数量直接取决于订单号,不能依赖于任何其他字段。

BCNF:每个行列式都是一个候选键。

例如,如果只有一个候选键,则与第三范式相同。

第四和第五范式:更高的范式解决了冗余问题,但不常用。

具体限制:
1 主键:设置主键来唯一标识一行。

例如,orders表中的订单号是主键。

2 Unique:设置唯一约束,列值不能重复。

例如,一个手机号码只能由一个用户使用。

3 默认值:设置默认值。

例如,如果未填充高度字段,则默认值为 1 .2 米。

4 Not null:设置非空约束。

例如,您必须输入您的用户名。

5 外键:设置外键并链接不同的表。

例如,orders表中的用户ID与用户表ID相关联。

自己掂量一下。

数据库设计中的五大范式

老实说,研究数据库范式就像回到大学的数据库课程一样。
我当时就很认真地研究过。
回想起来,感觉就像是昨天的事。
下面讲一下这五个范式,这是我在实践中积累的一些经验。

我们先来说一下第一范式。
简单来说,数据表的每一行不能包含重复的数据,每一列也必须包含不可细分的原子数据。
我记得有一次我接手一个项目,发现他们的数据库表中有重复的列。
例如,客户信息包含许多重复的电话号码。
这种情况违反了第一范式。
我们必须提取这些重复的电话号码,创建一个单独的表,然后使用外键将它们关联起来。
这解决了问题。

然后是第二范式,这意味着非主键列必须完全依赖于主键。
我当时遇到一个案例。
订单表中,除了订单明细之外,还有客户的全名、地址等信息。
这些是订单号主键的一部分,但客户信息链接到订单号以外的列,这违反了第二个范例。
后来我们通过创建客户表,然后使用订单号作为外键关联来解决这个问题。

第三范式就像第二范式的改进版本。
这要求非主键列之间不存在相互依赖性。
例如,在Customers表中,我们不能让客户的生日影响他们的订单数量。
这违反了第三范式。
我记得我们通过拆分表来解决这个问题,这样每个表只负责一个逻辑功能。

说到第四范式,这个东西是比较高级的。
它主要用于处理复合主键情况并防止主键列和非主键列之间出现一对多关系。
我对这类事情没有太多实践经验,但理论上是,如果复合主键的列与其他列之间存在一对多关系,那么我们需要将该列拆分出来并创建一个新表。

最后,还有第五范式,这是一种高级的数据库设计技术。
这就要求我们尽可能的减少表中的冗余数据,并将表分成尽可能小的块。
我在设计数据仓库时经常使用它。
通过这种设计,可以提高查询效率并减少存储空间。

简而言之,这些范例旨在确保数据质量和数据库性能。
在实际工作中,我们需要根据具体情况灵活运用这些范式,才能设计出既高效又可靠的数据库系统。