Postgresql

關於外鍵和多對多關係的問題

  • November 1, 2018

我的問題本質上是概念性的。我有一個數據庫模式,它涉及 School 表和 Student 表之間的多對多關係。考慮到一個學校可以有很多學生,一個學生可以上很多學校,這對我來說似乎是明智的。我不知道是否將學校作為外鍵包含在資訊層次結構中學生表正下方的表中(行為、出勤、成績)。

簡而言之,學校和學生之間的多對多關係允許在出勤表中引用的學生可能會在連結的學生表中列出多個學校。在查看考勤記錄時,這可能會導致不必要的歧義。(即他們錯過了學校 A 或學校 B 的課程嗎?)我的解決方案很明顯:在 Student 下面的任何表中包含一個 School 外鍵,以明確它們與給定學校的關係。

醜陋的數據流

問題:這似乎不優雅。我是美學家,我希望資訊通過表格流動,而不是跳躍表格。我遇到的一個方便的解決方案是依賴多態關聯,其中傳遞給學生(行為、出勤、成績)下的表的主鍵為學生和學校提供唯一值。不幸的是,SQL 似乎不會容忍這種方法。

有沒有一種解決方案可以讓我在不違反 SQL 規則的情況下享受多態關聯(如下圖所示)提供的明顯合理的數據流,還是我想吃蛋糕? 首選(漂亮)數據流

假設一所學校可以有很多學生,並且一個學生可以上很多學校

..你應該在和之間有一個多對多的關係-實現為單獨的表。(在表中放錯了位置。)我將簡單地命名它:school``student``school_id``student``school_student

CREATE TABLE school_student (
  school_student_id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY  
, school_id  int NOT NULL REFERENCES school
, student_id int NOT NULL REFERENCES student
, ...
);

然後school_student_id在表格behaviorattendance.

或者,您可以使用多列 PK並作為 FK(school_id, student_id)繼續使用(school_id, student_id)- 有效地實現您的想法 - 使用標準 SQL。像:

CREATE TABLE school_student (
, school_id  int NOT NULL REFERENCES school
, student_id int NOT NULL REFERENCES student
, ...
, PRIMARY KEY (school_id, student_id)
);

不需要那個 for grade,因為它已經引用了 a 的course綁定school。但是您可能會實施一些措施來加強誠信,以便學生只能在他們就讀的學校參加課程。如果您用作 FK,則可以自動強制執行 -對 table 中的兩個(school_id, student_id)FK 使用單個副本。school_id``grade

有關的:

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