繁体   English   中英

规范化后从表中删除多值数据

[英]Removing multi valued data from a table after normalization

在浏览了规范化指南之后,我在下面列出了我认为是第 4 范式的表格。 这些属性是从一张大表(学生编号、俱乐部、俱乐部成本、昵称等)分解而来的。 问题是我在 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)
);

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

为此,您可以创建一个复合主键,该主键由引用其他表的两列组成。 这样,给定俱乐部中给定学生的每个配对只存储一次。 但是一个给定的学生可能属于多个俱乐部,一个给定的俱乐部可能有多个学生会员。

CREATE TABLE STUDENT_CLUB_LIST(

    StudentNumber       Int         NOT NULL,
    Club                Char(25)    NOT NULL,

    PRIMARY KEY (StudentNumber, Club)
                        
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM