为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
确保每列的原子性,每个列都不可以再拆分
+----+----------+--------+------------------+----------+------+---------------------------------------+ | id | username | gender | email | nickname | age | region | +----+----------+--------+------------------+----------+------+---------------------------------------+ | 1 | admin | 男 | admin@qq.com | 管理员 | 25 | 广东省、深圳市、龙岗区、龙岗大道127号 | | 2 | zhangsan | 男 | zhangsan@126.com | 张三 | 24 | 广东省、广州区、天河区、珠江大道29号 | +----+----------+--------+------------------+----------+------+---------------------------------------+
分析:上述表很明显就不符合数据库第一范式的表设计,为何不符合?region列不具有原子性。因为还可以拆分成省份、城市、区域、详细地址字段。
+----+----------+--------+----------+------+----------+--------+--------+---------------+ | id | username | gender | nickname | age | province | city | region | adress | +----+----------+--------+----------+------+----------+--------+--------+---------------+ | 1 | admin | 男 | 管理员 | 25 | 广东省 | 深圳市 | 龙岗区 | 龙岗大道127号 | | 2 | zhangsan | 男 | 张三 | 24 | 广东省 | 广州市 | 天河区 | 珠江大道29号 | +----+----------+--------+----------+------+----------+--------+--------+---------------+
在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分
+-----------+----------+------------+------+--------+----------+-------------+ | orders_id | goods_id | goods_name | nuit | prices | username | phone | +-----------+----------+------------+------+--------+----------+-------------+ | 0001 | 1 | iphone13 | 台 | 9800 | 大当家 | 0755-864510 | | 0001 | 2 | 智能扫把 | 把 | 150 | 大当家 | 0755-864510 | | 0002 | 3 | 玩具车 | 辆 | 450 | 王二狗 | 0755-816540 | +-----------+----------+------------+------+--------+----------+-------------+
分析:上述表很明显不符合第二范式,order_id 和 good_id 作为联合主键。但 good_name、number、unit、price 只和 good_id 有关,很明显和 order_id 主键无关,除此之外,上述表里做了两件事(订单信息、商品信息),第二范式的目的在于保证一张表只做一件事情,很明显违反第二范式。
+-----------+----------+-------------+ | orders_id | username | phone | +-----------+----------+-------------+ | 0001 | 大当家 | 0755-864510 | | 0002 | 王二狗 | 0755-816540 | +-----------+----------+-------------+ +----------+------------+------+--------+ | goods_id | goods_name | nuit | prices | +----------+------------+------+--------+ | 1 | iphone13 | 台 | 9800 | | 2 | 智能扫把 | 把 | 150 | | 3 | 玩具车 | 辆 | 450 | +----------+------------+------+--------+ +----------+----------+ | order_id | goods_id | +----------+----------+ | 1 | 1 | | 1 | 2 | | 2 | 3 | +----------+----------+
在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键
+----------+--------------+----------+------+--------+ | goods_id | goods_name | category | nuit | prices | +----------+--------------+----------+------+--------+ | 1 | iphone13 | 3C数码 | 台 | 9800 | | 2 | 智能扫把 | 智能家居 | 把 | 150 | | 3 | iphone12 pro | 3C数码 | 台 | 5800 | +----------+--------------+----------+------+--------+
+----------+--------------+------+--------+ | goods_id | goods_name | nuit | prices | +----------+--------------+------+--------+ | 1 | iphone13 | 台 | 9800 | | 2 | 智能扫把 | 把 | 150 | | 3 | iphone12 pro | 台 | 5800 | +----------+--------------+------+--------+ +-------------+---------------+ | category_id | category_name | +-------------+---------------+ | 1 | 3C数码 | | 2 | 智能家居 | +-------------+---------------+ +-------------+----------+ | category_id | goods_id | +-------------+----------+ | 1 | 1 | | 2 | 2 | | 1 | 3 | +-------------+----------+