在关系数据库设计中,常常会涉及到范式(normal form)。范式的主要目的是提高数据的一致性和可靠性。而在范式中,最常见的就是1nf、2nf、3nf、bcnf。
一、1nf
1nf,即第一范式,是关系数据库设计中最基本的规范。它要求关系中的每个属性都是原子的,不可再分解的。举例来说,如果一个商品记录中的“颜色”属性是由“红、黄、绿”三个值组成的字符串,就不符合1nf。
以下是一个符合1nf的例子:
CREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(50), price DECIMAL(10,2), description TEXT )
二、2nf
2nf,即第二范式,是在1nf的基础上进一步规范的。它要求关系中的每个非主键属性都完全依赖于主键。
举例来说,如果有一张订单详情表,其中包含订单项名称、订单项价格、订单id和客户id四个属性,其中订单项名称和订单项价格都只与订单id有关系,而与客户id无关,那么就不符合2nf,因为它违反了“完全依赖主键”的原则。
以下是一个符合2nf的例子:
CREATE TABLE order_items ( id INT PRIMARY KEY, order_id INT NOT NULL, product_id INT NOT NULL, quantity INT, price DECIMAL(10,2), FOREIGN KEY (order_id) REFERENCES orders(id), FOREIGN KEY (product_id) REFERENCES products(id) );
三、3nf
3nf,即第三范式,是在2nf的基础上进一步规范的。它要求关系中的每个非主键属性都不依赖于其它非主键属性。
一个符合3nf的例子:
CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50), email VARCHAR(50), password_hash CHAR(64), birthdate DATE, address VARCHAR(50) );
在上面的例子中,username、email、password_hash、birthdate和address都是完全独立的属性,它们互不依赖。
四、BCNF
BCNF,即巴斯-科德范式,是在3nf的基础上进一步规范的。它要求关系中的每个依赖都必须是一个超键。
一个符合BCNF的例子:
CREATE TABLE customers ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50), phone VARCHAR(20), UNIQUE (email, phone) ); CREATE TABLE orders ( id INT PRIMARY KEY, customer_id INT NOT NULL, total DECIMAL(10,2) NOT NULL, FOREIGN KEY (customer_id) REFERENCES customers(id) ); CREATE TABLE order_items ( id INT PRIMARY KEY, order_id INT NOT NULL, product_id INT NOT NULL, quantity INT, price DECIMAL(10,2), FOREIGN KEY (order_id) REFERENCES orders(id), FOREIGN KEY (product_id) REFERENCES products(id) );
在上面的例子中,customers表中的email和phone字段组成了一个唯一键,因为一个客户的email和phone是唯一的。而orders表中的customer_id字段是customers表的主键,而order_items表中的order_id和product_id字段组成了orders表的主键。因此,上面的表结构符合BCNF。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/295544.html