文章目錄
- 資料庫設計
- 1. 物體
- 2. 關系
- 2.1 一對一關系
- 2.2 一對多關系
- 2.3 多對多關系
資料庫面試中經常被問到某專案中的資料庫如何設計的?
實際上并不是讓你回答設計的程序,而是注重考察表的結構,回答該專案具體有幾張表,每個表是做什么的,每張表中有哪些列,分別都是什么型別,代表了什么含義,有什么約束等等,這節我們詳細講一下資料庫的設計問題,
資料庫設計
我們采用一個案例來進行說明,假設現在需要設計一個教務系統來管理里很多的學生和班級,
1. 物體
物體:需求場景中的核心概念 / 重要名詞,
對于教務系統來說,物體包含學生和班級,
2. 關系
關系:指的是物體與物體之間的關系,分別是一對一關系,一對多關系以及多對多關系,
Q:如何區分物體物體之間的關系?
A:造句,比如:
一對一關系:一個用戶從屬于一個學生,一個學生也只能擁有一個用戶號,
一對多關系:一個學生從屬于一個班級,但一個班級可以包含多個學生,
多對多關系:一個學生可以選多門課程,一個課程也可以被多名學生來選,
2.1 一對一關系
一對一關系是最簡單的,可以采取以下幾種方法來實作:
- 直接把兩個物體資料放在一張表中即可,即用戶表和學生表拼成一個大表;
- 在用戶表中帶有一個“學生id”欄位,通過學生id欄位的值和學生表關聯起來;
- 在學生表中帶有一個“用戶id”欄位,通過用戶id欄位的值和用戶表關聯起來;
2.2 一對多關系
對于一對多關系來講,也有多種做法來關聯資料:
- 給班級表中加一個欄位students_id,students_id欄位包含若干學生的id;
| class[表名] | classId | className | students_id |
|---|---|---|---|
| 1 | 高三一班 | 1,2,3,4,5 | |
| 2 | 高三二班 | 6,7,8,9,10 | |
| … | … | … |
| student[表名] | studentId | studentName |
|---|---|---|
| 1 | 張三 | |
| 2 | 李四 | |
| … | … |
此時根據班級表中的studentId這一列,就可以查詢到當前班級包含了哪些學生,但是這種做法,對于MySQL這樣的關系型資料庫來說,不是很合適,
我們仔細看一下班級表中的studens_id欄位,這一個欄位需要表示多個值,顯然陣列是可以實作,但是MySQL里沒有陣列這樣的資料型別哎,這就很麻煩了,所以我們看第二種方法,
- 給學生表中加一個欄位record,表示該學生所從屬的班級;
| class[表名] | classId | className |
|---|---|---|
| 1 | 高三一班 | |
| 2 | 高三二班 | |
| … | … |
| student[表名] | studentId | studentName | classId |
|---|---|---|---|
| 1 | 張三 | 1 | |
| 2 | 李四 | 1 | |
| … | … | … |
此時,我們可以根據學生表中的classId這一列,查詢某個學生從屬于哪個班級,這種做法更加簡單高效,
2.3 多對多關系
對于多對多的關系,往往需要使用一個中間表來表示,
| student[表名] | studentId | studentName |
|---|---|---|
| 1 | 張三 | |
| 2 | 李四 | |
| … | … |
| course[表名] | courseId | courseName |
|---|---|---|
| 1 | 語文 | |
| 2 | 數學 | |
| … | … |
如果想要實作 [張三選擇語文數學,李四選擇數學] 這樣的關系,僅僅靠學生表和課程表是無法實作的,此時需要引入一個中間表sutdent-course,
| srudent-course[表名] | studentId | courseId |
|---|---|---|
| 1 | 1 | |
| 1 | 2 | |
| 2 | 2 | |
| … | … |
這張表第一行表示學號為1的學生選了課程號為1的課程,而學號和課程號又可以分別在學生表和課程表中查詢,由此就實作了多對多的關系,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/300206.html
標籤:其他
