簡體   English   中英

連接3個表獲得1個表的性能MYSQL

[英]Joining 3 tables was 1 table performance MYSQL

在學校管理系統中,我們需要為每個學生的每個科目合並3個學期的成績。

經過討論,我提出了兩種解決方案。

解決方案1

每學期創建3張桌子。 (gradeSemester1,gradeSemester2,gradeSemester3)

解決方案2

創建1個名為semesterGrades的表,並使用類型處理所有3個學期。

解決方案1的原因是停止數據復制。 例如,如果一個學生有8個科目。 它只能在一個表中包含8條記錄,而在解決方案2中,該表最多可以包含一個學生的24條記錄。

當性能成為主要關注點時,最佳解決方案是什么? 為什么解決方案2更好?

您不想根據數據更改數據庫結構,因此在需要新學期時創建新表是不好的設計。 您只需要一張額外的表格即可存儲成績。 但是,我個人不會將它們存儲在列中,而是存儲在行中,以使其更加靈活(也許某天您想要的不僅僅是3個學期的成績)。

該表將如下所示:

ID | StudentID | SemesterID | SubjectID | Grade

這種方法的另一個優點是您知道年級屬於哪個學期。 如果您的成績有3列,那么您只會知道成績,但沒有關於該學期的信息(我猜他可能需要超過3個學期)。

我也不用擔心這種方法的性能。 您將不得不將表連接在一起,但是要設置適當的索引,這不應該成為問題。

與單選連接相比,連接表的開銷要大得多,因為在連接中要選擇一個,然后配對以創建一個巨大的表。

為什么不解決3:

創建一個包含3列的表格(每學期一個)。 無論如何,這實際上就是您的聯接每次都會執行的操作。 有什么理由將它們分開嗎?

編輯(解釋):除非我誤會了某些東西...

該表中的單行將學生與某個科目相關聯,並且可以包含三列(每個學期級一列)。 假設您有一張學生桌,另一張學科桌。 該表中包含三個學期的成績仍將標准化。

TABLE
----------------------
student_id
subject_id
semester1grade
semester2grade
semester3grade

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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