Oracle
如何在數據庫規範化期間防止空外鍵?
我對數據庫相當陌生,並且很難弄清楚如何建構我的數據庫。該數據庫包含學生、班級和他們所有的整體和類別成績(例如測試、家庭作業等)
到目前為止,我已經創建了以下表格:
Student: id|firstname | lastname (pk = id) Class: id|name|room num (pk = id) Categories: id|name|weight (pk = (id, name, weight)) Grades: student_id (fk)| class_id (fk)| category_id (fk) | name | grade_val
我的問題是,如果我想用這個模式保存學生的整體成績,我將如何在沒有空外鍵並保持規範化的情況下做到這一點?
目前要儲存他們的成績,我必須
Grade: 1, 1, null, 'Overall Grade', 95
在數據庫中有一個條目。這樣做的正確方法是什麼?添加另一個表,在類別中增加一行,例如:
Category: 1, 'Overall', 100
或其他?編輯:
目前,成績表上的主鍵只是其他列的組合。pk = (student_id, class_id, category_id, 姓名)
筆記
多對多關係由連結表表示。
您缺少學生和班級之間的聯繫
create class_enrollment ( student_id int not null references Student( id ), class_id int not null references Class( id ), constraint class_enrollment_pk primary key ( student_id, class_id ) );
調整
然後可以修改您的
Grades
表以引用class_enrollment
.create table GRADES ( student_id int, class_id int, category_id int, grade_val number, constraint grade_pk primary key (student_id, class_id, category_id), -- a surrogate key is recommended constraint grade_fk1 foreign key (student_id, class_id) references class_enrollment(student_id, class_id) );
總成績
如果您始終可以計算匯總值,則可以將計算隱藏在 a
VIEW
(或 aMATERIALIZED VIEW
)中。但是,由於教師可以覆蓋計算值,因此您需要將摘要儲存在“父表”中。
在您的情況下,“父表”
Grades
將是Class_Enrolement
.alter table class_enrollment add ( overall_grade number );