[英]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.