标准化后从表中删除多值数据

问题描述

在经过规范化指南之后,我在下面以我认为是第四范式的形式拥有表格。这些属性是从一张大桌子分解的(学生人数,俱乐部,俱乐部费用,昵称等)。问题是我仍然在STUDENT_CLUB_LIST和STUDENT_NAMES中重复行,并且在重复主键或输入冗余数据时出现错误

从我看过的教程中,重复主键行最多可以重复到4NF(例如,如果100号学生参加了两个俱乐部,那将有两行),所以我想念什么?如果已经将属性分解成具有唯一键的小表,该如何避免重复多值属性

CREATE TABLE STUDENT_CLUB_LIST(

        StudentNumber       Int         NOT NULL,Club                Char(25)    NOT NULL,CONSTRAINT      StudentNumberPK     PRIMARY KEY (StudentNumber)
                            
                        );
                        

CREATE TABLE CLUB_COST(

        Club            Char(25)            NOT NULL,ClubCost        Int                 NOT NULL,CONSTRAINT      ClubPK              PRIMARY KEY(Club)
        
                        );

CREATE TABLE STUDENT_NAMES(

        StudentNumber       Int         NOT NULL,Nickname            Char(25)    NOT NULL,CONSTRAINT          StudentNamesPK      PRIMARY KEY(StudentNumber)
);

解决方法

您需要在StudentNumber中的每个STUDENT_CLUB_LIST允许多行,以及每个Club的多个行。这就是多对多表的工作方式。学生和俱乐部的每对配对都有自己的一行。

您可以通过制作由两个引用其他表的列组成的复合主键来实现。这样,给定俱乐部中给定学生的每对配对仅存储一次。但是给定的学生可能属于多个俱乐部,并且给定的俱乐部可能具有多个学生成员。

CREATE TABLE STUDENT_CLUB_LIST(

    StudentNumber       Int         NOT NULL,Club                Char(25)    NOT NULL,PRIMARY KEY (StudentNumber,Club)
                        
);