簡體   English   中英

外鍵作為主鍵?

[英]Foreign key as primary key?

我目前有 2 張表STUDENTSSUBJECTS 我需要為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 keyprimary 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM