在阅读了规范化指南之后,我在下面得到了我认为是第四种正规形式的表。这些属性是从一个大表中分解出来的(学生编号、俱乐部、俱乐部成本、昵称等(。问题是我在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)
);