[英]Foreign key as primary key?
我目前有 2 張表STUDENTS
和SUBJECTS
。 我需要為ENROLLMENTS
創建另一個表,問題是在該表中我需要知道最低出勤率,這既取決於學生(如果他有工作,它會更低)和學科(每個學科都有一個基礎出席人數最少)。 我應該創建另一個像MINIMAL_ATTENDACE
這樣的表來保存每個主題的基本最低出勤率嗎? 如果是這樣,該表中的主鍵也是SUBJECTS
的主鍵是否很好?
例如我有:
--STUDENTS--
ID NAME HIRED
1 Paul 1
--SUBJECTS--
ID NAME NUMBER_OF_TESTS M_ATTENDANCE
1 Math 2 10
--ENROLLMENTS--
ID STUDID SUBID M_ATTENDANCE
1 1 1 7 (Because Student is hired)
如果問題像您描述的那樣簡單,那么如果主題有兩個最少的出席率就足夠了,即。 一份給有工作的學生,一份給沒有工作的學生。
您可以在單個列上使用多個約束。 顯然,STUDENT 和 SUBJECT 之間存在多對多的關系。 實現這一點的一種可能方法(使用 SQL)是“交叉”或“橋”表。 您可以使用復合 PK 和外鍵約束,如下所示:
演示 ( dbfiddle )
-- parent tables (and test data)
create table students (id primary key, name, hired)
as
select 1, 'Paul', 1 from dual union all
select 2, 'Maggie', 1 from dual union all
select 3, 'Herbert', 0 from dual ;
create table subjects (id primary key, name, number_of_tests, attendance_standard, attendance_hired)
as
select 100, 'Maths', 2, 10, 7 from dual union all
select 200, 'Biology', 3, 12, 8 from dual union all
select 300, 'Physics' 2, 10, 8 from dual ;
-- intersection
create table enrollments(
studentid number references students( id )
, subjectid number references subjects( id )
, constraint enrollments_pk primary key( studentid, subjectid )
) ;
-- test data for the "intersection" table:
-- every student needs to complete every subject
insert into enrollments
select S.id, SUB.id
from students S cross join subjects SUB ;
在示例(上面)中,我們假設 {1}“hired”屬性屬於 STUDENT,{2}不同的“attendance”屬性是 SUBJECT 的屬性。
您現在只需加入 3 個表格,並使用下面的查詢找到每個學生所需的出勤率。
-- Get the attendance requirements for each student & their chosen subject
select
S.name, S.hired
, SUB.name
, case
when S.hired = 1 then SUB.attendance_hired
else SUB.attendance_standard
end as attendance_required
from students S
join enrollments E on S.id = E.studentid
join subjects SUB on SUB.id = E.subjectid
;
-- output
NAME HIRED NAME ATTENDANCE_REQUIRED
Paul 1 Maths 7
Maggie 1 Maths 7
Herbert 0 Maths 10
Paul 1 Biology 8
Maggie 1 Biology 8
Herbert 0 Biology 12
Paul 1 Physics 8
Maggie 1 Physics 8
Herbert 0 Physics 10
如果學生的“雇用”狀態在一個學年(或學期)內可能發生變化,您可能需要添加更多實體(以及隨后:表格)來跟蹤每個學生的雇用 state 變化。
您可以有一個primary key
也可以有一個foreign key
,以強制執行第二個表沒有第一個表中缺少的元素的規則。 但是,以這種方式混合foreign key
和primary key
通常是一個壞主意,因為您的規則可能會改變。 習慣上將復合primary key
的字段同時作為foreign key
,特別是在多對多表中,但除非您擔心存儲空間,否則您可能希望在單獨的字段上創建foreign key
,因此您將如果您的規則發生變化,則不必擔心。
但是,您打算存儲的內容可以通過聚合計算,您不一定需要單獨的table
。 您只需group by
select min
分組。 如果這樣更好,您也可以創建一個view
,或者,如果主table
上的更改頻繁,那么您可以考慮創建一個materialized view
。
是的你可以,
包含以下字段的最少出勤表
Id 主鍵 Sub_id 來自主題表的外鍵 Minimum_attendace
表 STUDENTS SUBJECTS ENROLLMENTS Students_Enrollments
在表 ENROLLMENTS 中添加字段為 MINIMAL_ATTENDACE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.