Oracle

如何在數據庫規範化期間防止空外鍵?

  • May 30, 2018

我對數據庫相當陌生,並且很難弄清楚如何建構我的數據庫。該數據庫包含學生、班級和他們所有的整體和類別成績(例如測試、家庭作業等)

到目前為止,我已經創建了以下表格:

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(或 a MATERIALIZED VIEW)中。

但是,由於教師可以覆蓋計算值,因此您需要將摘要儲存在“父表”中。

在您的情況下,“父表”Grades將是Class_Enrolement.

alter table class_enrollment add ( overall_grade  number );

引用自:https://dba.stackexchange.com/questions/208239