0

我创建了一个简单的CRUD应用程序数据库方案。但是,在实施它之前,我想检查它是否在3NF

CREATE TABLE person (
person_id int not null,
name char(30) not null,
student_no int,
staff_no int,
student_fieldOfStudy char(30),
staff_department char(30),
staff_position char(30),
faculty char(30),
PRIMARY KEY (person_id),
CONSTRAINT student_unique UNIQUE (student_no),
CONSTRAINT staff_unique UNIQUE (staff_no)
);

CREATE TABLE university (
university_id int not null,
foundationDate datetime not null,
university_name char(30) not null,
city_name char(30) not null,
country_name char(30) nut null,
PRIMARY KEY (universityID),
CONSTRAINT univ_unique UNIQUE (university_name, city_name)
);

CREATE TABLE course (
course_id int not null,
course_code char(20) not null,
lecturer_name char(30) not null,
lecture_day datetime not null,
faculty char(30) not null,
lecture_room char(30),
lecturer_id int,
student_id int,
FOREIGN KEY (student_id) REFERENCES Persons(person_id),
FOREIGN KEY (lecturer_id) REFERENCES Persons(person_id)
)

在我看来,它在3NF. 我会很感激你的回复!

4

2 回答 2

3

一眼看去,课程表看起来非常非 3NF。

  • 它缺少一把钥匙
  • 除非每个讲师只有一门课程,否则讲师 ID 不是关键,因此讲师名称不应该在那里
  • 我想每门课程也可以有不止一个学生;在这种情况下, student_id 属于其他地方
  • 一个演讲室是否属于一个且只有一个教员?
  • course_code 不依赖 course_id 吗?

只是为了让你开始......

于 2013-10-25T13:58:59.650 回答
3

如果不知道应该实施哪些业务规则,就很难对数据库设计进行评论。您需要根据自己对业务领域的分析来确定这一点。如果没有这些信息,我们所能做的就是根据表名和列名列表做出一些假设和猜测。

人员表看起来有问题。学生和教职员工栏应该是无效的吗?在我看来,您在一张桌子上维护了两种不同类型的人。为这些人员子类型中的每一个创建不同的表可能更好,并且只在人员表中具有学生和教职员工共同的属性。

3NF 的概念是基于关系和依赖关系,它只允许值,不允许空值。如果你有空值,那么你就没有满足 3NF 的关系。此外,如果 staff_no 应该是人员属性的行列式,那么它是非关键行列式(因为它可以为空)。由于多种原因,可空唯一性约束是一个坏主意,您应该尽量避免它们。

于 2013-10-25T13:36:55.577 回答