问题描述
在经过规范化指南之后,我在下面以我认为是第四范式的形式拥有表格。这些属性是从一张大桌子分解的(学生人数,俱乐部,俱乐部费用,昵称等)。问题是我仍然在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)
);