1、数据库表设计的几种情况
/*
数据库设计:
1、一对一
添加唯一外键指向另一张表的主键
2、一对多
多的一方设置外键指向一的一方主键
3、多对多
借助第三张表来实现关联,第三张表分别设置2个字段设置外键分别指向两张表的主键,并且设置为联合主键
*/
/*
旅游分类:categary
旅游线路:line
用户:user
旅游分类(一) --- 旅游线路(多)
用户(多) --- 旅游线路(多)
*/
-- 用户表:id, username, gender, age,主键id,自增长
CREATE TABLE tab_user (
id INT PRIMARY KEY auto_increment,
username VARCHAR ( 32 ),
gender VARCHAR ( 1 ),
age INT
) CHARACTER SET utf8mb4;
-- 分类表:id, cat_name,主键id自增长
CREATE TABLE tab_category (
id INT PRIMARY KEY auto_increment,
cat_name VARCHAR ( 32 )
) CHARACTER SET utf8mb4;
-- 线路表:id, line_name, cat_id,外键cat_id约束分类表的主键id
CREATE TABLE tab_line (
id INT PRIMARY KEY auto_increment,
line_name VARCHAR ( 32 ),
cat_id INT,
FOREIGN KEY ( cat_id ) REFERENCES tab_category ( id )
) CHARACTER SET utf8mb4;
-- 收藏表:id, user_id, line_id,联合主键user_id与line_id,并且这两个字段分别为外键用户表主键、线路表主键
CREATE TABLE tab_favori (
user_id INT,
line_id INT,
PRIMARY KEY ( user_id, line_id ),
FOREIGN KEY ( user_id ) REFERENCES tab_user ( id ),
FOREIGN KEY ( line_id ) REFERENCES tab_line ( id )
) CHARACTER SET utf8mb4;
2、数据库表设计的三种范式
/*
数据库设计范式
1、第一范式:1NF,每一列都是不可分割的原子项
存在的问题:
1、数据冗余;
2、部分字段数据无法新增;
3、部分字段无法新删除;
2、第二范式:2NF,在1NF的的基础上,非码属性必须完全依赖于候选码(在1NF的基础上消除非主属性对主码的部分函数依赖)
相关概念
1、函数依赖:A-->B,如果通过A属性的值,可以确定唯一B属性值。则称B依赖于A
学号-->姓名,(学号,课程名称)--> 分数
2、完全函数依赖:A-->B,如果A是属性组,B的确定依赖于A中的所有属性值
(学号,课程名称)--> 分数
3、部分函数依赖:A-->B,如果A是属性组,B的确定只需要A中的部分属性值
(学号,课程名称)--> 姓名
4、传递函数依赖:A-->B-->C,如果A属性可以确定唯一属性B的值,再通过B属性,可以确定唯一C属性的值,则称C传递函数依赖A
学号-->系名-->系主任
5、在一个表中,如果一个属性或一个属性组,被其他所有属性完全依赖,则称这个属性(属性组)该表的码
3、第三范式:3NF,在2NF的基础上,任何非主属性不依赖于其他非主属性(在2NF基础上消除传递依赖)
总结:第一范式,字段不可分割;第二范式,要有主键,第三范式,字段内容不重复
*/