2013-10-25 34 views
0

我已經創建了一個簡單的CRUD應用程序數據庫schehme。然而,實現它之前,我要檢查它是否在3NF如何檢查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。我會很感激你的回覆!

回答

3

如果不知道業務規則應該生效,很難評論數據庫設計。您需要從您自己的業務領域分析中確定。如果沒有這些信息,我們只能根據表名和列名進行一些假設和猜測。

人表看起來有問題。學生和教職員的專欄是否應該是無教材?它看起來像你在一張桌子上保持兩種不同類型的人。可能更適合爲每個人類子類型創建不同的表格,並且只需擁有人員表格中學生和工作人員共有的屬性。

3NF的概念是基於只允許值的關係和依賴關係,絕不是空值。如果你有空值,那麼你沒有滿足3NF的關係。此外,如果staff_no被認爲是員工屬性的決定因素,那麼它是一個非關鍵因素(因爲它是可以爲空的)。可空的唯一性約束由於多種原因是一個壞主意,你應該儘量避免它們。

3

從很短的一瞥,課程表看起來非常非3NF。

  • 它缺乏一個關鍵
  • 除非有每個講師只有一個過程,那麼lecturer_id不是關鍵,所以lecturer_name不應該存在
  • 我猜有可能是每門課程有多個學生以及;在這種情況下,student_id屬於其他地方
  • 講堂是否屬於一個且只有一個教師?
  • 是不是course_code依賴course_id?

只是爲了讓你開始...