mysql笔记三 数据表三大设计范式

数据表三大设计范式

第一范式

1NF
数据表中的所有字段都是不可分割的原子值

mysql> create table student2( id int primary key, name varchar(20), address varchar(30) );
mysql> insert into student2 values(1,'张三','中国江苏省无锡市');
mysql> insert into student2 values(2,'李四','中国江苏省南京市');
mysql> insert into student2 values(3,'王五','中国上海上海市');
mysql> select * from student2;
+----+--------+--------------------------+
| id | name   | address                  |
+----+--------+--------------------------+
|  1 | 张三   | 中国江苏省无锡市         |
|  2 | 李四   | 中国江苏省南京市         |
|  3 | 王五   | 中国上海上海市           |
+----+--------+--------------------------+
3 rows in set (0.00 sec)

字段值还可以继续拆分的就不满足第一范式,字段不可拆分满足第一范式

mysql> create table student3( id int primary key, name varchar(20),country varchar(30),provence varchar(30),city varchar(30)  );
mysql> insert into student3 values(1,'张三','中国','江苏省','无锡市');
mysql> insert into student3 values(2,'李四','中国','江苏省','南京市');                  
mysql> insert into student3 values(3,'王五','中国','上海','上海市');                    
mysql> select * from student3;
+----+--------+---------+-----------+-----------+
| id | name   | country | provence  | city      |
+----+--------+---------+-----------+-----------+
|  1 | 张三   | 中国    | 江苏省    | 无锡市    |
|  2 | 李四   | 中国    | 江苏省    | 南京市    |
|  3 | 王五   | 中国    | 上海      | 上海市    |
+----+--------+---------+-----------+-----------+
3 rows in set (0.00 sec)

范式设计的越详细对于某些实际操作可能更好,但不一定都是好处,以实际需求决定。

第二范式

2NF
必须满足第一范式的前提下,第二范式要求除主键外的每一列都必须完全依赖于主键。
如果要出现不完全依赖,只可能发生在联合主键的情况下。

 create table myorder(
  product_id int,
  consumer_id int,
  product_name varchar(20),
  consumer_name varchar(20),
  primary key(product_id,consumer_id)
  );

除主键以外的列只依赖于主键的部分字段。

拆表

create table myorder(
  order_id int primary key,
  product_id int,
  consumer_id int
  );
  create table product(
  id int primary key,
  name varchar (20)
  );
  create table consumer(
  id int primary key,
  name varchar (20)
  );
  满足第二范式

第三范式

3NF
必须先满足第二范式,除主键列的其他列之间不能有传递依赖的关系

create table myorder(
  order_id int primary key,
  product_id int,
  consumer_id int,
  consumer_phone varchar(15)  //此处删掉
  );

consumer_phone varchar(15)与consumer_id int有关依赖关系。
所以应该

  create table consumer(
  id int primary key,
  name varchar (20),
  consumer_phone varchar(15)  //放在这里
  );

附加:一处错误

mysql> insert into student2 values(1,'zs','地球');
ERROR 1366 (HY000): Incorrect string value: '\xE5\x9C\xB0\xE7\x90\x83' for column 'address' at row 1

报错不能用中文
解决:
整个修改:

mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

(此处修改了两个字段可以使用中文name和address)
一个字段一个字段改

mysql> alter table student2 change address address varchar(30) character set utf8; 
Query OK, 1 row affected (0.03 sec)
mysql> alter table student2 change name name varchar(20) character set utf8;

你可能感兴趣的:(mysql笔记三 数据表三大设计范式)