数据库设计的一般范式

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基础上消除传递依赖)

    总结:第一范式,字段不可分割;第二范式,要有主键,第三范式,字段内容不重复
*/

Leave a Reply